(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2022, 2025 3NSoft Inc.

 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.

 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.

 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.exposeConnectivityCAP = exposeConnectivityCAP;
exports.makeConnectivity = makeConnectivity;
const ipc_1 = require("core-3nweb-client-lib/build/ipc");
function exposeConnectivityCAP(cap) {
    return {
        isOnline: ipc_1.serviceSideJSONWrap.wrapReqReplySrvMethod(cap, 'isOnline'),
        watch: ipc_1.serviceSideJSONWrap.wrapObservingFunc(cap.watch)
    };
}
function makeConnectivity(caller, objPath) {
    return {
        isOnline: ipc_1.callerSideJSONWrap.makeReqRepObjCaller(caller, objPath, 'isOnline'),
        watch: ipc_1.callerSideJSONWrap.makeObservableFuncCaller(caller, objPath.concat('watch'))
    };
}
Object.freeze(exports);

},{"core-3nweb-client-lib/build/ipc":62}],2:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2024 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.setSelectDisplayMediaForCaptureHandler = void 0;
const ipc_1 = require("core-3nweb-client-lib/build/ipc");
const protobuf_msg_1 = require("../../lib-common/protobuf-msg");
const common_proto_1 = require("../../protos/common.proto");
var setSelectDisplayMediaForCaptureHandler;
(function (setSelectDisplayMediaForCaptureHandler) {
    const reqType = protobuf_msg_1.ProtoType.for(common_proto_1.common.ObjectReference);
    function expose(fn, callerToClient) {
        return buf => {
            const ref = reqType.unpack(buf);
            const promise = fn(ipc_1.callerSideJSONWrap.makeReqRepFuncCaller(callerToClient, ref.path));
            return { promise };
        };
    }
    setSelectDisplayMediaForCaptureHandler.expose = expose;
    function makeClient(caller, objPath, expServices) {
        return async (handler) => {
            const expFn = ipc_1.serviceSideJSONWrap.wrapReqReplyFunc(undefined, handler);
            const ref = expServices.exposeStaticService('JsonCallFn', expFn);
            await caller.startPromiseCall(objPath, reqType.pack(ref));
        };
    }
    setSelectDisplayMediaForCaptureHandler.makeClient = makeClient;
})(setSelectDisplayMediaForCaptureHandler || (exports.setSelectDisplayMediaForCaptureHandler = setSelectDisplayMediaForCaptureHandler = {}));

},{"../../lib-common/protobuf-msg":23,"../../protos/common.proto":27,"core-3nweb-client-lib/build/ipc":62}],3:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2024 - 2025 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.makeMediaDevices = makeMediaDevices;
exports.promiseMediaDevices = promiseMediaDevices;
const ipc_1 = require("core-3nweb-client-lib/build/ipc");
const handler_caps_ipc_1 = require("./handler-caps-ipc");
function makeMediaDevices(caller, mediaDevPath, expServices) {
    if (!caller.listObj) {
        throw new Error(`Caller here expects to have method 'listObj'`);
    }
    const media = mediaDevicesNonOptinalPart(caller, mediaDevPath);
    const lstMediaDeviceCAP = caller.listObj(mediaDevPath);
    addHandlerSetters(caller, expServices, media, mediaDevPath, lstMediaDeviceCAP);
    return media;
}
async function promiseMediaDevices(caller, mediaDevPath, expServices) {
    if (!caller.listObjAsync) {
        throw new Error(`Caller here expects to have method 'listObjAsync'`);
    }
    const media = mediaDevicesNonOptinalPart(caller, mediaDevPath);
    const lstMediaDeviceCAP = (await caller.listObjAsync(mediaDevPath));
    addHandlerSetters(caller, expServices, media, mediaDevPath, lstMediaDeviceCAP);
    return media;
}
function mediaDevicesNonOptinalPart(caller, objPath) {
    return {
        isAudioCaptureAvailable: ipc_1.callerSideJSONWrap.makeReqRepObjCaller(caller, objPath, 'isAudioCaptureAvailable'),
        ensureDeviceAllowsScreenCapture: ipc_1.callerSideJSONWrap.makeReqRepObjCaller(caller, objPath, 'ensureDeviceAllowsScreenCapture')
    };
}
function addHandlerSetters(caller, expServices, media, mediaDevPath, lst) {
    if (lst.includes('setSelectDisplayMediaForCaptureHandler')) {
        media.setSelectDisplayMediaForCaptureHandler = handler_caps_ipc_1.setSelectDisplayMediaForCaptureHandler.makeClient(caller, mediaDevPath.concat('setSelectDisplayMediaForCaptureHandler'), expServices);
    }
}

},{"./handler-caps-ipc":2,"core-3nweb-client-lib/build/ipc":62}],4:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2022 - 2023, 2026 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.capViaRPC = exports.otherAppsRPC = exports.thisAppRPC = void 0;
const ipc_1 = require("core-3nweb-client-lib/build/ipc");
const rxjs_1 = require("rxjs");
const operators_1 = require("rxjs/operators");
const protobuf_msg_1 = require("../../lib-common/protobuf-msg");
const rpc_proto_1 = require("../../protos/rpc.proto");
const passed_datum_1 = require("./passed-datum");
var thisAppRPC;
(function (thisAppRPC) {
    const reqType = protobuf_msg_1.ProtoType.for(rpc_proto_1.rpc.AppRPCRequestBody);
    function expose(fn, expServices) {
        return buf => {
            const { service } = reqType.unpack(buf);
            const promise = fn(service)
                .then(c => {
                const ref = rpcConnection.expose(c, expServices);
                return protobuf_msg_1.objRefType.pack(ref);
            });
            return { promise };
        };
    }
    thisAppRPC.expose = expose;
    function makeClient(caller, objPath) {
        return service => caller
            .startPromiseCall(objPath, reqType.pack({ service }))
            .then(buf => {
            const ref = protobuf_msg_1.objRefType.unpack(buf);
            return rpcConnection.makeCaller(caller, ref);
        });
    }
    thisAppRPC.makeClient = makeClient;
})(thisAppRPC || (exports.thisAppRPC = thisAppRPC = {}));
var otherAppsRPC;
(function (otherAppsRPC) {
    const reqType = protobuf_msg_1.ProtoType.for(rpc_proto_1.rpc.OtherAppsRPCRequestBody);
    function expose(fn, expServices) {
        return buf => {
            const { appDomain, service } = reqType.unpack(buf);
            const promise = fn(appDomain, service)
                .then(c => {
                const ref = rpcConnection.expose(c, expServices);
                return protobuf_msg_1.objRefType.pack(ref);
            });
            return { promise };
        };
    }
    otherAppsRPC.expose = expose;
    function makeClient(caller, objPath) {
        return (appDomain, service) => caller
            .startPromiseCall(objPath, reqType.pack({ appDomain, service }))
            .then(buf => {
            const ref = protobuf_msg_1.objRefType.unpack(buf);
            return rpcConnection.makeCaller(caller, ref);
        });
    }
    otherAppsRPC.makeClient = makeClient;
})(otherAppsRPC || (exports.otherAppsRPC = otherAppsRPC = {}));
var capViaRPC;
(function (capViaRPC) {
    function expose(fn, expServices) {
        return buf => {
            const promise = fn()
                .then(c => {
                const ref = rpcConnection.expose(c, expServices);
                return protobuf_msg_1.objRefType.pack(ref);
            });
            return { promise };
        };
    }
    capViaRPC.expose = expose;
    function makeClient(caller, objPath) {
        return () => caller
            .startPromiseCall(objPath, undefined)
            .then(buf => {
            const ref = protobuf_msg_1.objRefType.unpack(buf);
            return rpcConnection.makeCaller(caller, ref);
        });
    }
    capViaRPC.makeClient = makeClient;
})(capViaRPC || (exports.capViaRPC = capViaRPC = {}));
var rpcConnection;
(function (rpcConnection) {
    function expose(c, expServices) {
        const exp = {
            close: close.wrapService(c.close),
            makeRequestReplyCall: makeRequestReplyCall.wrapService(c.makeRequestReplyCall, expServices),
            startObservableCall: startObservableCall.wrapService(c.startObservableCall, expServices)
        };
        return expServices.exposeDroppableService('RPCConnection', exp, c);
    }
    rpcConnection.expose = expose;
    function makeCaller(caller, ref) {
        (0, ipc_1.checkRefObjTypeIs)('RPCConnection', ref);
        return {
            close: close.makeCaller(caller, ref.path),
            makeRequestReplyCall: makeRequestReplyCall.makeCaller(caller, ref.path),
            startObservableCall: startObservableCall.makeCaller(caller, ref.path)
        };
    }
    rpcConnection.makeCaller = makeCaller;
    const callStartType = protobuf_msg_1.ProtoType.for(rpc_proto_1.rpc.CallStartRequestBody);
    let close;
    (function (close) {
        function wrapService(fn) {
            return () => {
                const promise = fn();
                return { promise };
            };
        }
        close.wrapService = wrapService;
        function makeCaller(caller, objPath) {
            const path = objPath.concat('close');
            return () => caller
                .startPromiseCall(path, undefined);
        }
        close.makeCaller = makeCaller;
    })(close || (close = {}));
    Object.freeze(close);
    let makeRequestReplyCall;
    (function (makeRequestReplyCall) {
        function wrapService(fn, expServices) {
            return buf => {
                const { method, req } = callStartType.unpack(buf);
                const promise = fn(method, (0, passed_datum_1.datumFromSerialFormOnCoreSide)(req, expServices))
                    .then(d => (0, passed_datum_1.packDatumOnCoreSide)(d, expServices));
                return { promise };
            };
        }
        makeRequestReplyCall.wrapService = wrapService;
        function makeCaller(caller, objPath) {
            const path = objPath.concat('makeRequestReplyCall');
            return async (method, req) => {
                const reqBuf = callStartType.pack({
                    method, req: (0, passed_datum_1.datumToSerialFormOnClientSide)(req, caller)
                });
                const repBuf = await caller.startPromiseCall(path, reqBuf);
                return (0, passed_datum_1.unpackDatumOnClientSide)(repBuf, caller);
            };
        }
        makeRequestReplyCall.makeCaller = makeCaller;
    })(makeRequestReplyCall || (makeRequestReplyCall = {}));
    Object.freeze(makeRequestReplyCall);
    let startObservableCall;
    (function (startObservableCall) {
        function wrapService(fn, expServices) {
            return buf => {
                const { method, req } = callStartType.unpack(buf);
                const s = new rxjs_1.Subject();
                const obs = s.asObservable()
                    .pipe((0, operators_1.map)(d => (0, passed_datum_1.packDatumOnCoreSide)(d, expServices)));
                const onCancel = fn(method, (0, passed_datum_1.datumFromSerialFormOnCoreSide)(req, expServices), s);
                return { obs, onCancel };
            };
        }
        startObservableCall.wrapService = wrapService;
        function makeCaller(caller, objPath) {
            const path = objPath.concat('startObservableCall');
            return (method, req, obs) => {
                const s = new rxjs_1.Subject();
                const unsub = caller.startObservableCall(path, callStartType.pack({ method, req }), s);
                s.subscribe({
                    next: buf => {
                        if (obs.next) {
                            obs.next((0, passed_datum_1.unpackDatumOnClientSide)(buf, caller));
                        }
                    },
                    complete: obs.complete,
                    error: obs.error
                });
                return unsub;
            };
        }
        startObservableCall.makeCaller = makeCaller;
    })(startObservableCall || (startObservableCall = {}));
    Object.freeze(startObservableCall);
})(rpcConnection || (rpcConnection = {}));
Object.freeze(rpcConnection);
Object.freeze(exports);

},{"../../lib-common/protobuf-msg":23,"../../protos/rpc.proto":30,"./passed-datum":7,"core-3nweb-client-lib/build/ipc":62,"rxjs":95,"rxjs/operators":320}],5:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2022 - 2023, 2026 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.provideCAPViaRPC = exports.exposeService = void 0;
const ipc_1 = require("core-3nweb-client-lib/build/ipc");
const rxjs_1 = require("rxjs");
const operators_1 = require("rxjs/operators");
const protobuf_msg_1 = require("../../lib-common/protobuf-msg");
const protobuf_msg_2 = require("../../lib-common/protobuf-msg");
const rpc_proto_1 = require("../../protos/rpc.proto");
const passed_datum_1 = require("./passed-datum");
var exposeService;
(function (exposeService) {
    const reqType = protobuf_msg_2.ProtoType.for(rpc_proto_1.rpc.ExposeSrvRequestBody);
    function expose(fn, expServices) {
        return buf => {
            const { service } = reqType.unpack(buf);
            const s = new rxjs_1.Subject();
            const obs = s.asObservable().pipe((0, operators_1.map)(c => {
                const ref = connection.expose(c, expServices);
                return protobuf_msg_1.objRefType.pack(ref);
            }));
            const onCancel = fn(service, s);
            return { obs, onCancel };
        };
    }
    exposeService.expose = expose;
    function makeClient(caller, objPath) {
        return (service, obs) => {
            const s = new rxjs_1.Subject();
            const unsub = caller.startObservableCall(objPath, reqType.pack({ service }), s);
            s.subscribe({
                next: buf => {
                    if (obs.next) {
                        const ref = protobuf_msg_1.objRefType.unpack(buf);
                        obs.next(connection.makeCaller(caller, ref));
                    }
                },
                complete: obs.complete,
                error: obs.error
            });
            return unsub;
        };
    }
    exposeService.makeClient = makeClient;
})(exposeService || (exports.exposeService = exposeService = {}));
Object.freeze(exposeService);
exports.provideCAPViaRPC = exposeService;
var connection;
(function (connection) {
    function expose(c, expServices) {
        const exp = makeExposedObjForIncomingConnection(c, expServices);
        return expServices.exposeDroppableService('IncomingConnection', exp, c);
    }
    connection.expose = expose;
    function makeCaller(caller, ref) {
        (0, ipc_1.checkRefObjTypeIs)('IncomingConnection', ref);
        return {
            close: close.makeCaller(caller, ref.path),
            send: send.makeCaller(caller, ref.path),
            watch: watch.makeCaller(caller, ref.path)
        };
    }
    connection.makeCaller = makeCaller;
    function makeExposedObjForIncomingConnection(c, expServices) {
        return {
            close: close.wrapService(c.close),
            send: send.wrapService(c.send, expServices),
            watch: watch.wrapService(c.watch, expServices)
        };
    }
    let close;
    (function (close) {
        function wrapService(fn) {
            return () => {
                const promise = fn();
                return { promise };
            };
        }
        close.wrapService = wrapService;
        function makeCaller(caller, objPath) {
            const path = objPath.concat('close');
            return () => caller
                .startPromiseCall(path, undefined);
        }
        close.makeCaller = makeCaller;
    })(close || (close = {}));
    Object.freeze(close);
    let send;
    (function (send) {
        const msgType = protobuf_msg_2.ProtoType.for(rpc_proto_1.rpc.OutgoingMsg);
        function wrapService(fn, expServices) {
            return buf => {
                const msg = unpackMsg(buf, expServices);
                const promise = fn(msg);
                return { promise };
            };
        }
        send.wrapService = wrapService;
        function makeCaller(caller, objPath) {
            const path = objPath.concat('send');
            return msg => caller
                .startPromiseCall(path, packMsg(msg, caller));
        }
        send.makeCaller = makeCaller;
        function packMsg(msg, caller) {
            if (msg.err) {
                msg.err = (0, protobuf_msg_1.errToMsg)(msg.err);
            }
            else {
                msg.data = (0, passed_datum_1.datumToSerialFormOnClientSide)(msg.data, caller);
            }
            return msgType.pack(msg);
        }
        function unpackMsg(buf, expServices) {
            const msg = msgType.unpack(buf);
            if (msg.err) {
                msg.err = (0, protobuf_msg_1.errFromMsg)(msg.err);
            }
            else {
                msg.data = (0, passed_datum_1.datumFromSerialFormOnCoreSide)(msg.data, expServices);
            }
            return msg;
        }
    })(send || (send = {}));
    Object.freeze(send);
    let watch;
    (function (watch) {
        const msgType = protobuf_msg_2.ProtoType.for(rpc_proto_1.rpc.IncomingMsg);
        function wrapService(fn, expServices) {
            return () => {
                const s = new rxjs_1.Subject();
                const obs = s.asObservable().pipe((0, operators_1.map)(msg => {
                    if (msg.msgType === 'start') {
                        msg.data = (0, passed_datum_1.datumToSerialFormOnCoreSide)(msg.data, expServices);
                    }
                    return msgType.pack(msg);
                }));
                const onCancel = fn(s);
                return { obs, onCancel };
            };
        }
        watch.wrapService = wrapService;
        function makeCaller(caller, objPath) {
            const path = objPath.concat('watch');
            return obs => {
                const s = new rxjs_1.Subject();
                const unsub = caller.startObservableCall(path, undefined, s);
                s.subscribe({
                    next: buf => {
                        if (obs.next) {
                            const msg = msgType.unpack(buf);
                            if (msg.msgType === 'start') {
                                msg.data = (0, passed_datum_1.datumFromSerialFormOnClientSide)(msg.data, caller);
                            }
                            obs.next(msg);
                        }
                    },
                    complete: obs.complete,
                    error: obs.error
                });
                return unsub;
            };
        }
        watch.makeCaller = makeCaller;
    })(watch || (watch = {}));
    Object.freeze(watch);
})(connection || (connection = {}));
Object.freeze(connection);
Object.freeze(exports);

},{"../../lib-common/protobuf-msg":23,"../../protos/rpc.proto":30,"./passed-datum":7,"core-3nweb-client-lib/build/ipc":62,"rxjs":95,"rxjs/operators":320}],6:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2023, 2026 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.makeRpcCaller = makeRpcCaller;
exports.promiseRpcCaller = promiseRpcCaller;
const client_caps_ipc_1 = require("./client-caps-ipc");
const expose_service_cap_ipc_1 = require("./expose-service-cap-ipc");
const service_powered_caps_1 = require("../service-powered-caps");
function makeRpcCaller(caller, objPath) {
    if (!caller.listObj) {
        throw new Error(`Caller here expects to have method 'listObj'`);
    }
    const lstAppsCAP = caller.listObj(objPath);
    return makeRpcFollowingListing(lstAppsCAP, caller, objPath);
}
async function promiseRpcCaller(caller, objPath) {
    if (!caller.listObjAsync) {
        throw new Error(`Caller here expects to have method 'listObjAsync'`);
    }
    const lstRpcCAP = (await caller.listObjAsync(objPath));
    return makeRpcFollowingListing(lstRpcCAP, caller, objPath);
}
function makeRpcFollowingListing(lstRpcCAP, caller, objPath) {
    const rpc = {};
    if (lstRpcCAP.includes('thisApp')) {
        rpc.thisApp = client_caps_ipc_1.thisAppRPC.makeClient(caller, objPath.concat('thisApp'));
    }
    if (lstRpcCAP.includes('otherAppsRPC')) {
        rpc.otherAppsRPC = client_caps_ipc_1.otherAppsRPC.makeClient(caller, objPath.concat('otherAppsRPC'));
    }
    if (lstRpcCAP.includes('exposeService')) {
        rpc.exposeService = expose_service_cap_ipc_1.exposeService.makeClient(caller, objPath.concat('exposeService'));
    }
    if (lstRpcCAP.includes('provideCAPtoSystem')) {
        const capRPC = expose_service_cap_ipc_1.provideCAPViaRPC.makeClient(caller, objPath.concat('provideCAPtoSystem'));
        rpc.provideCAPtoSystem = (0, service_powered_caps_1.makeProviderOfCAPsViaRPC)(capRPC);
    }
    return rpc;
}
Object.freeze(exports);

},{"../service-powered-caps":8,"./client-caps-ipc":4,"./expose-service-cap-ipc":5}],7:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2022 - 2023 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.datumType = void 0;
exports.datumFromSerialFormOnCoreSide = datumFromSerialFormOnCoreSide;
exports.datumToSerialFormOnCoreSide = datumToSerialFormOnCoreSide;
exports.packDatumOnCoreSide = packDatumOnCoreSide;
exports.datumToSerialFormOnClientSide = datumToSerialFormOnClientSide;
exports.datumFromSerialFormOnClientSide = datumFromSerialFormOnClientSide;
exports.unpackDatumOnClientSide = unpackDatumOnClientSide;
const ipc_1 = require("core-3nweb-client-lib/build/ipc");
const protobuf_msg_1 = require("../../lib-common/protobuf-msg");
const rpc_proto_1 = require("../../protos/rpc.proto");
exports.datumType = protobuf_msg_1.ProtoType.for(rpc_proto_1.rpc.PassedDatum);
function datumFromSerialFormOnCoreSide(datum, expServices) {
    if (!datum) {
        return;
    }
    const { bytes, passedObjs } = datum;
    if (!passedObjs || (passedObjs.length === 0)) {
        return ((bytes && (bytes.length > 0)) ? { bytes } : undefined);
    }
    else {
        return {
            bytes: ((bytes && (bytes.length > 0)) ? bytes : undefined),
            passedByReference: passedObjs.map(({ ref }) => expServices.getObjForTransfer(ref))
        };
    }
}
function datumToSerialFormOnCoreSide(datum, expServices) {
    if (!(datum === null || datum === void 0 ? void 0 : datum.passedByReference)) {
        return datum;
    }
    const { bytes, passedByReference } = datum;
    if (passedByReference.length === 0) {
        return { bytes };
    }
    return {
        bytes,
        passedObjs: passedByReference.map(({ o, type }) => {
            const ref = expServices.findRefIfAlreadyExposed(o);
            if (ref) {
                return { ref };
            }
            return exposeTransferable(type, o, expServices);
        })
    };
}
function packDatumOnCoreSide(datum, expServices) {
    return (datum ?
        exports.datumType.pack(datumToSerialFormOnCoreSide(datum, expServices)) :
        undefined);
}
function exposeTransferable(type, o, expServices) {
    switch (type) {
        case 'FSImpl':
            return { fs: (0, ipc_1.exposeFSService)(o, expServices) };
        case 'FileImpl':
            return { file: (0, ipc_1.exposeFileService)(o, expServices) };
        case 'FileByteSource':
            return { ref: (0, ipc_1.exposeSrcService)(o, expServices) };
        case 'FileByteSink':
            return { ref: (0, ipc_1.exposeSinkService)(o, expServices) };
        default:
            throw Error(`Can't transfer object of type ${type}`);
    }
}
function datumToSerialFormOnClientSide(datum, caller) {
    if (!(datum === null || datum === void 0 ? void 0 : datum.passedByReference)) {
        return datum;
    }
    const { bytes, passedByReference } = datum;
    if (!passedByReference || (passedByReference.length === 0)) {
        return ((bytes && (bytes.length > 0)) ? { bytes } : undefined);
    }
    else {
        return {
            bytes: ((bytes && (bytes.length > 0)) ? bytes : undefined),
            passedObjs: passedByReference.map(o => ({ ref: caller.srvRefOf(o) }))
        };
    }
}
function datumFromSerialFormOnClientSide(datum, caller) {
    if (!datum) {
        return;
    }
    const { bytes, passedObjs } = datum;
    if (!passedObjs || (passedObjs.length === 0)) {
        return ((bytes && (bytes.length > 0)) ? { bytes } : undefined);
    }
    else {
        return {
            bytes: ((bytes && (bytes.length > 0)) ? bytes : undefined),
            passedByReference: passedObjs.map(({ ref, file, fs }) => {
                if (ref) {
                    const found = caller.findCallingObjByRef(ref);
                    if (found === null || found === void 0 ? void 0 : found.obj) {
                        return found.obj;
                    }
                    const reconstructData = found === null || found === void 0 ? void 0 : found.reconstructData;
                    if (reconstructData) {
                        switch (ref.objType) {
                            case 'FSImpl':
                                return (0, ipc_1.makeFSCaller)(caller, reconstructData);
                            case 'FileImpl':
                                return (0, ipc_1.makeFileCaller)(caller, reconstructData);
                            default:
                                throw Error(`Failed to recreate proxy for object type ${ref.objType} from reconstructData`);
                        }
                    }
                    else {
                        switch (ref.objType) {
                            case 'FileByteSource':
                                return (0, ipc_1.makeSrcCaller)(caller, ref);
                            case 'FileByteSink':
                                return (0, ipc_1.makeSinkCaller)(caller, ref);
                            default:
                                throw Error(`Failed to create proxy for object type ${ref.objType} from a reference`);
                        }
                    }
                }
                else if (file) {
                    return (0, ipc_1.makeFileCaller)(caller, file);
                }
                else if (fs) {
                    return (0, ipc_1.makeFSCaller)(caller, fs);
                }
            })
        };
    }
}
function unpackDatumOnClientSide(bytes, caller) {
    return (bytes ?
        datumFromSerialFormOnClientSide(exports.datumType.unpack(bytes), caller) :
        undefined);
}
Object.freeze(exports);

},{"../../lib-common/protobuf-msg":23,"../../protos/rpc.proto":30,"core-3nweb-client-lib/build/ipc":62}],8:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2026 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.makeProviderOfCAPsViaRPC = makeProviderOfCAPsViaRPC;
const file_dialogs_cap_ipc_1 = require("./shell/file-dialogs/file-dialogs-cap-ipc");
function makeProviderOfCAPsViaRPC(exposeViaRPC) {
    return (capName, impl) => {
        function closeApp() {
            w3n === null || w3n === void 0 ? void 0 : w3n.closeSelf();
        }
        switch (capName) {
            case 'w3n.shell.fileDialogs.openFileDialog':
                file_dialogs_cap_ipc_1.openFileDialog.provideServiceOnAppSide(impl, exposeViaRPC, closeApp);
                return;
            case 'w3n.shell.fileDialogs.openFolderDialog':
                file_dialogs_cap_ipc_1.openFolderDialog.provideServiceOnAppSide(impl, exposeViaRPC, closeApp);
                return;
            case 'w3n.shell.fileDialogs.saveFileDialog':
                file_dialogs_cap_ipc_1.saveFileDialog.provideServiceOnAppSide(impl, exposeViaRPC, closeApp);
                return;
            case 'w3n.shell.fileDialogs.saveFolderDialog':
                file_dialogs_cap_ipc_1.saveFolderDialog.provideServiceOnAppSide(impl, exposeViaRPC, closeApp);
                return;
            default:
                throw `Implementation is not found for capability ${capName}`;
        }
    };
}
Object.freeze(exports);

},{"./shell/file-dialogs/file-dialogs-cap-ipc":11}],9:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.exposeClipboardCAP = exposeClipboardCAP;
exports.makeClipboard = makeClipboard;
/*
 Copyright (C) 2025 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
const ipc_1 = require("core-3nweb-client-lib/build/ipc");
function exposeClipboardCAP(cap) {
    const exposed = {};
    for (const method of Object.keys(cap)) {
        exposed[method] = ipc_1.serviceSideJSONWrap.wrapReqReplySrvMethod(cap, method);
    }
    return exposed;
}
function makeClipboard(caller, objPath, exposed) {
    const clipboard = {};
    for (const method of exposed) {
        clipboard[method] = shellClipboardCall(caller, objPath, method);
    }
    return clipboard;
}
function shellClipboardCall(caller, objPath, method) {
    return ipc_1.callerSideJSONWrap.makeReqRepObjCaller(caller, objPath.concat('clipboard'), method);
}

},{"core-3nweb-client-lib/build/ipc":62}],10:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.exposeDeviceFilesCAP = exposeDeviceFilesCAP;
exports.makeDeviceFiles = makeDeviceFiles;
/*
 Copyright (C) 2025 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
const ipc_1 = require("core-3nweb-client-lib/build/ipc");
const file_proto_1 = require("../../../protos/file.proto");
const fs_proto_1 = require("../../../protos/fs.proto");
const protobuf_type_1 = require("core-3nweb-client-lib/build/lib-client/protobuf-type");
const filePbType = protobuf_type_1.ProtoType.for(file_proto_1.file.File);
const fsPbType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.FS);
function exposeDeviceFilesCAP(cap, expServices) {
    const exposed = {
        standardFileToDeviceFile: ipc_1.serviceSideJSONWrap.wrapReqReplySrvMethod(cap, 'standardFileToDeviceFile', {
            packReply: f => filePbType.pack((0, ipc_1.exposeFileService)(f, expServices))
        }),
        standardFileToDeviceFolder: ipc_1.serviceSideJSONWrap.wrapReqReplySrvMethod(cap, 'standardFileToDeviceFolder', {
            packReply: f => fsPbType.pack((0, ipc_1.exposeFSService)(f, expServices))
        }),
        statStandardItem: ipc_1.serviceSideJSONWrap.wrapReqReplySrvMethod(cap, 'statStandardItem')
    };
    return exposed;
}
function makeDeviceFiles(caller, objPath) {
    const devFiles = {
        standardFileToDeviceFile: ipc_1.callerSideJSONWrap.makeReqRepObjCaller(caller, objPath, 'standardFileToDeviceFile', {
            unpackReply: env => (0, ipc_1.makeFileCaller)(caller, filePbType.unpack(env))
        }),
        standardFileToDeviceFolder: ipc_1.callerSideJSONWrap.makeReqRepObjCaller(caller, objPath, 'standardFileToDeviceFolder', {
            unpackReply: env => (0, ipc_1.makeFSCaller)(caller, fsPbType.unpack(env))
        }),
        statStandardItem: ipc_1.callerSideJSONWrap.makeReqRepObjCaller(caller, objPath, 'statStandardItem')
    };
    return devFiles;
}

},{"../../../protos/file.proto":28,"../../../protos/fs.proto":29,"core-3nweb-client-lib/build/ipc":62,"core-3nweb-client-lib/build/lib-client/protobuf-type":63}],11:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2020, 2022, 2026 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.saveFolderDialog = exports.saveFileDialog = exports.openFolderDialog = exports.openFileDialog = void 0;
exports.proxyFileDialogsCAP = proxyFileDialogsCAP;
exports.makeFileDialogs = makeFileDialogs;
const client_caps_ipc_1 = require("../../rpc/client-caps-ipc");
const ipc_service_1 = require("../../../lib-common/service-ipc/ipc-service");
const ipc_service_caller_1 = require("../../../lib-common/service-ipc/ipc-service-caller");
function proxyFileDialogsCAP(cap, expServices) {
    const exposed = {};
    if (cap.openFileDialog) {
        exposed.openFileDialog = client_caps_ipc_1.capViaRPC.expose(cap.openFileDialog, expServices);
    }
    if (cap.openFolderDialog) {
        exposed.openFolderDialog = client_caps_ipc_1.capViaRPC.expose(cap.openFolderDialog, expServices);
    }
    if (cap.saveFileDialog) {
        exposed.saveFileDialog = client_caps_ipc_1.capViaRPC.expose(cap.saveFileDialog, expServices);
    }
    if (cap.saveFolderDialog) {
        exposed.saveFolderDialog = client_caps_ipc_1.capViaRPC.expose(cap.saveFolderDialog, expServices);
    }
    return exposed;
}
function makeFileDialogs(caller, objPath, exposed) {
    const dialogs = {};
    if (exposed.includes('openFileDialog')) {
        dialogs.openFileDialog = openFileDialog.capOnAppSide(caller, objPath.concat('openFileDialog'));
    }
    if (exposed.includes('openFolderDialog')) {
        dialogs.openFolderDialog = openFolderDialog.capOnAppSide(caller, objPath.concat('openFolderDialog'));
    }
    if (exposed.includes('saveFileDialog')) {
        dialogs.saveFileDialog = saveFileDialog.capOnAppSide(caller, objPath.concat('saveFileDialog'));
    }
    if (exposed.includes('saveFolderDialog')) {
        dialogs.saveFolderDialog = saveFolderDialog.capOnAppSide(caller, objPath.concat('saveFolderDialog'));
    }
    return dialogs;
}
var openFileDialog;
(function (openFileDialog) {
    const serviceName = 'w3n.shell.fileDialogs.openFileDialog';
    function provideServiceOnAppSide(fn, exposeViaRPC, closeApp) {
        const srv = new ipc_service_1.SingleConnectionIPCWrap(serviceName, closeApp);
        srv.addReqReplyMethod('open', undefined, fn);
        srv.startIPC(exposeViaRPC);
    }
    openFileDialog.provideServiceOnAppSide = provideServiceOnAppSide;
    function capOnAppSide(caller, objPath) {
        const connect = client_caps_ipc_1.capViaRPC.makeClient(caller, objPath);
        return async (title, btnLabel, multiSelections, filters) => {
            const conn = await connect();
            try {
                const capProxy = (0, ipc_service_caller_1.makeReqRepMethodCaller)(conn, 'open');
                return await capProxy(title, btnLabel, multiSelections, filters);
            }
            finally {
                conn.close();
            }
        };
    }
    openFileDialog.capOnAppSide = capOnAppSide;
})(openFileDialog || (exports.openFileDialog = openFileDialog = {}));
Object.freeze(openFileDialog);
var openFolderDialog;
(function (openFolderDialog) {
    const serviceName = 'w3n.shell.fileDialogs.openFolderDialog';
    function provideServiceOnAppSide(fn, exposeViaRPC, closeApp) {
        const srv = new ipc_service_1.SingleConnectionIPCWrap(serviceName, closeApp);
        srv.addReqReplyMethod('open', undefined, fn);
        srv.startIPC(exposeViaRPC);
    }
    openFolderDialog.provideServiceOnAppSide = provideServiceOnAppSide;
    function capOnAppSide(caller, objPath) {
        const connect = client_caps_ipc_1.capViaRPC.makeClient(caller, objPath);
        return async (title, btnLabel, multiSelections, filters) => {
            const conn = await connect();
            try {
                const capProxy = (0, ipc_service_caller_1.makeReqRepMethodCaller)(conn, 'open');
                return await capProxy(title, btnLabel, multiSelections, filters);
            }
            finally {
                conn.close();
            }
        };
    }
    openFolderDialog.capOnAppSide = capOnAppSide;
})(openFolderDialog || (exports.openFolderDialog = openFolderDialog = {}));
Object.freeze(openFolderDialog);
var saveFileDialog;
(function (saveFileDialog) {
    const serviceName = 'w3n.shell.fileDialogs.saveFileDialog';
    function provideServiceOnAppSide(fn, exposeViaRPC, closeApp) {
        const srv = new ipc_service_1.SingleConnectionIPCWrap(serviceName, closeApp);
        srv.addReqReplyMethod('open', undefined, fn);
        srv.startIPC(exposeViaRPC);
    }
    saveFileDialog.provideServiceOnAppSide = provideServiceOnAppSide;
    function capOnAppSide(caller, objPath) {
        const connect = client_caps_ipc_1.capViaRPC.makeClient(caller, objPath);
        return async (title, btnLabel, defaultPath, filters) => {
            const conn = await connect();
            try {
                const capProxy = (0, ipc_service_caller_1.makeReqRepMethodCaller)(conn, 'open');
                return await capProxy(title, btnLabel, defaultPath, filters);
            }
            finally {
                conn.close();
            }
        };
    }
    saveFileDialog.capOnAppSide = capOnAppSide;
})(saveFileDialog || (exports.saveFileDialog = saveFileDialog = {}));
Object.freeze(openFileDialog);
var saveFolderDialog;
(function (saveFolderDialog) {
    const serviceName = 'w3n.shell.fileDialogs.saveFolderDialog';
    function provideServiceOnAppSide(fn, exposeViaRPC, closeApp) {
        const srv = new ipc_service_1.SingleConnectionIPCWrap(serviceName, closeApp);
        srv.addReqReplyMethod('open', undefined, fn);
        srv.startIPC(exposeViaRPC);
    }
    saveFolderDialog.provideServiceOnAppSide = provideServiceOnAppSide;
    function capOnAppSide(caller, objPath) {
        const connect = client_caps_ipc_1.capViaRPC.makeClient(caller, objPath);
        return async (title, btnLabel, defaultPath, filters) => {
            const conn = await connect();
            try {
                const capProxy = (0, ipc_service_caller_1.makeReqRepMethodCaller)(conn, 'open');
                return await capProxy(title, btnLabel, defaultPath, filters);
            }
            finally {
                conn.close();
            }
        };
    }
    saveFolderDialog.capOnAppSide = capOnAppSide;
})(saveFolderDialog || (exports.saveFolderDialog = saveFolderDialog = {}));
Object.freeze(openFileDialog);
Object.freeze(exports);

},{"../../../lib-common/service-ipc/ipc-service":25,"../../../lib-common/service-ipc/ipc-service-caller":24,"../../rpc/client-caps-ipc":4}],12:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2024 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.makeGetFSResource = exports.exposeGetFSResourceCAP = void 0;
const ipc_1 = require("core-3nweb-client-lib/build/ipc");
const shell_fs_resource_proto_1 = require("../../../protos/shell_fs_resource.proto");
const protobuf_msg_1 = require("../../../lib-common/protobuf-msg");
var getFSResource;
(function (getFSResource) {
    const requestType = protobuf_msg_1.ProtoType.for(shell_fs_resource_proto_1.shell_fs_resource.GetFSResourceRequestBody);
    const replyType = protobuf_msg_1.ProtoType.for(shell_fs_resource_proto_1.shell_fs_resource.GetFSResourceReplyBody);
    function wrapService(fn, expServices) {
        return bytes => {
            const { resourceName, appDomain } = requestType.unpack(bytes);
            const promise = fn((0, protobuf_msg_1.valOfOpt)(appDomain), resourceName)
                .then(item => {
                if (item.listFolder) {
                    return replyType.pack({
                        folder: (0, ipc_1.exposeFSService)(item, expServices)
                    });
                }
                else {
                    return replyType.pack({
                        file: (0, ipc_1.exposeFileService)(item, expServices)
                    });
                }
            });
            return { promise };
        };
    }
    getFSResource.wrapService = wrapService;
    function makeCaller(caller, path) {
        return async (appDomain, resourceName) => {
            if (appDomain === null) {
                appDomain = undefined;
            }
            const req = requestType.pack({
                appDomain: (0, protobuf_msg_1.toOptVal)(appDomain), resourceName
            });
            const buf = await caller.startPromiseCall(path, req);
            const reply = replyType.unpack(buf);
            if (reply.file) {
                return (0, ipc_1.makeFileCaller)(caller, reply.file);
            }
            else if (reply.folder) {
                return (0, ipc_1.makeFSCaller)(caller, reply.folder);
            }
            else {
                throw (0, ipc_1.makeIPCException)({
                    message: `Neither file, nor folder were present in message from another side of ipc`,
                    badReply: true,
                    path
                });
            }
        };
    }
    getFSResource.makeCaller = makeCaller;
})(getFSResource || (getFSResource = {}));
Object.freeze(getFSResource);
exports.exposeGetFSResourceCAP = getFSResource.wrapService;
exports.makeGetFSResource = getFSResource.makeCaller;
Object.freeze(exports);

},{"../../../lib-common/protobuf-msg":23,"../../../protos/shell_fs_resource.proto":31,"core-3nweb-client-lib/build/ipc":62}],13:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2020 - 2026 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.makeShellCaller = makeShellCaller;
exports.promiseShellCaller = promiseShellCaller;
const ipc_1 = require("core-3nweb-client-lib/build/ipc");
const file_dialogs_cap_ipc_1 = require("./file-dialogs/file-dialogs-cap-ipc");
const user_notifications_cap_ipc_1 = require("./user-notifications/user-notifications-cap-ipc");
const fs_resource_caps_ipc_1 = require("./fs-resource/fs-resource-caps-ipc");
const clipboard_cap_ipc_1 = require("./clipboard/clipboard-cap-ipc");
const device_files_cap_ipc_1 = require("./device-files/device-files-cap-ipc");
const mounts_cap_ipc_1 = require("./mounts/mounts-cap-ipc");
function makeShellCaller(caller, objPath) {
    if (!caller.listObj) {
        throw new Error(`Caller here expects to have method 'listObj'`);
    }
    const shellCAPs = caller.listObj(objPath);
    let dialogFns = undefined;
    if (shellCAPs.includes('fileDialogs')) {
        const dialogsPath = objPath.concat('fileDialogs');
        dialogFns = caller.listObj(dialogsPath);
    }
    let clipboardFns = undefined;
    if (shellCAPs.includes('clipboard')) {
        const clipboardPath = objPath.concat('clipboard');
        clipboardFns = caller.listObj(clipboardPath);
    }
    return makeShellFollowingListing(shellCAPs, dialogFns, clipboardFns, caller, objPath);
}
async function promiseShellCaller(caller, objPath) {
    if (!caller.listObjAsync) {
        throw new Error(`Caller here expects to have method 'listObjAsync'`);
    }
    const shellCAPs = (await caller.listObjAsync(objPath));
    let dialogFns = undefined;
    if (shellCAPs.includes('fileDialogs')) {
        const dialogsPath = objPath.concat('fileDialogs');
        dialogFns = (await caller.listObjAsync(dialogsPath));
    }
    let clipboardFns = undefined;
    if (shellCAPs.includes('clipboard')) {
        const clipboardPath = objPath.concat('clipboard');
        clipboardFns = (await caller.listObjAsync(clipboardPath));
    }
    return makeShellFollowingListing(shellCAPs, dialogFns, clipboardFns, caller, objPath);
}
function makeShellFollowingListing(shellCAPs, dialogFns, clipboardFns, caller, objPath) {
    const shell = {};
    if (shellCAPs.includes('fileDialogs')) {
        const dialogsPath = objPath.concat('fileDialogs');
        shell.fileDialogs = (0, file_dialogs_cap_ipc_1.makeFileDialogs)(caller, dialogsPath, dialogFns);
    }
    if (shellCAPs.includes('userNotifications')) {
        const notifPath = objPath.concat('userNotifications');
        shell.userNotifications = (0, user_notifications_cap_ipc_1.makeUserNotifications)(caller, notifPath);
    }
    if (shellCAPs.includes('watchStartCmds')) {
        shell.watchStartCmds = ipc_1.callerSideJSONWrap.makeObservableFuncCaller(caller, objPath.concat('watchStartCmds'));
    }
    if (shellCAPs.includes('getFSResource')) {
        const fnPath = objPath.concat('getFSResource');
        shell.getFSResource = (0, fs_resource_caps_ipc_1.makeGetFSResource)(caller, fnPath);
    }
    if (shellCAPs.includes('clipboard')) {
        const clipboardPath = objPath.concat('clipboard');
        shell.clipboard = (0, clipboard_cap_ipc_1.makeClipboard)(caller, clipboardPath, clipboardFns);
    }
    if (shellCAPs.includes('deviceFiles')) {
        const deviceFilesPath = objPath.concat('deviceFiles');
        shell.deviceFiles = (0, device_files_cap_ipc_1.makeDeviceFiles)(caller, deviceFilesPath);
    }
    if (shellCAPs.includes('mounts')) {
        const mountsPath = objPath.concat('mounts');
        shell.mounts = (0, mounts_cap_ipc_1.makeMounts)(caller, mountsPath);
    }
    [
        'getStartedCmd', 'startAppWithParams', 'openDashboard', 'openURL'
    ].filter(field => shellCAPs.includes(field))
        .forEach(field => {
        shell[field] = ipc_1.callerSideJSONWrap.makeReqRepObjCaller(caller, objPath, field);
    });
    [
        'openFile', 'openFolder', 'openInMounted'
    ].filter(field => shellCAPs.includes(field))
        .forEach(field => {
        shell[field] = ipc_1.callerSideJSONWrap.makeReqRepObjCaller(caller, objPath, field, {
            findRefOf: caller.srvRefOf.bind(caller)
        });
    });
    if (shellCAPs.includes('scanUrlQR')) {
        const scanPath = objPath.concat('scanUrlQR');
        shell.scanUrlQR = ipc_1.callerSideJSONWrap.makeReqRepFuncCaller(caller, scanPath);
    }
    return shell;
}
Object.freeze(exports);

},{"./clipboard/clipboard-cap-ipc":9,"./device-files/device-files-cap-ipc":10,"./file-dialogs/file-dialogs-cap-ipc":11,"./fs-resource/fs-resource-caps-ipc":12,"./mounts/mounts-cap-ipc":14,"./user-notifications/user-notifications-cap-ipc":15,"core-3nweb-client-lib/build/ipc":62}],14:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2026 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.exposeMountsCAP = exposeMountsCAP;
exports.makeMounts = makeMounts;
const ipc_1 = require("core-3nweb-client-lib/build/ipc");
const file_proto_1 = require("../../../protos/file.proto");
const fs_proto_1 = require("../../../protos/fs.proto");
const protobuf_type_1 = require("core-3nweb-client-lib/build/lib-client/protobuf-type");
const filePbType = protobuf_type_1.ProtoType.for(file_proto_1.file.File);
const fsPbType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.FS);
function exposeMountsCAP(cap, expServices) {
    const findReferencedObj = expServices.getOriginalObj.bind(expServices);
    const exposed = {
        mountFile: ipc_1.serviceSideJSONWrap.wrapReqReplySrvMethod(cap, 'mountFile', { findReferencedObj }),
        mountFolder: ipc_1.serviceSideJSONWrap.wrapReqReplySrvMethod(cap, 'mountFolder', { findReferencedObj }),
        unmountPath: ipc_1.serviceSideJSONWrap.wrapReqReplySrvMethod(cap, 'unmountPath'),
        unmountFile: ipc_1.serviceSideJSONWrap.wrapReqReplySrvMethod(cap, 'unmountFile', { findReferencedObj }),
        unmountFolder: ipc_1.serviceSideJSONWrap.wrapReqReplySrvMethod(cap, 'unmountFolder', { findReferencedObj })
    };
    return exposed;
}
function makeMounts(caller, objPath) {
    const mounts = {
        mountFile: ipc_1.callerSideJSONWrap.makeReqRepObjCaller(caller, objPath, 'mountFile', { findRefOf: caller.srvRefOf.bind(caller) }),
        mountFolder: ipc_1.callerSideJSONWrap.makeReqRepObjCaller(caller, objPath, 'mountFolder', { findRefOf: caller.srvRefOf.bind(caller) }),
        unmountPath: ipc_1.callerSideJSONWrap.makeReqRepObjCaller(caller, objPath, 'unmountPath'),
        unmountFile: ipc_1.callerSideJSONWrap.makeReqRepObjCaller(caller, objPath, 'unmountFile', { findRefOf: caller.srvRefOf.bind(caller) }),
        unmountFolder: ipc_1.callerSideJSONWrap.makeReqRepObjCaller(caller, objPath, 'unmountFolder', { findRefOf: caller.srvRefOf.bind(caller) })
    };
    return mounts;
}

},{"../../../protos/file.proto":28,"../../../protos/fs.proto":29,"core-3nweb-client-lib/build/ipc":62,"core-3nweb-client-lib/build/lib-client/protobuf-type":63}],15:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2022, 2025 3NSoft Inc.

 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.

 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.

 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.exposeUserNotificationsCAP = exposeUserNotificationsCAP;
exports.makeUserNotifications = makeUserNotifications;
const ipc_1 = require("core-3nweb-client-lib/build/ipc");
function exposeUserNotificationsCAP(cap, expServices) {
    return {
        addNotification: ipc_1.serviceSideJSONWrap.wrapReqReplySrvMethod(cap, 'addNotification', {
            findReferencedObj: ref => expServices.getOriginalObj(ref)
        }),
        removeNotification: ipc_1.serviceSideJSONWrap.wrapReqReplySrvMethod(cap, 'removeNotification'),
        watch: ipc_1.serviceSideJSONWrap.wrapObservingFunc(obs => cap.watch(obs))
    };
}
function makeUserNotifications(caller, objPath) {
    return {
        addNotification: ipc_1.callerSideJSONWrap.makeReqRepObjCaller(caller, objPath, 'addNotification', { findRefOf: f => caller.srvRefOf(f) }),
        removeNotification: ipc_1.callerSideJSONWrap.makeReqRepObjCaller(caller, objPath, 'removeNotification'),
        watch: ipc_1.callerSideJSONWrap.makeObservableFuncCaller(caller, objPath.concat('watch'))
    };
}
Object.freeze(exports);

},{"core-3nweb-client-lib/build/ipc":62}],16:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2020 - 2026 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.makeSystemCaller = makeSystemCaller;
exports.promiseSystemCaller = promiseSystemCaller;
const ipc_1 = require("core-3nweb-client-lib/build/ipc");
const deferred_1 = require("../../lib-common/processes/deferred");
function makeSystemCaller(caller, sysPath) {
    if (!caller.listObj) {
        throw new Error(`Caller here expects to have method 'listObj'`);
    }
    const lstSystemCAP = caller.listObj(sysPath);
    const lstAppsCAP = (lstSystemCAP.includes('apps') ?
        caller.listObj(sysPath.concat('apps')) : undefined);
    const lstPlatformCAP = (lstSystemCAP.includes('platform') ?
        caller.listObj(sysPath.concat('platform')) : undefined);
    return makeSystemBasedOnListing(caller, sysPath, lstSystemCAP, lstPlatformCAP, lstAppsCAP);
}
function makeSystemBasedOnListing(caller, sysPath, lstSystemCAP, lstPlatformCAP, lstAppsCAP) {
    const system = {};
    if (lstAppsCAP) {
        const appsPath = sysPath.concat('apps');
        system.apps = makeAppsFollowingListing(lstAppsCAP, caller, appsPath);
    }
    if (lstSystemCAP.includes('platform')) {
        const platformPath = sysPath.concat('platform');
        system.platform = makePlatformCaller(lstPlatformCAP, caller, platformPath);
    }
    if (lstSystemCAP.includes('monitor')) {
        const monitorPath = sysPath.concat('monitor');
        system.monitor = makeSystemMonitorCaller(caller, monitorPath);
    }
    if (lstSystemCAP.includes('userLogin')) {
        const userLoginPath = sysPath.concat('userLogin');
        system.userLogin = makeUserLoginCaller(caller, userLoginPath);
    }
    if (lstSystemCAP.includes('autoStartup')) {
        const autoStartupPath = sysPath.concat('autoStartup');
        system.autoStartup = makeAutoStartupCaller(caller, autoStartupPath);
    }
    if (lstSystemCAP.includes('logout')) {
        const logoutPath = sysPath.concat('logout');
        system.logout = ipc_1.callerSideJSONWrap.makeReqRepFuncCaller(caller, logoutPath);
    }
    if (lstSystemCAP.includes('closeCurrentUserApps')) {
        const closeCurrentUserAppsPath = sysPath.concat('closeCurrentUserApps');
        system.closeCurrentUserApps = ipc_1.callerSideJSONWrap.makeReqRepFuncCaller(caller, closeCurrentUserAppsPath);
    }
    if (lstSystemCAP.includes('exitPlatform')) {
        const exitPlatformPath = sysPath.concat('exitPlatform');
        system.exitPlatform = ipc_1.callerSideJSONWrap.makeReqRepFuncCaller(caller, exitPlatformPath);
    }
    if (lstSystemCAP.includes('otherOpenUsers')) {
        const otherOpenUsersPath = sysPath.concat('otherOpenUsers');
        system.otherOpenUsers = makeOtherOpenUsersCaller(caller, otherOpenUsersPath);
    }
    return system;
}
async function promiseSystemCaller(caller, sysPath) {
    if (!caller.listObjAsync) {
        throw new Error(`Caller here expects to have method 'listObjAsync'`);
    }
    const lstSystemCAP = (await caller.listObjAsync(sysPath));
    const lstAppsCAP = (lstSystemCAP.includes('apps') ?
        (await caller.listObjAsync(sysPath.concat('apps'))) :
        undefined);
    const lstPlatformCAP = (lstSystemCAP.includes('platform') ?
        (await caller.listObjAsync(sysPath.concat('platform'))) :
        undefined);
    return makeSystemBasedOnListing(caller, sysPath, lstSystemCAP, lstPlatformCAP, lstAppsCAP);
}
function makeAppsFollowingListing(lstAppsCAP, caller, objPath) {
    const apps = {};
    if (lstAppsCAP.includes('opener')) {
        apps.opener = makeAppsOpenerCaller(caller, objPath.concat('opener'));
    }
    if (lstAppsCAP.includes('downloader')) {
        apps.downloader = makeAppsDownloaderCaller(caller, objPath.concat('downloader'));
    }
    if (lstAppsCAP.includes('installer')) {
        apps.installer = makeAppsInstallerCaller(caller, objPath.concat('installer'));
    }
    return apps;
}
function makeAppsDownloaderCaller(caller, objPath) {
    return {
        getAppChannels: callAppsDownloader(caller, objPath, 'getAppChannels'),
        getAppVersionFilesList: callAppsDownloader(caller, objPath, 'getAppVersionFilesList'),
        getLatestAppVersion: callAppsDownloader(caller, objPath, 'getLatestAppVersion'),
        downloadWebApp: (() => {
            const fn = ipc_1.callerSideJSONWrap.makeObservableFuncCaller(caller, objPath.concat('downloadWebApp'));
            return (id, version, obs) => fn(obs, id, version);
        })(),
    };
}
function callAppsDownloader(caller, objPath, method) {
    return ipc_1.callerSideJSONWrap.makeReqRepObjCaller(caller, objPath, method);
}
function makeAppsInstallerCaller(caller, objPath) {
    return {
        listBundledApps: callAppsInstaller(caller, objPath, 'listBundledApps'),
        addPackFromBundledApps: (() => {
            const fn = ipc_1.callerSideJSONWrap.makeObservableFuncCaller(caller, objPath.concat('addPackFromBundledApps'));
            return (id, obs) => fn(obs, id);
        })(),
        addAppPackFromFolder: (() => {
            const fn = ipc_1.callerSideJSONWrap.makeObservableFuncCaller(caller, objPath.concat('addAppPackFromFolder'), { findRefOf: f => caller.srvRefOf(f) });
            return (appPackFS, obs) => fn(obs, appPackFS);
        })(),
        addAppPackFromZipFile: (() => {
            const fn = ipc_1.callerSideJSONWrap.makeObservableFuncCaller(caller, objPath.concat('addAppPackFromZipFile'), { findRefOf: f => caller.srvRefOf(f) });
            return (appPackFile, obs) => fn(obs, appPackFile);
        })(),
        listAllAppsPacks: callAppsInstaller(caller, objPath, 'listAllAppsPacks'),
        listAppPacks: callAppsInstaller(caller, objPath, 'listAppPacks'),
        installApp: callAppsInstaller(caller, objPath, 'installApp'),
        removeAppPack: callAppsInstaller(caller, objPath, 'removeAppPack'),
        uninstallApp: callAppsInstaller(caller, objPath, 'uninstallApp'),
        removeAppData: callAppsInstaller(caller, objPath, 'removeAppData'),
        watchApps: ipc_1.callerSideJSONWrap.makeObservableFuncCaller(caller, objPath.concat('watchApps')),
        getAppManifest: callAppsInstaller(caller, objPath, 'getAppManifest'),
        getAppFileBytes: callAppsInstaller(caller, objPath, 'getAppFileBytes')
    };
}
function callAppsInstaller(caller, objPath, method) {
    return ipc_1.callerSideJSONWrap.makeReqRepObjCaller(caller, objPath, method);
}
function makePlatformCaller(lstPlatformCAP, caller, objPath) {
    const platform = {
        getCurrentVersion: callPlatform(caller, objPath, 'getCurrentVersion'),
        wipeFromThisDevice: callPlatform(caller, objPath, 'wipeFromThisDevice')
    };
    if (lstPlatformCAP.includes('downloader')) {
        platform.downloader = makePlatformDownloaderCaller(caller, objPath.concat('downloader'));
    }
    return platform;
}
function makePlatformDownloaderCaller(caller, objPath) {
    return {
        getChannels: callPlDownloader(caller, objPath, 'getChannels'),
        getLatestVersion: callPlDownloader(caller, objPath, 'getLatestVersion'),
        setupUpdater: (() => {
            const fn = ipc_1.callerSideJSONWrap.makeObservableFuncCaller(caller, objPath.concat('setupUpdater'));
            return (newBundleVersion, obs) => fn(obs, newBundleVersion);
        })(),
        downloadUpdate: callPlDownloader(caller, objPath, 'downloadUpdate'),
        quitAndInstall: callPlDownloader(caller, objPath, 'quitAndInstall'),
    };
}
function callPlatform(caller, objPath, method) {
    return ipc_1.callerSideJSONWrap.makeReqRepObjCaller(caller, objPath, method);
}
function callPlDownloader(caller, objPath, method) {
    return ipc_1.callerSideJSONWrap.makeReqRepObjCaller(caller, objPath, method);
}
function makeAppsOpenerCaller(caller, objPath) {
    return {
        listCurrentApps: callAppsOpener(caller, objPath, 'listCurrentApps'),
        openApp: callAppsOpener(caller, objPath, 'openApp'),
        executeCommand: callAppsOpener(caller, objPath, 'executeCommand'),
        triggerAllStartupLaunchers: callAppsOpener(caller, objPath, 'triggerAllStartupLaunchers'),
        closeAppsAfterUpdate: callAppsOpener(caller, objPath, 'closeAppsAfterUpdate'),
        getAppFileBytesOfCurrent: callAppsOpener(caller, objPath, 'getAppFileBytesOfCurrent'),
        getAppManifestOfCurrent: callAppsOpener(caller, objPath, 'getAppManifestOfCurrent')
    };
}
function callAppsOpener(caller, objPath, method) {
    return ipc_1.callerSideJSONWrap.makeReqRepObjCaller(caller, objPath, method);
}
function makeSystemMonitorCaller(caller, objPath) {
    return {
        listProcs: callSystemMonitor(caller, objPath, 'listProcs'),
        listConnectionsToAppServices: callSystemMonitor(caller, objPath, 'listConnectionsToAppServices')
    };
}
function callSystemMonitor(caller, objPath, method) {
    return ipc_1.callerSideJSONWrap.makeReqRepObjCaller(caller, objPath, method);
}
function makeUserLoginCaller(caller, objPath) {
    const setAutoLogin = ipc_1.callerSideJSONWrap.makeObservableFuncCaller(caller, objPath.concat('setAutoLogin'));
    return {
        isAutoLoginSet: callUserLogin(caller, objPath, 'isAutoLoginSet'),
        removeAutoLogin: callUserLogin(caller, objPath, 'removeAutoLogin'),
        setAutoLogin: async (pass, progressCB) => {
            const { promise, reject, resolve } = (0, deferred_1.defer)();
            setAutoLogin({
                next: progressCB,
                complete: resolve,
                error: reject
            }, pass);
            await promise;
        },
        isAutoLoginAvailable: callUserLogin(caller, objPath, 'isAutoLoginAvailable')
    };
}
function callUserLogin(caller, objPath, method) {
    return ipc_1.callerSideJSONWrap.makeReqRepObjCaller(caller, objPath, method);
}
function makeAutoStartupCaller(caller, objPath) {
    return {
        isAutoStartupAvailable: callAutoStartup(caller, objPath, 'isAutoStartupAvailable'),
        isAutoStartupSet: callAutoStartup(caller, objPath, 'isAutoStartupSet'),
        setAutoStartup: callAutoStartup(caller, objPath, 'setAutoStartup'),
    };
}
function callAutoStartup(caller, objPath, method) {
    return ipc_1.callerSideJSONWrap.makeReqRepObjCaller(caller, objPath, method);
}
function makeOtherOpenUsersCaller(caller, objPath) {
    return {
        openLogin: callOtherOpenUsers(caller, objPath, 'openLogin'),
        list: callOtherOpenUsers(caller, objPath, 'list'),
        openDashboardOf: callOtherOpenUsers(caller, objPath, 'openDashboardOf')
    };
}
function callOtherOpenUsers(caller, objPath, method) {
    return ipc_1.callerSideJSONWrap.makeReqRepObjCaller(caller, objPath, method);
}
Object.freeze(exports);

},{"../../lib-common/processes/deferred":22,"core-3nweb-client-lib/build/ipc":62}],17:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2021 - 2022, 2025 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.exposeStartupTestStandCAP = exposeStartupTestStandCAP;
exports.exposeTestStandCAP = exposeTestStandCAP;
exports.makeStartupTestStandCaller = makeStartupTestStandCaller;
exports.makeTestStandCaller = makeTestStandCaller;
exports.promiseTestStandCaller = promiseTestStandCaller;
const ipc_1 = require("core-3nweb-client-lib/build/ipc");
const rxjs_1 = require("rxjs");
const operators_1 = require("rxjs/operators");
const protobuf_msg_1 = require("../../lib-common/protobuf-msg");
const test_stand_proto_1 = require("../../protos/test_stand.proto");
function exposeStartupTestStandCAP(cap) {
    return {
        log: exposeJSONFunc(cap.log),
        record: exposeJSONFunc(cap.record),
        exitAll: exposeJSONFunc(cap.exitAll),
        staticTestInfo: exposeJSONFunc(cap.staticTestInfo),
    };
}
function exposeTestStandCAP(cap) {
    const exp = {
        log: exposeJSONFunc(cap.log),
        record: exposeJSONFunc(cap.record),
        exitAll: exposeJSONFunc(cap.exitAll),
        staticTestInfo: exposeJSONFunc(cap.staticTestInfo),
        idOfTestUser: exposeJSONFunc(cap.idOfTestUser),
        sendMsgToOtherLocalTestProcess: sendMsgToOtherLocalTestProcess.wrapService(cap.sendMsgToOtherLocalTestProcess),
        // sendMsgToOtherLocalTestProcess: exposeJSONFunc(
        // 	cap.sendMsgToOtherLocalTestProcess
        // ),
        observeMsgsFromOtherLocalTestProcess: observeMsgsFromOtherLocalTestProcess.wrapService(cap.observeMsgsFromOtherLocalTestProcess),
        // observeMsgsFromOtherLocalTestProcess: jsonSrv.wrapObservingFunc(
        // 	cap.observeMsgsFromOtherLocalTestProcess
        // )
    };
    if (cap.focusThisWindow) {
        exp.focusThisWindow = exposeJSONFunc(cap.focusThisWindow);
    }
    return exp;
}
function exposeJSONFunc(fn) {
    return ipc_1.serviceSideJSONWrap.wrapReqReplyFunc(fn);
}
function makeStartupTestStandCaller(caller, objPath) {
    return {
        log: testStartupStandCall(caller, objPath, 'log'),
        record: testStartupStandCall(caller, objPath, 'record'),
        exitAll: testStartupStandCall(caller, objPath, 'exitAll'),
        staticTestInfo: testStartupStandCall(caller, objPath, 'staticTestInfo'),
    };
}
function testStartupStandCall(caller, objPath, method) {
    return ipc_1.callerSideJSONWrap.makeReqRepObjCaller(caller, objPath, method);
}
function makeTestStandCaller(caller, objPath) {
    if (!caller.listObj) {
        throw new Error(`Caller here expects to have method 'listObj'`);
    }
    const methods = caller.listObj(objPath);
    return setupTestStandCaller(caller, objPath, methods);
}
async function promiseTestStandCaller(caller, objPath) {
    if (!caller.listObjAsync) {
        throw new Error(`Caller here expects to have method 'listObjAsync'`);
    }
    const methods = (await caller.listObjAsync(objPath));
    return setupTestStandCaller(caller, objPath, methods);
}
function setupTestStandCaller(caller, objPath, methods) {
    const cap = {
        log: testStandCall(caller, objPath, 'log'),
        record: testStandCall(caller, objPath, 'record'),
        exitAll: testStandCall(caller, objPath, 'exitAll'),
        staticTestInfo: testStandCall(caller, objPath, 'staticTestInfo'),
        idOfTestUser: testStandCall(caller, objPath, 'idOfTestUser'),
        sendMsgToOtherLocalTestProcess: sendMsgToOtherLocalTestProcess.makeCaller(caller, objPath),
        // sendMsgToOtherLocalTestProcess: testStandCall(
        // 	caller, objPath, 'sendMsgToOtherLocalTestProcess'
        // ),
        observeMsgsFromOtherLocalTestProcess: observeMsgsFromOtherLocalTestProcess.makeCaller(caller, objPath),
        // observeMsgsFromOtherLocalTestProcess: jsonCall.makeObservableFuncCaller(
        // 	caller, objPath.concat('observeMsgsFromOtherLocalTestProcess')
        // )
    };
    if (methods.includes('focusThisWindow')) {
        cap.focusThisWindow = testStandCall(caller, objPath, 'focusThisWindow');
    }
    return cap;
}
function testStandCall(caller, objPath, method) {
    return ipc_1.callerSideJSONWrap.makeReqRepObjCaller(caller, objPath, method);
}
function noop() { }
var sendMsgToOtherLocalTestProcess;
(function (sendMsgToOtherLocalTestProcess) {
    const requestType = protobuf_msg_1.ProtoType.for(test_stand_proto_1.test_stand.SendMsgToOtherLocalTestProcessRequestBody);
    function wrapService(fn) {
        return buf => {
            const { userNum, appDomain, appComponent, msgJson } = requestType.unpack(buf);
            const msg = JSON.parse(msgJson);
            const promise = fn((0, protobuf_msg_1.valOfOpt)(userNum), (0, protobuf_msg_1.valOfOpt)(appDomain), (0, protobuf_msg_1.valOfOpt)(appComponent), msg);
            return { promise };
        };
    }
    sendMsgToOtherLocalTestProcess.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = objPath.concat('sendMsgToOtherLocalTestProcess');
        return (userNum, appDomain, appComponent, msg) => caller.startPromiseCall(path, requestType.pack({
            userNum: (0, protobuf_msg_1.toOptVal)(userNum),
            appDomain: (0, protobuf_msg_1.toOptVal)(appDomain),
            appComponent: (0, protobuf_msg_1.toOptVal)(appComponent),
            msgJson: JSON.stringify(msg)
        }))
            .then(noop);
    }
    sendMsgToOtherLocalTestProcess.makeCaller = makeCaller;
})(sendMsgToOtherLocalTestProcess || (sendMsgToOtherLocalTestProcess = {}));
Object.freeze(sendMsgToOtherLocalTestProcess);
var observeMsgsFromOtherLocalTestProcess;
(function (observeMsgsFromOtherLocalTestProcess) {
    const requestType = protobuf_msg_1.ProtoType.for(test_stand_proto_1.test_stand.ObserveOtherTestProcessRequestBody);
    function wrapService(fn) {
        return buf => {
            const { userNum, appDomain, appComponent } = requestType.unpack(buf);
            const s = new rxjs_1.Subject();
            const obs = s.asObservable().pipe((0, operators_1.map)(msg => protobuf_msg_1.strValType.pack((0, protobuf_msg_1.toVal)(JSON.stringify(msg)))));
            const onCancel = fn(s, (0, protobuf_msg_1.valOfOpt)(userNum), (0, protobuf_msg_1.valOfOpt)(appDomain), (0, protobuf_msg_1.valOfOpt)(appComponent));
            return { obs, onCancel };
        };
    }
    observeMsgsFromOtherLocalTestProcess.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = objPath.concat('observeMsgsFromOtherLocalTestProcess');
        return (obs, userNum, appDomain, appComponent) => {
            const s = new rxjs_1.Subject();
            const unsub = caller.startObservableCall(path, requestType.pack({
                userNum: (0, protobuf_msg_1.toOptVal)(userNum),
                appDomain: (0, protobuf_msg_1.toOptVal)(appDomain),
                appComponent: (0, protobuf_msg_1.toOptVal)(appComponent)
            }), s);
            s.subscribe({
                next: buf => {
                    if (obs.next) {
                        obs.next(JSON.parse(protobuf_msg_1.strValType.unpack(buf).value));
                    }
                },
                complete: obs.complete,
                error: obs.error
            });
            return unsub;
        };
    }
    observeMsgsFromOtherLocalTestProcess.makeCaller = makeCaller;
})(observeMsgsFromOtherLocalTestProcess || (observeMsgsFromOtherLocalTestProcess = {}));
Object.freeze(observeMsgsFromOtherLocalTestProcess);
Object.freeze(exports);

},{"../../lib-common/protobuf-msg":23,"../../protos/test_stand.proto":32,"core-3nweb-client-lib/build/ipc":62,"rxjs":95,"rxjs/operators":320}],18:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2025 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.makeUICaller = makeUICaller;
const ipc_1 = require("core-3nweb-client-lib/build/ipc");
function makeUICaller(caller, objPath) {
    return {
        uiFormFactor: callUI(caller, objPath, 'uiFormFactor')
    };
}
function callUI(caller, objPath, method) {
    return ipc_1.callerSideJSONWrap.makeReqRepObjCaller(caller, objPath, method);
}

},{"core-3nweb-client-lib/build/ipc":62}],19:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2020 - 2025 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.makeClientSideW3N = makeClientSideW3N;
exports.promiseClientSideW3N = promiseClientSideW3N;
exports.makeProviderCaller = makeProviderCaller;
const ipc_1 = require("core-3nweb-client-lib/build/ipc");
const test_stand_cap_ipc_1 = require("../caps/test-stand/test-stand-cap-ipc");
const connectivity_cap_ipc_1 = require("../caps/connectivity/connectivity-cap-ipc");
const ipc_client_side_1 = require("../caps/system/ipc-client-side");
const ipc_client_side_2 = require("../caps/shell/ipc-client-side");
const ipc_client_side_3 = require("../caps/rpc/ipc-client-side");
const ipc_client_side_4 = require("../caps/media-devices/ipc-client-side");
const ipc_client_side_5 = require("../caps/ui/ipc-client-side");
function jsonFuncCall(clientSide, path) {
    return ipc_1.callerSideJSONWrap.makeReqRepFuncCaller(clientSide, path);
}
const jsonFuncCallSwallowingErrs = (a, b) => {
    const fn = jsonFuncCall(a, b);
    return function () {
        return fn.call(undefined, ...arguments).catch(noop);
    };
};
function makeClientSideW3N(clientSide) {
    const clientW3N = (0, ipc_1.makeW3Nclient)(clientSide, {
        closeSelf: jsonFuncCallSwallowingErrs,
        myVersion: jsonFuncCall,
        ui: ipc_client_side_5.makeUICaller,
        system: ipc_client_side_1.makeSystemCaller,
        testStand: test_stand_cap_ipc_1.makeTestStandCaller,
        shell: ipc_client_side_2.makeShellCaller,
        rpc: ipc_client_side_3.makeRpcCaller,
        connectivity: connectivity_cap_ipc_1.makeConnectivity,
        mediaDevices: ipc_client_side_4.makeMediaDevices
    });
    addDeprecatedItems(clientW3N);
    return clientW3N;
}
async function promiseClientSideW3N(clientSide) {
    const clientW3N = await (0, ipc_1.promiseW3Nclient)(clientSide, {
        closeSelf: jsonFuncCallSwallowingErrs,
        myVersion: jsonFuncCall,
        ui: ipc_client_side_5.makeUICaller,
        system: ipc_client_side_1.promiseSystemCaller,
        testStand: test_stand_cap_ipc_1.promiseTestStandCaller,
        shell: ipc_client_side_2.promiseShellCaller,
        rpc: ipc_client_side_3.promiseRpcCaller,
        connectivity: connectivity_cap_ipc_1.makeConnectivity,
        mediaDevices: ipc_client_side_4.promiseMediaDevices
    });
    addDeprecatedItems(clientW3N);
    return clientW3N;
}
function addDeprecatedItems(clientW3N) {
    var _a, _b, _c;
    try {
        if ((_a = clientW3N.rpc) === null || _a === void 0 ? void 0 : _a.thisApp) {
            clientW3N.appRPC = wrapExistingFn(clientW3N.rpc.thisApp, `Deprecations warning:\nUse w3n.rpc.thisApp instead of w3n.appRPC.`);
        }
        if ((_b = clientW3N.rpc) === null || _b === void 0 ? void 0 : _b.otherAppsRPC) {
            clientW3N.otherAppsRPC = wrapExistingFn(clientW3N.rpc.otherAppsRPC, `Deprecations warning:\nUse w3n.rpc.otherAppsRPC instead of w3n.otherAppsRPC.`);
        }
        if ((_c = clientW3N.rpc) === null || _c === void 0 ? void 0 : _c.exposeService) {
            clientW3N.exposeService = wrapExistingFn(clientW3N.rpc.exposeService, `Deprecations warning:\nUse w3n.rpc.exposeService instead of w3n.exposeService.`);
        }
    }
    catch (err) {
        console.error(`\n@ deprecation part:\n`, err);
    }
}
function wrapExistingFn(fn, warnMsg) {
    let showWarning = true;
    return function (...args) {
        if (showWarning) {
            console.warn(warnMsg);
            showWarning = false;
        }
        return fn.apply(undefined, args);
    };
}
function noop() { }
function providerMethod(caller, objPath, method) {
    return ipc_1.callerSideJSONWrap.makeReqRepObjCaller(caller, objPath, method);
}
function makeProviderCaller(caller, objPath) {
    return {
        openInExternal: providerMethod(caller, objPath, 'openInExternal'),
        openSiteInChildWindow: providerMethod(caller, objPath, 'openSiteInChildWindow'),
        closeSite: providerMethod(caller, objPath, 'closeSite'),
        getSignupToken: providerMethod(caller, objPath, 'getSignupToken'),
    };
}
Object.freeze(exports);

},{"../caps/connectivity/connectivity-cap-ipc":1,"../caps/media-devices/ipc-client-side":3,"../caps/rpc/ipc-client-side":6,"../caps/shell/ipc-client-side":13,"../caps/system/ipc-client-side":16,"../caps/test-stand/test-stand-cap-ipc":17,"../caps/ui/ipc-client-side":18,"core-3nweb-client-lib/build/ipc":62}],20:[function(require,module,exports){
(function (Buffer){(function (){
"use strict";
/*
 Copyright (C) 2016, 2018 - 2020 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>. */
Object.defineProperty(exports, "__esModule", { value: true });
exports.utf8 = exports.base64urlSafe = exports.base64 = exports.EMPTY_BUFFER = void 0;
exports.toBuffer = toBuffer;
exports.bufFromJson = bufFromJson;
exports.joinByteArrs = joinByteArrs;
exports.byteLengthIn = byteLengthIn;
exports.EMPTY_BUFFER = Buffer.alloc(0);
/**
 * Buffer and Uint8Array are intimately linked in Node, starting with some
 * version. As a result, Uint8Array can be efficiently turned into Buffer,
 * or Buffer can be used as Uint8Array.
 * This function checks if given argument is a Buffer, and, if not, does
 * proper enveloping.
 * @param bytes that we need to have as a Buffer
 * @return Buffer with given bytes.
 */
function toBuffer(bytes) {
    if (Buffer.isBuffer(bytes)) {
        return bytes;
    }
    if (bytes.length === 0) {
        return exports.EMPTY_BUFFER;
    }
    return Buffer.from(bytes.buffer, bytes.byteOffset, bytes.length);
}
/**
 * Node's JSON.stringify turns Buffer into a particular json.
 * This function turns this json back to Buffer.
 * @param json of a Buffer
 * @return a Buffer reconstructed from a given json.
 */
function bufFromJson(json) {
    if ((json.type !== 'Buffer') || !Array.isArray(json.data)) {
        throw new Error('Given argument is not a buffer json.');
    }
    return Buffer.from(json.data);
}
var base64;
(function (base64) {
    function pack(bytes) {
        const buf = toBuffer(bytes);
        return buf.toString('base64');
    }
    base64.pack = pack;
    function open(str) {
        return Buffer.from(str, 'base64');
    }
    base64.open = open;
})(base64 || (exports.base64 = base64 = {}));
Object.freeze(base64);
var base64urlSafe;
(function (base64urlSafe) {
    function pack(bytes) {
        const str = base64.pack(bytes);
        return str
            .replace(/\+/g, '-')
            .replace(/\//g, '_');
    }
    base64urlSafe.pack = pack;
    function open(str) {
        str = str
            .replace(/-/g, '+')
            .replace(/_/g, '/');
        return base64.open(str);
    }
    base64urlSafe.open = open;
})(base64urlSafe || (exports.base64urlSafe = base64urlSafe = {}));
Object.freeze(base64);
var utf8;
(function (utf8) {
    function pack(str) {
        return Buffer.from(str, 'utf8');
    }
    utf8.pack = pack;
    function open(bytes) {
        const buf = toBuffer(bytes);
        return buf.toString('utf8');
    }
    utf8.open = open;
})(utf8 || (exports.utf8 = utf8 = {}));
Object.freeze(utf8);
function joinByteArrs(arrs) {
    let totalLen = 0;
    for (const arr of arrs) {
        totalLen += arr.length;
    }
    const allBytes = new Uint8Array(totalLen);
    let ofs = 0;
    for (const arr of arrs) {
        allBytes.set(arr, ofs);
        ofs += arr.length;
    }
    return allBytes;
}
function byteLengthIn(arrs) {
    let len = 0;
    for (let i = 0; i < arrs.length; i += 1) {
        len += arrs[i].length;
    }
    return len;
}
Object.freeze(exports);

}).call(this)}).call(this,require("buffer").Buffer)
},{"buffer":42}],21:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2016 - 2017, 2020, 2024 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.errWithCause = errWithCause;
exports.stringifyErr = stringifyErr;
function errWithCause(cause, message) {
    const err = new Error(message);
    err.cause = cause;
    if (cause.failedCipherVerification) {
        err.failedCipherVerification = true;
    }
    return err;
}
function recursiveJSONify(err) {
    if (!err || (typeof err !== 'object') || Array.isArray(err)) {
        return err;
    }
    else if (err.runtimeException) {
        if (err.cause) {
            err.cause = recursiveJSONify(err.cause);
        }
        return err;
    }
    else {
        const jsonErr = {
            message: err.message,
            stack: err.stack
        };
        if (err.cause) {
            jsonErr.cause = recursiveJSONify(err.cause);
        }
        return jsonErr;
    }
}
function stringifyErr(err) {
    if (!err) {
        return '';
    }
    let json = recursiveJSONify(err);
    let errStr;
    if (!json || (typeof json !== 'object') || err.runtimeException) {
        try {
            errStr = ((typeof json === 'string') ?
                json : `${JSON.stringify(json, null, '  ')}\n`);
        }
        catch (jsonErr) {
            errStr = `<report-error>${jsonErr.message}</report-error>\n`;
        }
    }
    else {
        errStr = `\nError message: ${json.message}\n`;
        if (json.stack) {
            errStr += `Error stack: ${json.stack}\n`;
        }
        if (json.cause) {
            try {
                let causeStr = ((typeof json.cause === 'string') ?
                    json.cause : JSON.stringify(json.cause, null, '  '));
                errStr += `Caused by: ${causeStr}\n`;
            }
            catch (jsonErr) {
                errStr += `Caused by:\n<report-error>${jsonErr.message}</report-error>\n`;
            }
        }
    }
    return errStr.split('\\n').join('\n').split('\\\\').join('\\');
}
Object.freeze(exports);

},{}],22:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2015, 2017 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.defer = defer;
function defer() {
    const d = {};
    d.promise = new Promise((resolve, reject) => {
        d.resolve = resolve;
        d.reject = reject;
    });
    Object.freeze(d);
    return d;
}

},{}],23:[function(require,module,exports){
(function (Buffer){(function (){
"use strict";
/*
 Copyright (C) 2020, 2022, 2024 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.errBodyType = exports.bytesValType = exports.strValType = exports.strArrValType = exports.boolValType = exports.objRefType = exports.ProtoType = void 0;
exports.fixArray = fixArray;
exports.fixInt = fixInt;
exports.valOfOptInt = valOfOptInt;
exports.packInt = packInt;
exports.unpackInt = unpackInt;
exports.errToMsg = errToMsg;
exports.errFromMsg = errFromMsg;
exports.toVal = toVal;
exports.toOptVal = toOptVal;
exports.valOf = valOf;
exports.valOfOpt = valOfOpt;
exports.valOfOptJson = valOfOptJson;
exports.toOptJson = toOptJson;
exports.toAnyValue = toAnyValue;
exports.valOfAny = valOfAny;
const ipc_1 = require("core-3nweb-client-lib/build/ipc");
const error_1 = require("./exceptions/error");
const common_proto_1 = require("../protos/common.proto");
const buffer_utils_1 = require("./buffer-utils");
class ProtoType {
    constructor(type) {
        this.type = type;
        this.type = type;
        Object.freeze(this);
    }
    static for(type) {
        return new ProtoType(type);
    }
    pack(msg) {
        const err = this.type.verify(msg);
        if (err) {
            throw new Error(err);
        }
        return this.type.encode(msg).finish();
    }
    unpack(bytes) {
        if (!bytes) {
            throw (0, ipc_1.makeIPCException)({ missingBodyBytes: true });
        }
        return this.type.decode(bytes);
    }
    packToBase64(msg) {
        return this.pack(msg).toString('base64');
    }
    unpackFromBase64(str) {
        return this.unpack(Buffer.from(str, 'base64'));
    }
}
exports.ProtoType = ProtoType;
Object.freeze(ProtoType.prototype);
Object.freeze(ProtoType);
exports.objRefType = ProtoType.for(common_proto_1.common.ObjectReference);
exports.boolValType = ProtoType.for(common_proto_1.common.BooleanValue);
exports.strArrValType = ProtoType.for(common_proto_1.common.StringArrayValue);
exports.strValType = ProtoType.for(common_proto_1.common.StringValue);
exports.bytesValType = ProtoType.for(common_proto_1.common.BytesValue);
function fixArray(arr) {
    return (arr ? arr : []);
}
const MAX_HIGH = 0b111111111111111111111;
function fixInt(uint64) {
    if (typeof uint64 === 'object') {
        const { high, low } = uint64;
        if (high > MAX_HIGH) {
            throw (0, ipc_1.makeIPCException)({
                invalidNumInBody: true,
                message: 'Integer is greater than 2^53-1'
            });
        }
        const fixedInt = 0x100000000 * high + ((low < 0) ? 0x100000000 + low : low);
        if (isNaN(fixedInt)) {
            throw new TypeError(`Can't construct integer from a given object`);
        }
        else {
            return fixedInt;
        }
    }
    else if (typeof uint64 === 'string') {
        return Number.parseInt(uint64);
    }
    else if (typeof uint64 === 'number') {
        return uint64;
    }
    else {
        throw new TypeError(`Can't extract integer from ${typeof uint64}`);
    }
}
function valOfOptInt(uint64) {
    if (!uint64) {
        return;
    }
    return fixInt(valOf(uint64));
}
const numValType = ProtoType.for(common_proto_1.common.UInt64Value);
function packInt(uint64) {
    return numValType.pack({ value: uint64 });
}
function unpackInt(buf) {
    return fixInt(valOf(numValType.unpack(buf)));
}
exports.errBodyType = ProtoType.for(common_proto_1.common.ErrorValue);
function errToMsg(err) {
    if (typeof err !== 'object') {
        return { err: JSON.stringify(err) };
    }
    else if (err.runtimeException) {
        return { runtimeExcJson: JSON.stringify(err) };
    }
    else {
        return { err: (0, error_1.stringifyErr)(err) };
    }
}
function errFromMsg(msg) {
    if (msg.runtimeExcJson) {
        return JSON.parse(msg.runtimeExcJson);
    }
    else {
        return (0, error_1.errWithCause)(msg.err, 'Error from other side of ipc');
    }
}
function toVal(value) {
    return { value };
}
function toOptVal(value) {
    return ((value === undefined) ? undefined : { value });
}
function valOf(valObj) {
    return valObj.value;
}
function valOfOpt(valObj) {
    return (valObj ? valObj.value : undefined);
}
function valOfOptJson(valObj) {
    try {
        return (valObj ? JSON.parse(valObj.value) : undefined);
    }
    catch (err) {
        throw (0, ipc_1.makeIPCException)({ cause: err, badReply: true });
    }
}
function toOptJson(json) {
    return ((json === undefined) ?
        undefined : toVal(JSON.stringify(json)));
}
function toAnyValue(value) {
    if (Buffer.isBuffer(value)) {
        return { bytes: toVal(value) };
    }
    else if (ArrayBuffer.isView(value)) {
        return { bytes: toVal((0, buffer_utils_1.toBuffer)(value)) };
    }
    else {
        return { json: toVal(JSON.stringify(value)) };
    }
}
function valOfAny(valObj) {
    if (valObj.json) {
        return JSON.parse(valOf(valObj.json));
    }
    else {
        return valOfOpt(valObj.bytes);
    }
}
Object.freeze(exports);

}).call(this)}).call(this,require("buffer").Buffer)
},{"../protos/common.proto":27,"./buffer-utils":20,"./exceptions/error":21,"buffer":42,"core-3nweb-client-lib/build/ipc":62}],24:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2022 - 2023, 2026 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.makeReqRepMethodCaller = makeReqRepMethodCaller;
exports.makeObservableMethodCaller = makeObservableMethodCaller;
exports.makeServiceCaller = makeServiceCaller;
const passed_datum_1 = require("./passed-datum");
function fnResultFromPassedDatum(data, unpack) {
    if (!data) {
        return;
    }
    if (unpack) {
        return ((unpack === 'noop') ? data.bytes : unpack(data));
    }
    else {
        return (0, passed_datum_1.unpackDatum)(data);
    }
}
function argsToPassedDatum(args, pack) {
    if (args === undefined) {
        return;
    }
    if (pack) {
        if (pack === 'noop') {
            if (!ArrayBuffer.isView(args[0])) {
                throw new Error(`Method returned non-binary, while no serialization is set`);
            }
            return { bytes: args[0] };
        }
        return pack(args);
    }
    else {
        return (0, passed_datum_1.packIntoDatum)(args);
    }
}
function makeReqRepMethodCaller(connection, method, transforms) {
    return (async (...args) => {
        const req = argsToPassedDatum(args, transforms === null || transforms === void 0 ? void 0 : transforms.packRequest);
        const callResult = await connection.makeRequestReplyCall(method, req);
        return fnResultFromPassedDatum(callResult, transforms === null || transforms === void 0 ? void 0 : transforms.unpackReply);
    });
}
function makeObservableMethodCaller(connection, method, transforms) {
    return ((obs, ...args) => {
        const req = argsToPassedDatum(args, transforms === null || transforms === void 0 ? void 0 : transforms.packRequest);
        const obsWrap = {
            next: data => {
                if (!obs.next) {
                    return;
                }
                const ev = fnResultFromPassedDatum(data, transforms === null || transforms === void 0 ? void 0 : transforms.unpackReply);
                obs.next(ev);
            },
            complete: obs.complete,
            error: obs.error
        };
        return connection.startObservableCall(method, req, obsWrap);
    });
}
function makeServiceCaller(connection, reqRepMethods, obsMethods, transforms) {
    const caller = {};
    if (reqRepMethods) {
        for (const method of reqRepMethods) {
            caller[method] = makeReqRepMethodCaller(connection, method, (transforms ? transforms[method] : undefined));
        }
    }
    if (obsMethods) {
        for (const method of obsMethods) {
            caller[method] = makeObservableMethodCaller(connection, method, (transforms ? transforms[method] : undefined));
        }
    }
    return caller;
}

},{"./passed-datum":26}],25:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2022 - 2023, 2026 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.MultiConnectionIPCWrap = exports.SingleConnectionIPCWrap = exports.IPCWrap = void 0;
const passed_datum_1 = require("./passed-datum");
function surroundWithReqReplySerialization(srv, func, transforms) {
    return async (requestData) => {
        const args = argsFromPassedDatum(requestData, transforms === null || transforms === void 0 ? void 0 : transforms.unpackRequest);
        const result = (args ?
            await func.call(srv, ...args) :
            await func.call(srv));
        return fnResultToPassedDatum(result, transforms === null || transforms === void 0 ? void 0 : transforms.packReply);
    };
}
function argsFromPassedDatum(data, unpack) {
    if (!data) {
        return;
    }
    if (unpack) {
        return ((unpack === 'noop') ? [data.bytes] : unpack(data));
    }
    else {
        return (0, passed_datum_1.unpackDatum)(data);
    }
}
function fnResultToPassedDatum(data, pack) {
    if (data === undefined) {
        return;
    }
    if (pack) {
        if (pack === 'noop') {
            if (!ArrayBuffer.isView(data)) {
                throw new Error(`Method returned non-binary, while no serialization is set`);
            }
            return { bytes: data };
        }
        return pack(data);
    }
    else {
        return (0, passed_datum_1.packIntoDatum)(data);
    }
}
function surroundObsWithSerialization(srv, func, transforms) {
    return (requestData, obs) => {
        const args = argsFromPassedDatum(requestData, transforms === null || transforms === void 0 ? void 0 : transforms.unpackRequest);
        const obsWrap = {
            next: ev => obs.next(fnResultToPassedDatum(ev, transforms === null || transforms === void 0 ? void 0 : transforms.packReply)),
            complete: obs.complete,
            error: obs.error
        };
        return (args ?
            func.call(srv, obsWrap, ...args) :
            func.call(srv, obsWrap));
    };
}
class ConnectionState {
    constructor(disconnect) {
        this.disconnect = disconnect;
        this.calls = new Map();
        this.isRunning = true;
    }
    acceptsMsgs() {
        return this.isRunning;
    }
    stop() {
        if (!this.isRunning) {
            return;
        }
        this.isRunning = false;
        this.disconnect();
        for (const { cancel } of this.calls.values()) {
            if (cancel) {
                cancel();
            }
        }
        this.calls.clear();
    }
    hasCall(callNum) {
        return this.calls.has(callNum);
    }
    cancelCall(callNum) {
        const call = this.calls.get(callNum);
        if (!call) {
            return;
        }
        this.calls.delete(callNum);
        if (call.cancel) {
            call.cancel();
        }
    }
    completeCall(callNum) {
        this.calls.delete(callNum);
    }
    registerReqReplyCall(callNum) {
        this.calls.set(callNum, {});
    }
    registerObservableCall(callNum, cancel) {
        this.calls.set(callNum, { cancel });
    }
}
class IPCWrap {
    constructor(srvName, logErrorsToConsole) {
        this.srvName = srvName;
        this.logErrorsToConsole = logErrorsToConsole;
        this.connections = new Map();
        this.methods = new Map();
    }
    addReqReplyMethod(method, srv, func, transforms) {
        this.methods.set(method, {
            reqRep: surroundWithReqReplySerialization(srv, func, transforms)
        });
    }
    exposeReqReplyMethods(srv, methods, transforms) {
        for (const method of methods) {
            const func = srv[method];
            if (typeof func !== 'function') {
                throw new Error(`Given service object has no method ${method}`);
            }
            this.addReqReplyMethod(method, srv, func, (transforms ? transforms[method] : undefined));
        }
    }
    addObservableMethod(method, srv, func, transforms) {
        this.methods.set(method, {
            obs: surroundObsWithSerialization(srv, func, transforms)
        });
    }
    exposeObservableMethods(srv, methods, transforms) {
        for (const method of methods) {
            const func = srv[method];
            if (typeof func !== 'function') {
                throw new Error(`Given service object has no method ${method}`);
            }
            this.addObservableMethod(method, srv, func, (transforms ? transforms[method] : undefined));
        }
    }
    async onMsg(connection, connectionState, msg) {
        if (!connectionState.acceptsMsgs()) {
            return;
        }
        if (msg.msgType === 'start') {
            const { callNum, method, data: requestData } = msg;
            if (connectionState.hasCall(callNum)) {
                return;
            }
            const m = this.methods.get(method);
            if (!m) {
                await connection.send({
                    callNum, callStatus: 'error', err: `Method ${method} not found`
                });
                return;
            }
            const { obs, reqRep } = m;
            if (reqRep) {
                connectionState.registerReqReplyCall(callNum);
                await this.callReqReplyHandler(connection, connectionState, method, reqRep, callNum, requestData);
            }
            else if (obs) {
                const cancelCall = this.callObsHandler(connection, connectionState, method, obs, callNum, requestData);
                connectionState.registerObservableCall(callNum, cancelCall);
            }
        }
        else if (msg.msgType === 'cancel') {
            const { callNum } = msg;
            connectionState.cancelCall(callNum);
        }
    }
    async callReqReplyHandler(connection, connectionState, method, reqRep, callNum, requestData) {
        let reply;
        try {
            const data = await reqRep(requestData);
            reply = {
                callNum, callStatus: 'end', data
            };
        }
        catch (err) {
            reply = {
                callNum, callStatus: 'error', err
            };
            if (this.logErrorsToConsole) {
                console.error(`Exposed service ${this.srvName} throws exception within a remote call to method ${method}`, err);
            }
        }
        if (!connectionState.hasCall(callNum)) {
            return;
        }
        connectionState.completeCall(callNum);
        await connection.send(reply);
    }
    callObsHandler(connection, connectionState, method, obs, callNum, requestData) {
        return obs(requestData, {
            next: data => connection.send({
                callNum, callStatus: 'interim', data
            }),
            complete: async () => {
                if (!connectionState.hasCall(callNum)) {
                    return;
                }
                connectionState.completeCall(callNum);
                await connection.send({
                    callNum, callStatus: 'end'
                });
            },
            error: async (err) => {
                if (!connectionState.hasCall(callNum)) {
                    return;
                }
                connectionState.completeCall(callNum);
                await connection.send({
                    callNum, callStatus: 'error', err
                });
                if (this.logErrorsToConsole) {
                    console.error(`Exposed service ${this.srvName} throws exception into a remote observer from a method ${method}`, err);
                }
            }
        });
    }
    startIPC(exposeService) {
        return (exposeService !== null && exposeService !== void 0 ? exposeService : w3n === null || w3n === void 0 ? void 0 : w3n.rpc.exposeService)(this.srvName, {
            next: connection => this.onConnection(connection),
            complete: () => this.onListeningCompletion(),
            error: err => this.onListeningError(err)
        });
    }
    stopIPC() {
        for (const connectionState of this.connections.values()) {
            connectionState.stop();
        }
        this.connections.clear();
    }
    async onConnection(connection) {
        const disconnect = connection.watch({
            next: msg => this.onMsg(connection, connectionState, msg),
            complete: () => this.onConnectionCompletion(connection, connectionState),
            error: err => this.onConnectionError(connection, connectionState, err)
        });
        const connectionState = new ConnectionState(() => {
            this.connections.delete(connection);
            disconnect();
        });
        this.connections.set(connection, connectionState);
    }
    async onConnectionCompletion(connection, connectionState) {
        this.connections.delete(connection);
        connectionState.stop();
    }
    async onConnectionError(connection, connectionState, err) {
        this.connections.delete(connection);
        connectionState.stop();
    }
}
exports.IPCWrap = IPCWrap;
class SingleConnectionIPCWrap extends IPCWrap {
    constructor(srvName, closeSelf, logErrorsToConsole = false) {
        super(srvName, logErrorsToConsole);
        this.closeSelf = closeSelf;
    }
    async onListeningCompletion() {
        this.closeSelf();
    }
    async onListeningError(err) {
        if (w3n === null || w3n === void 0 ? void 0 : w3n.log) {
            await w3n.log('error', `Error in listening for incoming connections`, err);
        }
        this.closeSelf();
    }
    async onConnectionCompletion(connection, connectionState) {
        super.onConnectionCompletion(connection, connectionState);
        this.closeSelf();
    }
    async onConnectionError(connection, connectionState, err) {
        super.onConnectionError(connection, connectionState, err);
        if (w3n === null || w3n === void 0 ? void 0 : w3n.log) {
            await w3n.log('error', `Error in listening for calls`, err);
        }
        this.closeSelf();
    }
}
exports.SingleConnectionIPCWrap = SingleConnectionIPCWrap;
class MultiConnectionIPCWrap extends IPCWrap {
    constructor(srvName, logErrorsToConsole = false) {
        super(srvName, logErrorsToConsole);
    }
    async onListeningCompletion() { }
    async onListeningError(err) {
        if (w3n === null || w3n === void 0 ? void 0 : w3n.log) {
            await w3n.log('error', `Error in listening for incoming connections`, err);
        }
    }
    async onConnectionError(connection, connectionState, err) {
        super.onConnectionError(connection, connectionState, err);
        if (w3n === null || w3n === void 0 ? void 0 : w3n.log) {
            await w3n.log('error', `Error in listening for calls`, err);
        }
    }
}
exports.MultiConnectionIPCWrap = MultiConnectionIPCWrap;

},{"./passed-datum":26}],26:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2026 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.packIntoDatum = packIntoDatum;
exports.unpackDatum = unpackDatum;
const buffer_utils_1 = require("../buffer-utils");
function packIntoDatum(data) {
    if (ArrayBuffer.isView(data)) {
        return partsToDatum({ type: 'byte-array', bytes: data });
    }
    else if ((typeof data !== 'object') || !data) {
        return partsToDatum({ type: 'pure-json', json: data });
    }
    else if (data._isObjectFromCore) {
        return partsToDatum({ type: 'referenced-obj', passedByReference: data });
    }
    else {
        const { parts, objToSkipInJSON } = separateObjectParts(data);
        return partsToDatum(parts, objToSkipInJSON);
    }
}
const typeByteValues = {
    'byte-array': 1,
    'pure-json': 2,
    'mix': 3
};
function partsToDatum(parts, objToSkipInJSON) {
    const replacer = (objToSkipInJSON ? (k, v) => (objToSkipInJSON.has(v) ? null : v) : undefined);
    switch (parts.type) {
        case 'referenced-obj': {
            return { passedByReference: [parts.passedByReference] };
        }
        case 'byte-array': {
            const bytes = new Uint8Array(1 + parts.bytes.length);
            bytes[0] = typeByteValues["byte-array"];
            bytes.set(parts.bytes, 1);
            return { bytes };
        }
        case 'pure-json': {
            const jsonBytes = buffer_utils_1.utf8.pack(JSON.stringify(parts.json, replacer));
            const bytes = new Uint8Array(1 + jsonBytes.length);
            bytes[0] = typeByteValues["pure-json"];
            bytes.set(jsonBytes, 1);
            return { bytes };
        }
        case 'mix': {
            const { json, byteArrays, byteArrayPlacesInJson, passedByReference, refdObjPlaceInJson } = parts;
            const serial = { json, byteArrayPlacesInJson, refdObjPlaceInJson };
            const serialJsonBytes = buffer_utils_1.utf8.pack(JSON.stringify(serial, replacer));
            const lengthOfBinaryArrays = totalLenOf(byteArrays);
            const bytes = new Uint8Array(1 + 4 + lengthOfBinaryArrays + serialJsonBytes.length);
            bytes[0] = typeByteValues["mix"];
            let ofs = 1;
            packUintTo4Bytes(lengthOfBinaryArrays, bytes, ofs);
            ofs += 4;
            if (byteArrays) {
                for (const binArr of byteArrays) {
                    bytes.set(binArr, ofs);
                    ofs += binArr.length;
                }
            }
            bytes.set(serialJsonBytes, ofs);
            return { bytes, passedByReference };
        }
    }
}
function unpackDatum({ bytes, passedByReference }) {
    if (bytes) {
        switch (bytes[0]) {
            case typeByteValues['byte-array']: {
                return bytes.subarray(1);
            }
            case typeByteValues['pure-json']: {
                return JSON.parse(buffer_utils_1.utf8.open(bytes.subarray(1)));
            }
            case typeByteValues['mix']: {
                let ofs = 1;
                const lengthOfBinaryArrays = uintFrom4Bytes(bytes, ofs);
                ofs += 4;
                const serialJsonBytes = bytes.subarray(ofs + lengthOfBinaryArrays);
                const { json, byteArrayPlacesInJson, refdObjPlaceInJson } = JSON.parse(buffer_utils_1.utf8.open(serialJsonBytes));
                const byteArrays = ((byteArrayPlacesInJson && (byteArrayPlacesInJson.length > 0)) ?
                    [] : undefined);
                if (byteArrays) {
                    for (const { arrLen } of byteArrayPlacesInJson) {
                        byteArrays.push(bytes.subarray(ofs, ofs + arrLen));
                        ofs += arrLen;
                    }
                }
                return combineObjectParts({
                    json, byteArrays, byteArrayPlacesInJson, passedByReference, refdObjPlaceInJson
                });
            }
            default:
                throw new TypeError(`Unexpected type byte value ${bytes[0]}`);
        }
    }
    else {
        return passedByReference === null || passedByReference === void 0 ? void 0 : passedByReference[0];
    }
}
function totalLenOf(byteArrs) {
    let totalLen = 0;
    if (byteArrs && (byteArrs.length > 0)) {
        for (const bytes of byteArrs) {
            totalLen += bytes.length;
        }
    }
    return totalLen;
}
/**
 * @param u is an unsigned integer up to 32-bits to be stored big-endian way in 4 bytes.
 */
function packUintTo4Bytes(u, b, i) {
    if (u > 0xffffffff) {
        throw new Error('Cannot store number bigger than 2^32-1');
    }
    if (b.length < i + 4) {
        throw new Error('Given array has less than 4 bytes, starting with a given index.');
    }
    b[i] = u >>> 24;
    b[i + 1] = u >>> 16;
    b[i + 2] = u >>> 8;
    b[i + 3] = u;
}
/**
 * @param x
 * @param i
 * @return unsigned integer (up to 32 bits), stored big-endian way in 4 bytes of x, starting at index i.
 */
function uintFrom4Bytes(x, i = 0) {
    if (x.length < i + 4) {
        throw new Error('Given array has less than 4 bytes, starting with a given index.');
    }
    // Note that (x << 24) may produce negative number, probably due to
    // treating intermediate integer as signed, and pulling sign to resulting
    // float number. Hence, we need a bit different operation here.
    return (x[i] * 0x1000000) + ((x[i + 1] << 16) | (x[i + 2] << 8) | x[i + 3]);
}
function separateObjectParts(o) {
    const byteArrays = [];
    const byteArrayPlacesInJson = [];
    const passedByReference = [];
    const refdObjPlaceInJson = [];
    const objToSkipInJSON = new Set();
    function separateNonJsonPartsIteratively(obj, objPath) {
        if (Array.isArray(obj)) {
            for (let i = 0; i < obj.length; i += 1) {
                skipSeparateOrIterate(obj[i], i, objPath);
            }
        }
        else {
            for (const [field, value] of Object.entries(obj)) {
                skipSeparateOrIterate(value, field, objPath);
            }
        }
    }
    function skipSeparateOrIterate(v, field, parentPath) {
        if ((typeof v !== 'object') || !v) {
            return;
        }
        else if (ArrayBuffer.isView(v)) {
            byteArrays.push(v);
            byteArrayPlacesInJson.push({
                place: parentPath.concat(field),
                arrLen: v.length
            });
            objToSkipInJSON.add(v);
        }
        else if (v._isObjectFromCore) {
            passedByReference.push(v);
            refdObjPlaceInJson.push(parentPath.concat(field));
            objToSkipInJSON.add(v);
        }
        else {
            separateNonJsonPartsIteratively(v, parentPath.concat(field));
        }
    }
    separateNonJsonPartsIteratively(o, []);
    if ((byteArrays.length > 0) || (passedByReference.length > 0)) {
        return {
            parts: {
                type: 'mix', json: o,
                byteArrays: ((byteArrays.length > 0) ? byteArrays : undefined),
                byteArrayPlacesInJson: ((byteArrayPlacesInJson.length > 0) ? byteArrayPlacesInJson : undefined),
                passedByReference: ((passedByReference.length > 0) ? passedByReference : undefined),
                refdObjPlaceInJson: ((refdObjPlaceInJson.length > 0) ? refdObjPlaceInJson : undefined)
            },
            objToSkipInJSON
        };
    }
    else {
        return {
            parts: { type: 'pure-json', json: o }
        };
    }
}
function combineObjectParts({ json, byteArrays, byteArrayPlacesInJson, passedByReference, refdObjPlaceInJson }) {
    if (byteArrays) {
        for (let i = 0; i < byteArrayPlacesInJson.length; i += 1) {
            setValueIn(json, byteArrayPlacesInJson[i].place, byteArrays[i]);
        }
    }
    if (passedByReference) {
        for (let i = 0; i < refdObjPlaceInJson.length; i += 1) {
            setValueIn(json, refdObjPlaceInJson[i], passedByReference[i]);
        }
    }
    return json;
}
function setValueIn(o, path, value) {
    let parent = o;
    for (let i = 0; i < (path.length - 1); i += 1) {
        parent = parent[path[i]];
    }
    parent[path[path.length - 1]] = value;
}

},{"../buffer-utils":20}],27:[function(require,module,exports){
/*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.common = (function() {

    /**
     * Namespace common.
     * @exports common
     * @namespace
     */
    var common = {};

    common.ObjectReference = (function() {

        /**
         * Properties of an ObjectReference.
         * @memberof common
         * @interface IObjectReference
         * @property {string|null} [objType] ObjectReference objType
         * @property {Array.<string>|null} [path] ObjectReference path
         */

        /**
         * Constructs a new ObjectReference.
         * @memberof common
         * @classdesc Represents an ObjectReference.
         * @implements IObjectReference
         * @constructor
         * @param {common.IObjectReference=} [properties] Properties to set
         */
        function ObjectReference(properties) {
            this.path = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ObjectReference objType.
         * @member {string} objType
         * @memberof common.ObjectReference
         * @instance
         */
        ObjectReference.prototype.objType = "";

        /**
         * ObjectReference path.
         * @member {Array.<string>} path
         * @memberof common.ObjectReference
         * @instance
         */
        ObjectReference.prototype.path = $util.emptyArray;

        /**
         * Creates a new ObjectReference instance using the specified properties.
         * @function create
         * @memberof common.ObjectReference
         * @static
         * @param {common.IObjectReference=} [properties] Properties to set
         * @returns {common.ObjectReference} ObjectReference instance
         */
        ObjectReference.create = function create(properties) {
            return new ObjectReference(properties);
        };

        /**
         * Encodes the specified ObjectReference message. Does not implicitly {@link common.ObjectReference.verify|verify} messages.
         * @function encode
         * @memberof common.ObjectReference
         * @static
         * @param {common.IObjectReference} message ObjectReference message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ObjectReference.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.objType != null && Object.hasOwnProperty.call(message, "objType"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.objType);
            if (message.path != null && message.path.length)
                for (var i = 0; i < message.path.length; ++i)
                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.path[i]);
            return writer;
        };

        /**
         * Encodes the specified ObjectReference message, length delimited. Does not implicitly {@link common.ObjectReference.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.ObjectReference
         * @static
         * @param {common.IObjectReference} message ObjectReference message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ObjectReference.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an ObjectReference message from the specified reader or buffer.
         * @function decode
         * @memberof common.ObjectReference
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.ObjectReference} ObjectReference
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ObjectReference.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ObjectReference();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.objType = reader.string();
                        break;
                    }
                case 2: {
                        if (!(message.path && message.path.length))
                            message.path = [];
                        message.path.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an ObjectReference message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.ObjectReference
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.ObjectReference} ObjectReference
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ObjectReference.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an ObjectReference message.
         * @function verify
         * @memberof common.ObjectReference
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ObjectReference.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.objType != null && Object.hasOwnProperty.call(message, "objType"))
                if (!$util.isString(message.objType))
                    return "objType: string expected";
            if (message.path != null && Object.hasOwnProperty.call(message, "path")) {
                if (!Array.isArray(message.path))
                    return "path: array expected";
                for (var i = 0; i < message.path.length; ++i)
                    if (!$util.isString(message.path[i]))
                        return "path: string[] expected";
            }
            return null;
        };

        /**
         * Creates an ObjectReference message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.ObjectReference
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.ObjectReference} ObjectReference
         */
        ObjectReference.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.ObjectReference)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.ObjectReference: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.ObjectReference();
            if (object.objType != null)
                message.objType = String(object.objType);
            if (object.path) {
                if (!Array.isArray(object.path))
                    throw TypeError(".common.ObjectReference.path: array expected");
                message.path = [];
                for (var i = 0; i < object.path.length; ++i)
                    message.path[i] = String(object.path[i]);
            }
            return message;
        };

        /**
         * Creates a plain object from an ObjectReference message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.ObjectReference
         * @static
         * @param {common.ObjectReference} message ObjectReference
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ObjectReference.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.path = [];
            if (options.defaults)
                object.objType = "";
            if (message.objType != null && Object.hasOwnProperty.call(message, "objType"))
                object.objType = message.objType;
            if (message.path && message.path.length) {
                object.path = [];
                for (var j = 0; j < message.path.length; ++j)
                    object.path[j] = message.path[j];
            }
            return object;
        };

        /**
         * Converts this ObjectReference to JSON.
         * @function toJSON
         * @memberof common.ObjectReference
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ObjectReference.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ObjectReference
         * @function getTypeUrl
         * @memberof common.ObjectReference
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ObjectReference.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.ObjectReference";
        };

        return ObjectReference;
    })();

    common.BooleanValue = (function() {

        /**
         * Properties of a BooleanValue.
         * @memberof common
         * @interface IBooleanValue
         * @property {boolean|null} [value] BooleanValue value
         */

        /**
         * Constructs a new BooleanValue.
         * @memberof common
         * @classdesc Represents a BooleanValue.
         * @implements IBooleanValue
         * @constructor
         * @param {common.IBooleanValue=} [properties] Properties to set
         */
        function BooleanValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * BooleanValue value.
         * @member {boolean} value
         * @memberof common.BooleanValue
         * @instance
         */
        BooleanValue.prototype.value = false;

        /**
         * Creates a new BooleanValue instance using the specified properties.
         * @function create
         * @memberof common.BooleanValue
         * @static
         * @param {common.IBooleanValue=} [properties] Properties to set
         * @returns {common.BooleanValue} BooleanValue instance
         */
        BooleanValue.create = function create(properties) {
            return new BooleanValue(properties);
        };

        /**
         * Encodes the specified BooleanValue message. Does not implicitly {@link common.BooleanValue.verify|verify} messages.
         * @function encode
         * @memberof common.BooleanValue
         * @static
         * @param {common.IBooleanValue} message BooleanValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BooleanValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 0 =*/8).bool(message.value);
            return writer;
        };

        /**
         * Encodes the specified BooleanValue message, length delimited. Does not implicitly {@link common.BooleanValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.BooleanValue
         * @static
         * @param {common.IBooleanValue} message BooleanValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BooleanValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a BooleanValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.BooleanValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.BooleanValue} BooleanValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BooleanValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BooleanValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.bool();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a BooleanValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.BooleanValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.BooleanValue} BooleanValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BooleanValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a BooleanValue message.
         * @function verify
         * @memberof common.BooleanValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        BooleanValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (typeof message.value !== "boolean")
                    return "value: boolean expected";
            return null;
        };

        /**
         * Creates a BooleanValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.BooleanValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.BooleanValue} BooleanValue
         */
        BooleanValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.BooleanValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.BooleanValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.BooleanValue();
            if (object.value != null)
                message.value = Boolean(object.value);
            return message;
        };

        /**
         * Creates a plain object from a BooleanValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.BooleanValue
         * @static
         * @param {common.BooleanValue} message BooleanValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        BooleanValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.value = false;
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = message.value;
            return object;
        };

        /**
         * Converts this BooleanValue to JSON.
         * @function toJSON
         * @memberof common.BooleanValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        BooleanValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for BooleanValue
         * @function getTypeUrl
         * @memberof common.BooleanValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        BooleanValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.BooleanValue";
        };

        return BooleanValue;
    })();

    common.StringArrayValue = (function() {

        /**
         * Properties of a StringArrayValue.
         * @memberof common
         * @interface IStringArrayValue
         * @property {Array.<string>|null} [values] StringArrayValue values
         */

        /**
         * Constructs a new StringArrayValue.
         * @memberof common
         * @classdesc Represents a StringArrayValue.
         * @implements IStringArrayValue
         * @constructor
         * @param {common.IStringArrayValue=} [properties] Properties to set
         */
        function StringArrayValue(properties) {
            this.values = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * StringArrayValue values.
         * @member {Array.<string>} values
         * @memberof common.StringArrayValue
         * @instance
         */
        StringArrayValue.prototype.values = $util.emptyArray;

        /**
         * Creates a new StringArrayValue instance using the specified properties.
         * @function create
         * @memberof common.StringArrayValue
         * @static
         * @param {common.IStringArrayValue=} [properties] Properties to set
         * @returns {common.StringArrayValue} StringArrayValue instance
         */
        StringArrayValue.create = function create(properties) {
            return new StringArrayValue(properties);
        };

        /**
         * Encodes the specified StringArrayValue message. Does not implicitly {@link common.StringArrayValue.verify|verify} messages.
         * @function encode
         * @memberof common.StringArrayValue
         * @static
         * @param {common.IStringArrayValue} message StringArrayValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringArrayValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.values != null && message.values.length)
                for (var i = 0; i < message.values.length; ++i)
                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.values[i]);
            return writer;
        };

        /**
         * Encodes the specified StringArrayValue message, length delimited. Does not implicitly {@link common.StringArrayValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.StringArrayValue
         * @static
         * @param {common.IStringArrayValue} message StringArrayValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringArrayValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a StringArrayValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.StringArrayValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.StringArrayValue} StringArrayValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringArrayValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringArrayValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.values && message.values.length))
                            message.values = [];
                        message.values.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a StringArrayValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.StringArrayValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.StringArrayValue} StringArrayValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringArrayValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a StringArrayValue message.
         * @function verify
         * @memberof common.StringArrayValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        StringArrayValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.values != null && Object.hasOwnProperty.call(message, "values")) {
                if (!Array.isArray(message.values))
                    return "values: array expected";
                for (var i = 0; i < message.values.length; ++i)
                    if (!$util.isString(message.values[i]))
                        return "values: string[] expected";
            }
            return null;
        };

        /**
         * Creates a StringArrayValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.StringArrayValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.StringArrayValue} StringArrayValue
         */
        StringArrayValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.StringArrayValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.StringArrayValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.StringArrayValue();
            if (object.values) {
                if (!Array.isArray(object.values))
                    throw TypeError(".common.StringArrayValue.values: array expected");
                message.values = [];
                for (var i = 0; i < object.values.length; ++i)
                    message.values[i] = String(object.values[i]);
            }
            return message;
        };

        /**
         * Creates a plain object from a StringArrayValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.StringArrayValue
         * @static
         * @param {common.StringArrayValue} message StringArrayValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        StringArrayValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.values = [];
            if (message.values && message.values.length) {
                object.values = [];
                for (var j = 0; j < message.values.length; ++j)
                    object.values[j] = message.values[j];
            }
            return object;
        };

        /**
         * Converts this StringArrayValue to JSON.
         * @function toJSON
         * @memberof common.StringArrayValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        StringArrayValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for StringArrayValue
         * @function getTypeUrl
         * @memberof common.StringArrayValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        StringArrayValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.StringArrayValue";
        };

        return StringArrayValue;
    })();

    common.UInt64Value = (function() {

        /**
         * Properties of a UInt64Value.
         * @memberof common
         * @interface IUInt64Value
         * @property {number|Long|null} [value] UInt64Value value
         */

        /**
         * Constructs a new UInt64Value.
         * @memberof common
         * @classdesc Represents a UInt64Value.
         * @implements IUInt64Value
         * @constructor
         * @param {common.IUInt64Value=} [properties] Properties to set
         */
        function UInt64Value(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * UInt64Value value.
         * @member {number|Long} value
         * @memberof common.UInt64Value
         * @instance
         */
        UInt64Value.prototype.value = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new UInt64Value instance using the specified properties.
         * @function create
         * @memberof common.UInt64Value
         * @static
         * @param {common.IUInt64Value=} [properties] Properties to set
         * @returns {common.UInt64Value} UInt64Value instance
         */
        UInt64Value.create = function create(properties) {
            return new UInt64Value(properties);
        };

        /**
         * Encodes the specified UInt64Value message. Does not implicitly {@link common.UInt64Value.verify|verify} messages.
         * @function encode
         * @memberof common.UInt64Value
         * @static
         * @param {common.IUInt64Value} message UInt64Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt64Value.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.value);
            return writer;
        };

        /**
         * Encodes the specified UInt64Value message, length delimited. Does not implicitly {@link common.UInt64Value.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.UInt64Value
         * @static
         * @param {common.IUInt64Value} message UInt64Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt64Value.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a UInt64Value message from the specified reader or buffer.
         * @function decode
         * @memberof common.UInt64Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.UInt64Value} UInt64Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt64Value.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt64Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a UInt64Value message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.UInt64Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.UInt64Value} UInt64Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt64Value.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a UInt64Value message.
         * @function verify
         * @memberof common.UInt64Value
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        UInt64Value.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!$util.isInteger(message.value) && !(message.value && $util.isInteger(message.value.low) && $util.isInteger(message.value.high)))
                    return "value: integer|Long expected";
            return null;
        };

        /**
         * Creates a UInt64Value message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.UInt64Value
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.UInt64Value} UInt64Value
         */
        UInt64Value.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.UInt64Value)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.UInt64Value: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.UInt64Value();
            if (object.value != null)
                if ($util.Long)
                    message.value = $util.Long.fromValue(object.value, true);
                else if (typeof object.value === "string")
                    message.value = parseInt(object.value, 10);
                else if (typeof object.value === "number")
                    message.value = object.value;
                else if (typeof object.value === "object")
                    message.value = new $util.LongBits(object.value.low >>> 0, object.value.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from a UInt64Value message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.UInt64Value
         * @static
         * @param {common.UInt64Value} message UInt64Value
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        UInt64Value.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.value = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.value = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.value = typeof message.value === "number" ? BigInt(message.value) : $util.Long.fromBits(message.value.low >>> 0, message.value.high >>> 0, true).toBigInt();
                else if (typeof message.value === "number")
                    object.value = options.longs === String ? String(message.value) : message.value;
                else
                    object.value = options.longs === String ? $util.Long.prototype.toString.call(message.value) : options.longs === Number ? new $util.LongBits(message.value.low >>> 0, message.value.high >>> 0).toNumber(true) : message.value;
            return object;
        };

        /**
         * Converts this UInt64Value to JSON.
         * @function toJSON
         * @memberof common.UInt64Value
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        UInt64Value.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for UInt64Value
         * @function getTypeUrl
         * @memberof common.UInt64Value
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        UInt64Value.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.UInt64Value";
        };

        return UInt64Value;
    })();

    common.UInt32Value = (function() {

        /**
         * Properties of a UInt32Value.
         * @memberof common
         * @interface IUInt32Value
         * @property {number|null} [value] UInt32Value value
         */

        /**
         * Constructs a new UInt32Value.
         * @memberof common
         * @classdesc Represents a UInt32Value.
         * @implements IUInt32Value
         * @constructor
         * @param {common.IUInt32Value=} [properties] Properties to set
         */
        function UInt32Value(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * UInt32Value value.
         * @member {number} value
         * @memberof common.UInt32Value
         * @instance
         */
        UInt32Value.prototype.value = 0;

        /**
         * Creates a new UInt32Value instance using the specified properties.
         * @function create
         * @memberof common.UInt32Value
         * @static
         * @param {common.IUInt32Value=} [properties] Properties to set
         * @returns {common.UInt32Value} UInt32Value instance
         */
        UInt32Value.create = function create(properties) {
            return new UInt32Value(properties);
        };

        /**
         * Encodes the specified UInt32Value message. Does not implicitly {@link common.UInt32Value.verify|verify} messages.
         * @function encode
         * @memberof common.UInt32Value
         * @static
         * @param {common.IUInt32Value} message UInt32Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt32Value.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.value);
            return writer;
        };

        /**
         * Encodes the specified UInt32Value message, length delimited. Does not implicitly {@link common.UInt32Value.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.UInt32Value
         * @static
         * @param {common.IUInt32Value} message UInt32Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt32Value.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a UInt32Value message from the specified reader or buffer.
         * @function decode
         * @memberof common.UInt32Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.UInt32Value} UInt32Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt32Value.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt32Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.uint32();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a UInt32Value message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.UInt32Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.UInt32Value} UInt32Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt32Value.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a UInt32Value message.
         * @function verify
         * @memberof common.UInt32Value
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        UInt32Value.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!$util.isInteger(message.value))
                    return "value: integer expected";
            return null;
        };

        /**
         * Creates a UInt32Value message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.UInt32Value
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.UInt32Value} UInt32Value
         */
        UInt32Value.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.UInt32Value)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.UInt32Value: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.UInt32Value();
            if (object.value != null)
                message.value = object.value >>> 0;
            return message;
        };

        /**
         * Creates a plain object from a UInt32Value message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.UInt32Value
         * @static
         * @param {common.UInt32Value} message UInt32Value
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        UInt32Value.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.value = 0;
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = message.value;
            return object;
        };

        /**
         * Converts this UInt32Value to JSON.
         * @function toJSON
         * @memberof common.UInt32Value
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        UInt32Value.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for UInt32Value
         * @function getTypeUrl
         * @memberof common.UInt32Value
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        UInt32Value.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.UInt32Value";
        };

        return UInt32Value;
    })();

    common.StringValue = (function() {

        /**
         * Properties of a StringValue.
         * @memberof common
         * @interface IStringValue
         * @property {string|null} [value] StringValue value
         */

        /**
         * Constructs a new StringValue.
         * @memberof common
         * @classdesc Represents a StringValue.
         * @implements IStringValue
         * @constructor
         * @param {common.IStringValue=} [properties] Properties to set
         */
        function StringValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * StringValue value.
         * @member {string} value
         * @memberof common.StringValue
         * @instance
         */
        StringValue.prototype.value = "";

        /**
         * Creates a new StringValue instance using the specified properties.
         * @function create
         * @memberof common.StringValue
         * @static
         * @param {common.IStringValue=} [properties] Properties to set
         * @returns {common.StringValue} StringValue instance
         */
        StringValue.create = function create(properties) {
            return new StringValue(properties);
        };

        /**
         * Encodes the specified StringValue message. Does not implicitly {@link common.StringValue.verify|verify} messages.
         * @function encode
         * @memberof common.StringValue
         * @static
         * @param {common.IStringValue} message StringValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.value);
            return writer;
        };

        /**
         * Encodes the specified StringValue message, length delimited. Does not implicitly {@link common.StringValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.StringValue
         * @static
         * @param {common.IStringValue} message StringValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a StringValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.StringValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.StringValue} StringValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a StringValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.StringValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.StringValue} StringValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a StringValue message.
         * @function verify
         * @memberof common.StringValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        StringValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!$util.isString(message.value))
                    return "value: string expected";
            return null;
        };

        /**
         * Creates a StringValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.StringValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.StringValue} StringValue
         */
        StringValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.StringValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.StringValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.StringValue();
            if (object.value != null)
                message.value = String(object.value);
            return message;
        };

        /**
         * Creates a plain object from a StringValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.StringValue
         * @static
         * @param {common.StringValue} message StringValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        StringValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.value = "";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = message.value;
            return object;
        };

        /**
         * Converts this StringValue to JSON.
         * @function toJSON
         * @memberof common.StringValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        StringValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for StringValue
         * @function getTypeUrl
         * @memberof common.StringValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        StringValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.StringValue";
        };

        return StringValue;
    })();

    common.BytesValue = (function() {

        /**
         * Properties of a BytesValue.
         * @memberof common
         * @interface IBytesValue
         * @property {Uint8Array|null} [value] BytesValue value
         */

        /**
         * Constructs a new BytesValue.
         * @memberof common
         * @classdesc Represents a BytesValue.
         * @implements IBytesValue
         * @constructor
         * @param {common.IBytesValue=} [properties] Properties to set
         */
        function BytesValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * BytesValue value.
         * @member {Uint8Array} value
         * @memberof common.BytesValue
         * @instance
         */
        BytesValue.prototype.value = $util.newBuffer([]);

        /**
         * Creates a new BytesValue instance using the specified properties.
         * @function create
         * @memberof common.BytesValue
         * @static
         * @param {common.IBytesValue=} [properties] Properties to set
         * @returns {common.BytesValue} BytesValue instance
         */
        BytesValue.create = function create(properties) {
            return new BytesValue(properties);
        };

        /**
         * Encodes the specified BytesValue message. Does not implicitly {@link common.BytesValue.verify|verify} messages.
         * @function encode
         * @memberof common.BytesValue
         * @static
         * @param {common.IBytesValue} message BytesValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BytesValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.value);
            return writer;
        };

        /**
         * Encodes the specified BytesValue message, length delimited. Does not implicitly {@link common.BytesValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.BytesValue
         * @static
         * @param {common.IBytesValue} message BytesValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BytesValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a BytesValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.BytesValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.BytesValue} BytesValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BytesValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BytesValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.bytes();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a BytesValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.BytesValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.BytesValue} BytesValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BytesValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a BytesValue message.
         * @function verify
         * @memberof common.BytesValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        BytesValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!(message.value && typeof message.value.length === "number" || $util.isString(message.value)))
                    return "value: buffer expected";
            return null;
        };

        /**
         * Creates a BytesValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.BytesValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.BytesValue} BytesValue
         */
        BytesValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.BytesValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.BytesValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.BytesValue();
            if (object.value != null)
                if (typeof object.value === "string")
                    $util.base64.decode(object.value, message.value = $util.newBuffer($util.base64.length(object.value)), 0);
                else if (object.value.length >= 0)
                    message.value = object.value;
            return message;
        };

        /**
         * Creates a plain object from a BytesValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.BytesValue
         * @static
         * @param {common.BytesValue} message BytesValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        BytesValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if (options.bytes === String)
                    object.value = "";
                else {
                    object.value = [];
                    if (options.bytes !== Array)
                        object.value = $util.newBuffer(object.value);
                }
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = options.bytes === String ? $util.base64.encode(message.value, 0, message.value.length) : options.bytes === Array ? Array.prototype.slice.call(message.value) : message.value;
            return object;
        };

        /**
         * Converts this BytesValue to JSON.
         * @function toJSON
         * @memberof common.BytesValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        BytesValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for BytesValue
         * @function getTypeUrl
         * @memberof common.BytesValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        BytesValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.BytesValue";
        };

        return BytesValue;
    })();

    common.ErrorValue = (function() {

        /**
         * Properties of an ErrorValue.
         * @memberof common
         * @interface IErrorValue
         * @property {string|null} [runtimeExcJson] ErrorValue runtimeExcJson
         * @property {string|null} [err] ErrorValue err
         */

        /**
         * Constructs a new ErrorValue.
         * @memberof common
         * @classdesc Represents an ErrorValue.
         * @implements IErrorValue
         * @constructor
         * @param {common.IErrorValue=} [properties] Properties to set
         */
        function ErrorValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ErrorValue runtimeExcJson.
         * @member {string} runtimeExcJson
         * @memberof common.ErrorValue
         * @instance
         */
        ErrorValue.prototype.runtimeExcJson = "";

        /**
         * ErrorValue err.
         * @member {string} err
         * @memberof common.ErrorValue
         * @instance
         */
        ErrorValue.prototype.err = "";

        /**
         * Creates a new ErrorValue instance using the specified properties.
         * @function create
         * @memberof common.ErrorValue
         * @static
         * @param {common.IErrorValue=} [properties] Properties to set
         * @returns {common.ErrorValue} ErrorValue instance
         */
        ErrorValue.create = function create(properties) {
            return new ErrorValue(properties);
        };

        /**
         * Encodes the specified ErrorValue message. Does not implicitly {@link common.ErrorValue.verify|verify} messages.
         * @function encode
         * @memberof common.ErrorValue
         * @static
         * @param {common.IErrorValue} message ErrorValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ErrorValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.runtimeExcJson != null && Object.hasOwnProperty.call(message, "runtimeExcJson"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.runtimeExcJson);
            if (message.err != null && Object.hasOwnProperty.call(message, "err"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.err);
            return writer;
        };

        /**
         * Encodes the specified ErrorValue message, length delimited. Does not implicitly {@link common.ErrorValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.ErrorValue
         * @static
         * @param {common.IErrorValue} message ErrorValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ErrorValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an ErrorValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.ErrorValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.ErrorValue} ErrorValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ErrorValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ErrorValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.runtimeExcJson = reader.string();
                        break;
                    }
                case 2: {
                        message.err = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an ErrorValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.ErrorValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.ErrorValue} ErrorValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ErrorValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an ErrorValue message.
         * @function verify
         * @memberof common.ErrorValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ErrorValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.runtimeExcJson != null && Object.hasOwnProperty.call(message, "runtimeExcJson"))
                if (!$util.isString(message.runtimeExcJson))
                    return "runtimeExcJson: string expected";
            if (message.err != null && Object.hasOwnProperty.call(message, "err"))
                if (!$util.isString(message.err))
                    return "err: string expected";
            return null;
        };

        /**
         * Creates an ErrorValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.ErrorValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.ErrorValue} ErrorValue
         */
        ErrorValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.ErrorValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.ErrorValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.ErrorValue();
            if (object.runtimeExcJson != null)
                message.runtimeExcJson = String(object.runtimeExcJson);
            if (object.err != null)
                message.err = String(object.err);
            return message;
        };

        /**
         * Creates a plain object from an ErrorValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.ErrorValue
         * @static
         * @param {common.ErrorValue} message ErrorValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ErrorValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.runtimeExcJson = "";
                object.err = "";
            }
            if (message.runtimeExcJson != null && Object.hasOwnProperty.call(message, "runtimeExcJson"))
                object.runtimeExcJson = message.runtimeExcJson;
            if (message.err != null && Object.hasOwnProperty.call(message, "err"))
                object.err = message.err;
            return object;
        };

        /**
         * Converts this ErrorValue to JSON.
         * @function toJSON
         * @memberof common.ErrorValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ErrorValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ErrorValue
         * @function getTypeUrl
         * @memberof common.ErrorValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ErrorValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.ErrorValue";
        };

        return ErrorValue;
    })();

    common.AnyValue = (function() {

        /**
         * Properties of an AnyValue.
         * @memberof common
         * @interface IAnyValue
         * @property {string|null} [type] AnyValue type
         * @property {common.IStringValue|null} [json] AnyValue json
         * @property {common.IBytesValue|null} [bytes] AnyValue bytes
         */

        /**
         * Constructs a new AnyValue.
         * @memberof common
         * @classdesc Represents an AnyValue.
         * @implements IAnyValue
         * @constructor
         * @param {common.IAnyValue=} [properties] Properties to set
         */
        function AnyValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * AnyValue type.
         * @member {string} type
         * @memberof common.AnyValue
         * @instance
         */
        AnyValue.prototype.type = "";

        /**
         * AnyValue json.
         * @member {common.IStringValue|null|undefined} json
         * @memberof common.AnyValue
         * @instance
         */
        AnyValue.prototype.json = null;

        /**
         * AnyValue bytes.
         * @member {common.IBytesValue|null|undefined} bytes
         * @memberof common.AnyValue
         * @instance
         */
        AnyValue.prototype.bytes = null;

        /**
         * Creates a new AnyValue instance using the specified properties.
         * @function create
         * @memberof common.AnyValue
         * @static
         * @param {common.IAnyValue=} [properties] Properties to set
         * @returns {common.AnyValue} AnyValue instance
         */
        AnyValue.create = function create(properties) {
            return new AnyValue(properties);
        };

        /**
         * Encodes the specified AnyValue message. Does not implicitly {@link common.AnyValue.verify|verify} messages.
         * @function encode
         * @memberof common.AnyValue
         * @static
         * @param {common.IAnyValue} message AnyValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AnyValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.type);
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified AnyValue message, length delimited. Does not implicitly {@link common.AnyValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.AnyValue
         * @static
         * @param {common.IAnyValue} message AnyValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AnyValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an AnyValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.AnyValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.AnyValue} AnyValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AnyValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.AnyValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.type = reader.string();
                        break;
                    }
                case 2: {
                        message.json = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an AnyValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.AnyValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.AnyValue} AnyValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AnyValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an AnyValue message.
         * @function verify
         * @memberof common.AnyValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        AnyValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.json != null && Object.hasOwnProperty.call(message, "json")) {
                var error = $root.common.StringValue.verify(message.json, long + 1);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes, long + 1);
                if (error)
                    return "bytes." + error;
            }
            return null;
        };

        /**
         * Creates an AnyValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.AnyValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.AnyValue} AnyValue
         */
        AnyValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.AnyValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.AnyValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.AnyValue();
            if (object.type != null)
                message.type = String(object.type);
            if (object.json != null) {
                if (!$util.isObject(object.json))
                    throw TypeError(".common.AnyValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json, long + 1);
            }
            if (object.bytes != null) {
                if (!$util.isObject(object.bytes))
                    throw TypeError(".common.AnyValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an AnyValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.AnyValue
         * @static
         * @param {common.AnyValue} message AnyValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        AnyValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.json = null;
                object.bytes = null;
            }
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                object.type = message.type;
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = $root.common.StringValue.toObject(message.json, options, q + 1);
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options, q + 1);
            return object;
        };

        /**
         * Converts this AnyValue to JSON.
         * @function toJSON
         * @memberof common.AnyValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        AnyValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for AnyValue
         * @function getTypeUrl
         * @memberof common.AnyValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        AnyValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.AnyValue";
        };

        return AnyValue;
    })();

    return common;
})();

module.exports = $root;

},{"protobufjs/minimal":84}],28:[function(require,module,exports){
/*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.file = (function() {

    /**
     * Namespace file.
     * @exports file
     * @namespace
     */
    var file = {};

    file.File = (function() {

        /**
         * Properties of a File.
         * @memberof file
         * @interface IFile
         * @property {boolean|null} [writable] File writable
         * @property {boolean|null} [isVersioned] File isVersioned
         * @property {string|null} [name] File name
         * @property {boolean|null} [isNew] File isNew
         * @property {common.IObjectReference|null} [impl] File impl
         * @property {boolean|null} [isSynced] File isSynced
         */

        /**
         * Constructs a new File.
         * @memberof file
         * @classdesc Represents a File.
         * @implements IFile
         * @constructor
         * @param {file.IFile=} [properties] Properties to set
         */
        function File(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * File writable.
         * @member {boolean} writable
         * @memberof file.File
         * @instance
         */
        File.prototype.writable = false;

        /**
         * File isVersioned.
         * @member {boolean} isVersioned
         * @memberof file.File
         * @instance
         */
        File.prototype.isVersioned = false;

        /**
         * File name.
         * @member {string} name
         * @memberof file.File
         * @instance
         */
        File.prototype.name = "";

        /**
         * File isNew.
         * @member {boolean} isNew
         * @memberof file.File
         * @instance
         */
        File.prototype.isNew = false;

        /**
         * File impl.
         * @member {common.IObjectReference|null|undefined} impl
         * @memberof file.File
         * @instance
         */
        File.prototype.impl = null;

        /**
         * File isSynced.
         * @member {boolean} isSynced
         * @memberof file.File
         * @instance
         */
        File.prototype.isSynced = false;

        /**
         * Creates a new File instance using the specified properties.
         * @function create
         * @memberof file.File
         * @static
         * @param {file.IFile=} [properties] Properties to set
         * @returns {file.File} File instance
         */
        File.create = function create(properties) {
            return new File(properties);
        };

        /**
         * Encodes the specified File message. Does not implicitly {@link file.File.verify|verify} messages.
         * @function encode
         * @memberof file.File
         * @static
         * @param {file.IFile} message File message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        File.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.writable != null && Object.hasOwnProperty.call(message, "writable"))
                writer.uint32(/* id 1, wireType 0 =*/8).bool(message.writable);
            if (message.isVersioned != null && Object.hasOwnProperty.call(message, "isVersioned"))
                writer.uint32(/* id 2, wireType 0 =*/16).bool(message.isVersioned);
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                writer.uint32(/* id 3, wireType 2 =*/26).string(message.name);
            if (message.isNew != null && Object.hasOwnProperty.call(message, "isNew"))
                writer.uint32(/* id 4, wireType 0 =*/32).bool(message.isNew);
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl"))
                $root.common.ObjectReference.encode(message.impl, writer.uint32(/* id 5, wireType 2 =*/42).fork(), q + 1).ldelim();
            if (message.isSynced != null && Object.hasOwnProperty.call(message, "isSynced"))
                writer.uint32(/* id 6, wireType 0 =*/48).bool(message.isSynced);
            return writer;
        };

        /**
         * Encodes the specified File message, length delimited. Does not implicitly {@link file.File.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.File
         * @static
         * @param {file.IFile} message File message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        File.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a File message from the specified reader or buffer.
         * @function decode
         * @memberof file.File
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.File} File
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        File.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.File();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.writable = reader.bool();
                        break;
                    }
                case 2: {
                        message.isVersioned = reader.bool();
                        break;
                    }
                case 3: {
                        message.name = reader.string();
                        break;
                    }
                case 4: {
                        message.isNew = reader.bool();
                        break;
                    }
                case 5: {
                        message.impl = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 6: {
                        message.isSynced = reader.bool();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a File message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.File
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.File} File
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        File.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a File message.
         * @function verify
         * @memberof file.File
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        File.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.writable != null && Object.hasOwnProperty.call(message, "writable"))
                if (typeof message.writable !== "boolean")
                    return "writable: boolean expected";
            if (message.isVersioned != null && Object.hasOwnProperty.call(message, "isVersioned"))
                if (typeof message.isVersioned !== "boolean")
                    return "isVersioned: boolean expected";
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.isNew != null && Object.hasOwnProperty.call(message, "isNew"))
                if (typeof message.isNew !== "boolean")
                    return "isNew: boolean expected";
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl")) {
                var error = $root.common.ObjectReference.verify(message.impl, long + 1);
                if (error)
                    return "impl." + error;
            }
            if (message.isSynced != null && Object.hasOwnProperty.call(message, "isSynced"))
                if (typeof message.isSynced !== "boolean")
                    return "isSynced: boolean expected";
            return null;
        };

        /**
         * Creates a File message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.File
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.File} File
         */
        File.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.File)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.File: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.File();
            if (object.writable != null)
                message.writable = Boolean(object.writable);
            if (object.isVersioned != null)
                message.isVersioned = Boolean(object.isVersioned);
            if (object.name != null)
                message.name = String(object.name);
            if (object.isNew != null)
                message.isNew = Boolean(object.isNew);
            if (object.impl != null) {
                if (!$util.isObject(object.impl))
                    throw TypeError(".file.File.impl: object expected");
                message.impl = $root.common.ObjectReference.fromObject(object.impl, long + 1);
            }
            if (object.isSynced != null)
                message.isSynced = Boolean(object.isSynced);
            return message;
        };

        /**
         * Creates a plain object from a File message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.File
         * @static
         * @param {file.File} message File
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        File.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.writable = false;
                object.isVersioned = false;
                object.name = "";
                object.isNew = false;
                object.impl = null;
                object.isSynced = false;
            }
            if (message.writable != null && Object.hasOwnProperty.call(message, "writable"))
                object.writable = message.writable;
            if (message.isVersioned != null && Object.hasOwnProperty.call(message, "isVersioned"))
                object.isVersioned = message.isVersioned;
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                object.name = message.name;
            if (message.isNew != null && Object.hasOwnProperty.call(message, "isNew"))
                object.isNew = message.isNew;
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl"))
                object.impl = $root.common.ObjectReference.toObject(message.impl, options, q + 1);
            if (message.isSynced != null && Object.hasOwnProperty.call(message, "isSynced"))
                object.isSynced = message.isSynced;
            return object;
        };

        /**
         * Converts this File to JSON.
         * @function toJSON
         * @memberof file.File
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        File.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for File
         * @function getTypeUrl
         * @memberof file.File
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        File.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.File";
        };

        return File;
    })();

    file.SyncStatusMsg = (function() {

        /**
         * Properties of a SyncStatusMsg.
         * @memberof file
         * @interface ISyncStatusMsg
         * @property {string|null} [state] SyncStatusMsg state
         * @property {file.ISyncVersionsBranchMsg|null} [local] SyncStatusMsg local
         * @property {file.ISyncVersionsBranchMsg|null} [synced] SyncStatusMsg synced
         * @property {file.ISyncVersionsBranchMsg|null} [remote] SyncStatusMsg remote
         * @property {common.IBooleanValue|null} [existsInSyncedParent] SyncStatusMsg existsInSyncedParent
         * @property {file.IUploadingStateMsg|null} [uploading] SyncStatusMsg uploading
         */

        /**
         * Constructs a new SyncStatusMsg.
         * @memberof file
         * @classdesc Represents a SyncStatusMsg.
         * @implements ISyncStatusMsg
         * @constructor
         * @param {file.ISyncStatusMsg=} [properties] Properties to set
         */
        function SyncStatusMsg(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * SyncStatusMsg state.
         * @member {string} state
         * @memberof file.SyncStatusMsg
         * @instance
         */
        SyncStatusMsg.prototype.state = "";

        /**
         * SyncStatusMsg local.
         * @member {file.ISyncVersionsBranchMsg|null|undefined} local
         * @memberof file.SyncStatusMsg
         * @instance
         */
        SyncStatusMsg.prototype.local = null;

        /**
         * SyncStatusMsg synced.
         * @member {file.ISyncVersionsBranchMsg|null|undefined} synced
         * @memberof file.SyncStatusMsg
         * @instance
         */
        SyncStatusMsg.prototype.synced = null;

        /**
         * SyncStatusMsg remote.
         * @member {file.ISyncVersionsBranchMsg|null|undefined} remote
         * @memberof file.SyncStatusMsg
         * @instance
         */
        SyncStatusMsg.prototype.remote = null;

        /**
         * SyncStatusMsg existsInSyncedParent.
         * @member {common.IBooleanValue|null|undefined} existsInSyncedParent
         * @memberof file.SyncStatusMsg
         * @instance
         */
        SyncStatusMsg.prototype.existsInSyncedParent = null;

        /**
         * SyncStatusMsg uploading.
         * @member {file.IUploadingStateMsg|null|undefined} uploading
         * @memberof file.SyncStatusMsg
         * @instance
         */
        SyncStatusMsg.prototype.uploading = null;

        /**
         * Creates a new SyncStatusMsg instance using the specified properties.
         * @function create
         * @memberof file.SyncStatusMsg
         * @static
         * @param {file.ISyncStatusMsg=} [properties] Properties to set
         * @returns {file.SyncStatusMsg} SyncStatusMsg instance
         */
        SyncStatusMsg.create = function create(properties) {
            return new SyncStatusMsg(properties);
        };

        /**
         * Encodes the specified SyncStatusMsg message. Does not implicitly {@link file.SyncStatusMsg.verify|verify} messages.
         * @function encode
         * @memberof file.SyncStatusMsg
         * @static
         * @param {file.ISyncStatusMsg} message SyncStatusMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SyncStatusMsg.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.state != null && Object.hasOwnProperty.call(message, "state"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.state);
            if (message.local != null && Object.hasOwnProperty.call(message, "local"))
                $root.file.SyncVersionsBranchMsg.encode(message.local, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.synced != null && Object.hasOwnProperty.call(message, "synced"))
                $root.file.SyncVersionsBranchMsg.encode(message.synced, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                $root.file.SyncVersionsBranchMsg.encode(message.remote, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            if (message.existsInSyncedParent != null && Object.hasOwnProperty.call(message, "existsInSyncedParent"))
                $root.common.BooleanValue.encode(message.existsInSyncedParent, writer.uint32(/* id 5, wireType 2 =*/42).fork(), q + 1).ldelim();
            if (message.uploading != null && Object.hasOwnProperty.call(message, "uploading"))
                $root.file.UploadingStateMsg.encode(message.uploading, writer.uint32(/* id 6, wireType 2 =*/50).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified SyncStatusMsg message, length delimited. Does not implicitly {@link file.SyncStatusMsg.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.SyncStatusMsg
         * @static
         * @param {file.ISyncStatusMsg} message SyncStatusMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SyncStatusMsg.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a SyncStatusMsg message from the specified reader or buffer.
         * @function decode
         * @memberof file.SyncStatusMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.SyncStatusMsg} SyncStatusMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SyncStatusMsg.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.SyncStatusMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.state = reader.string();
                        break;
                    }
                case 2: {
                        message.local = $root.file.SyncVersionsBranchMsg.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.synced = $root.file.SyncVersionsBranchMsg.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.remote = $root.file.SyncVersionsBranchMsg.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 5: {
                        message.existsInSyncedParent = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 6: {
                        message.uploading = $root.file.UploadingStateMsg.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a SyncStatusMsg message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.SyncStatusMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.SyncStatusMsg} SyncStatusMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SyncStatusMsg.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a SyncStatusMsg message.
         * @function verify
         * @memberof file.SyncStatusMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        SyncStatusMsg.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.state != null && Object.hasOwnProperty.call(message, "state"))
                if (!$util.isString(message.state))
                    return "state: string expected";
            if (message.local != null && Object.hasOwnProperty.call(message, "local")) {
                var error = $root.file.SyncVersionsBranchMsg.verify(message.local, long + 1);
                if (error)
                    return "local." + error;
            }
            if (message.synced != null && Object.hasOwnProperty.call(message, "synced")) {
                var error = $root.file.SyncVersionsBranchMsg.verify(message.synced, long + 1);
                if (error)
                    return "synced." + error;
            }
            if (message.remote != null && Object.hasOwnProperty.call(message, "remote")) {
                var error = $root.file.SyncVersionsBranchMsg.verify(message.remote, long + 1);
                if (error)
                    return "remote." + error;
            }
            if (message.existsInSyncedParent != null && Object.hasOwnProperty.call(message, "existsInSyncedParent")) {
                var error = $root.common.BooleanValue.verify(message.existsInSyncedParent, long + 1);
                if (error)
                    return "existsInSyncedParent." + error;
            }
            if (message.uploading != null && Object.hasOwnProperty.call(message, "uploading")) {
                var error = $root.file.UploadingStateMsg.verify(message.uploading, long + 1);
                if (error)
                    return "uploading." + error;
            }
            return null;
        };

        /**
         * Creates a SyncStatusMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.SyncStatusMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.SyncStatusMsg} SyncStatusMsg
         */
        SyncStatusMsg.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.SyncStatusMsg)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.SyncStatusMsg: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.SyncStatusMsg();
            if (object.state != null)
                message.state = String(object.state);
            if (object.local != null) {
                if (!$util.isObject(object.local))
                    throw TypeError(".file.SyncStatusMsg.local: object expected");
                message.local = $root.file.SyncVersionsBranchMsg.fromObject(object.local, long + 1);
            }
            if (object.synced != null) {
                if (!$util.isObject(object.synced))
                    throw TypeError(".file.SyncStatusMsg.synced: object expected");
                message.synced = $root.file.SyncVersionsBranchMsg.fromObject(object.synced, long + 1);
            }
            if (object.remote != null) {
                if (!$util.isObject(object.remote))
                    throw TypeError(".file.SyncStatusMsg.remote: object expected");
                message.remote = $root.file.SyncVersionsBranchMsg.fromObject(object.remote, long + 1);
            }
            if (object.existsInSyncedParent != null) {
                if (!$util.isObject(object.existsInSyncedParent))
                    throw TypeError(".file.SyncStatusMsg.existsInSyncedParent: object expected");
                message.existsInSyncedParent = $root.common.BooleanValue.fromObject(object.existsInSyncedParent, long + 1);
            }
            if (object.uploading != null) {
                if (!$util.isObject(object.uploading))
                    throw TypeError(".file.SyncStatusMsg.uploading: object expected");
                message.uploading = $root.file.UploadingStateMsg.fromObject(object.uploading, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a SyncStatusMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.SyncStatusMsg
         * @static
         * @param {file.SyncStatusMsg} message SyncStatusMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        SyncStatusMsg.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.state = "";
                object.local = null;
                object.synced = null;
                object.remote = null;
                object.existsInSyncedParent = null;
                object.uploading = null;
            }
            if (message.state != null && Object.hasOwnProperty.call(message, "state"))
                object.state = message.state;
            if (message.local != null && Object.hasOwnProperty.call(message, "local"))
                object.local = $root.file.SyncVersionsBranchMsg.toObject(message.local, options, q + 1);
            if (message.synced != null && Object.hasOwnProperty.call(message, "synced"))
                object.synced = $root.file.SyncVersionsBranchMsg.toObject(message.synced, options, q + 1);
            if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                object.remote = $root.file.SyncVersionsBranchMsg.toObject(message.remote, options, q + 1);
            if (message.existsInSyncedParent != null && Object.hasOwnProperty.call(message, "existsInSyncedParent"))
                object.existsInSyncedParent = $root.common.BooleanValue.toObject(message.existsInSyncedParent, options, q + 1);
            if (message.uploading != null && Object.hasOwnProperty.call(message, "uploading"))
                object.uploading = $root.file.UploadingStateMsg.toObject(message.uploading, options, q + 1);
            return object;
        };

        /**
         * Converts this SyncStatusMsg to JSON.
         * @function toJSON
         * @memberof file.SyncStatusMsg
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        SyncStatusMsg.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for SyncStatusMsg
         * @function getTypeUrl
         * @memberof file.SyncStatusMsg
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        SyncStatusMsg.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.SyncStatusMsg";
        };

        return SyncStatusMsg;
    })();

    file.SyncVersionsBranchMsg = (function() {

        /**
         * Properties of a SyncVersionsBranchMsg.
         * @memberof file
         * @interface ISyncVersionsBranchMsg
         * @property {common.IUInt64Value|null} [latest] SyncVersionsBranchMsg latest
         * @property {Array.<number|Long>|null} [archived] SyncVersionsBranchMsg archived
         * @property {common.IBooleanValue|null} [isArchived] SyncVersionsBranchMsg isArchived
         */

        /**
         * Constructs a new SyncVersionsBranchMsg.
         * @memberof file
         * @classdesc Represents a SyncVersionsBranchMsg.
         * @implements ISyncVersionsBranchMsg
         * @constructor
         * @param {file.ISyncVersionsBranchMsg=} [properties] Properties to set
         */
        function SyncVersionsBranchMsg(properties) {
            this.archived = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * SyncVersionsBranchMsg latest.
         * @member {common.IUInt64Value|null|undefined} latest
         * @memberof file.SyncVersionsBranchMsg
         * @instance
         */
        SyncVersionsBranchMsg.prototype.latest = null;

        /**
         * SyncVersionsBranchMsg archived.
         * @member {Array.<number|Long>} archived
         * @memberof file.SyncVersionsBranchMsg
         * @instance
         */
        SyncVersionsBranchMsg.prototype.archived = $util.emptyArray;

        /**
         * SyncVersionsBranchMsg isArchived.
         * @member {common.IBooleanValue|null|undefined} isArchived
         * @memberof file.SyncVersionsBranchMsg
         * @instance
         */
        SyncVersionsBranchMsg.prototype.isArchived = null;

        /**
         * Creates a new SyncVersionsBranchMsg instance using the specified properties.
         * @function create
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {file.ISyncVersionsBranchMsg=} [properties] Properties to set
         * @returns {file.SyncVersionsBranchMsg} SyncVersionsBranchMsg instance
         */
        SyncVersionsBranchMsg.create = function create(properties) {
            return new SyncVersionsBranchMsg(properties);
        };

        /**
         * Encodes the specified SyncVersionsBranchMsg message. Does not implicitly {@link file.SyncVersionsBranchMsg.verify|verify} messages.
         * @function encode
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {file.ISyncVersionsBranchMsg} message SyncVersionsBranchMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SyncVersionsBranchMsg.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.latest != null && Object.hasOwnProperty.call(message, "latest"))
                $root.common.UInt64Value.encode(message.latest, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.archived != null && message.archived.length) {
                writer.uint32(/* id 2, wireType 2 =*/18).fork();
                for (var i = 0; i < message.archived.length; ++i)
                    writer.uint64(message.archived[i]);
                writer.ldelim();
            }
            if (message.isArchived != null && Object.hasOwnProperty.call(message, "isArchived"))
                $root.common.BooleanValue.encode(message.isArchived, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified SyncVersionsBranchMsg message, length delimited. Does not implicitly {@link file.SyncVersionsBranchMsg.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {file.ISyncVersionsBranchMsg} message SyncVersionsBranchMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SyncVersionsBranchMsg.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a SyncVersionsBranchMsg message from the specified reader or buffer.
         * @function decode
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.SyncVersionsBranchMsg} SyncVersionsBranchMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SyncVersionsBranchMsg.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.SyncVersionsBranchMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.latest = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        if (!(message.archived && message.archived.length))
                            message.archived = [];
                        if ((tag & 7) === 2) {
                            var end2 = reader.uint32() + reader.pos;
                            while (reader.pos < end2)
                                message.archived.push(reader.uint64());
                        } else
                            message.archived.push(reader.uint64());
                        break;
                    }
                case 3: {
                        message.isArchived = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a SyncVersionsBranchMsg message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.SyncVersionsBranchMsg} SyncVersionsBranchMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SyncVersionsBranchMsg.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a SyncVersionsBranchMsg message.
         * @function verify
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        SyncVersionsBranchMsg.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.latest != null && Object.hasOwnProperty.call(message, "latest")) {
                var error = $root.common.UInt64Value.verify(message.latest, long + 1);
                if (error)
                    return "latest." + error;
            }
            if (message.archived != null && Object.hasOwnProperty.call(message, "archived")) {
                if (!Array.isArray(message.archived))
                    return "archived: array expected";
                for (var i = 0; i < message.archived.length; ++i)
                    if (!$util.isInteger(message.archived[i]) && !(message.archived[i] && $util.isInteger(message.archived[i].low) && $util.isInteger(message.archived[i].high)))
                        return "archived: integer|Long[] expected";
            }
            if (message.isArchived != null && Object.hasOwnProperty.call(message, "isArchived")) {
                var error = $root.common.BooleanValue.verify(message.isArchived, long + 1);
                if (error)
                    return "isArchived." + error;
            }
            return null;
        };

        /**
         * Creates a SyncVersionsBranchMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.SyncVersionsBranchMsg} SyncVersionsBranchMsg
         */
        SyncVersionsBranchMsg.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.SyncVersionsBranchMsg)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.SyncVersionsBranchMsg: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.SyncVersionsBranchMsg();
            if (object.latest != null) {
                if (!$util.isObject(object.latest))
                    throw TypeError(".file.SyncVersionsBranchMsg.latest: object expected");
                message.latest = $root.common.UInt64Value.fromObject(object.latest, long + 1);
            }
            if (object.archived) {
                if (!Array.isArray(object.archived))
                    throw TypeError(".file.SyncVersionsBranchMsg.archived: array expected");
                message.archived = [];
                for (var i = 0; i < object.archived.length; ++i)
                    if ($util.Long)
                        message.archived[i] = $util.Long.fromValue(object.archived[i], true);
                    else if (typeof object.archived[i] === "string")
                        message.archived[i] = parseInt(object.archived[i], 10);
                    else if (typeof object.archived[i] === "number")
                        message.archived[i] = object.archived[i];
                    else if (typeof object.archived[i] === "object")
                        message.archived[i] = new $util.LongBits(object.archived[i].low >>> 0, object.archived[i].high >>> 0).toNumber(true);
            }
            if (object.isArchived != null) {
                if (!$util.isObject(object.isArchived))
                    throw TypeError(".file.SyncVersionsBranchMsg.isArchived: object expected");
                message.isArchived = $root.common.BooleanValue.fromObject(object.isArchived, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a SyncVersionsBranchMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {file.SyncVersionsBranchMsg} message SyncVersionsBranchMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        SyncVersionsBranchMsg.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.archived = [];
            if (options.defaults) {
                object.latest = null;
                object.isArchived = null;
            }
            if (message.latest != null && Object.hasOwnProperty.call(message, "latest"))
                object.latest = $root.common.UInt64Value.toObject(message.latest, options, q + 1);
            if (message.archived && message.archived.length) {
                object.archived = [];
                for (var j = 0; j < message.archived.length; ++j)
                    if (typeof BigInt !== "undefined" && options.longs === BigInt)
                        object.archived[j] = typeof message.archived[j] === "number" ? BigInt(message.archived[j]) : $util.Long.fromBits(message.archived[j].low >>> 0, message.archived[j].high >>> 0, true).toBigInt();
                    else if (typeof message.archived[j] === "number")
                        object.archived[j] = options.longs === String ? String(message.archived[j]) : message.archived[j];
                    else
                        object.archived[j] = options.longs === String ? $util.Long.prototype.toString.call(message.archived[j]) : options.longs === Number ? new $util.LongBits(message.archived[j].low >>> 0, message.archived[j].high >>> 0).toNumber(true) : message.archived[j];
            }
            if (message.isArchived != null && Object.hasOwnProperty.call(message, "isArchived"))
                object.isArchived = $root.common.BooleanValue.toObject(message.isArchived, options, q + 1);
            return object;
        };

        /**
         * Converts this SyncVersionsBranchMsg to JSON.
         * @function toJSON
         * @memberof file.SyncVersionsBranchMsg
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        SyncVersionsBranchMsg.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for SyncVersionsBranchMsg
         * @function getTypeUrl
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        SyncVersionsBranchMsg.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.SyncVersionsBranchMsg";
        };

        return SyncVersionsBranchMsg;
    })();

    file.UploadingStateMsg = (function() {

        /**
         * Properties of an UploadingStateMsg.
         * @memberof file
         * @interface IUploadingStateMsg
         * @property {number|Long|null} [localVersion] UploadingStateMsg localVersion
         * @property {number|Long|null} [remoteVersion] UploadingStateMsg remoteVersion
         * @property {number|Long|null} [bytesLeftToUpload] UploadingStateMsg bytesLeftToUpload
         * @property {boolean|null} [uploadStarted] UploadingStateMsg uploadStarted
         */

        /**
         * Constructs a new UploadingStateMsg.
         * @memberof file
         * @classdesc Represents an UploadingStateMsg.
         * @implements IUploadingStateMsg
         * @constructor
         * @param {file.IUploadingStateMsg=} [properties] Properties to set
         */
        function UploadingStateMsg(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * UploadingStateMsg localVersion.
         * @member {number|Long} localVersion
         * @memberof file.UploadingStateMsg
         * @instance
         */
        UploadingStateMsg.prototype.localVersion = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * UploadingStateMsg remoteVersion.
         * @member {number|Long} remoteVersion
         * @memberof file.UploadingStateMsg
         * @instance
         */
        UploadingStateMsg.prototype.remoteVersion = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * UploadingStateMsg bytesLeftToUpload.
         * @member {number|Long} bytesLeftToUpload
         * @memberof file.UploadingStateMsg
         * @instance
         */
        UploadingStateMsg.prototype.bytesLeftToUpload = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * UploadingStateMsg uploadStarted.
         * @member {boolean} uploadStarted
         * @memberof file.UploadingStateMsg
         * @instance
         */
        UploadingStateMsg.prototype.uploadStarted = false;

        /**
         * Creates a new UploadingStateMsg instance using the specified properties.
         * @function create
         * @memberof file.UploadingStateMsg
         * @static
         * @param {file.IUploadingStateMsg=} [properties] Properties to set
         * @returns {file.UploadingStateMsg} UploadingStateMsg instance
         */
        UploadingStateMsg.create = function create(properties) {
            return new UploadingStateMsg(properties);
        };

        /**
         * Encodes the specified UploadingStateMsg message. Does not implicitly {@link file.UploadingStateMsg.verify|verify} messages.
         * @function encode
         * @memberof file.UploadingStateMsg
         * @static
         * @param {file.IUploadingStateMsg} message UploadingStateMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UploadingStateMsg.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.localVersion);
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.remoteVersion);
            if (message.bytesLeftToUpload != null && Object.hasOwnProperty.call(message, "bytesLeftToUpload"))
                writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.bytesLeftToUpload);
            if (message.uploadStarted != null && Object.hasOwnProperty.call(message, "uploadStarted"))
                writer.uint32(/* id 4, wireType 0 =*/32).bool(message.uploadStarted);
            return writer;
        };

        /**
         * Encodes the specified UploadingStateMsg message, length delimited. Does not implicitly {@link file.UploadingStateMsg.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.UploadingStateMsg
         * @static
         * @param {file.IUploadingStateMsg} message UploadingStateMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UploadingStateMsg.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an UploadingStateMsg message from the specified reader or buffer.
         * @function decode
         * @memberof file.UploadingStateMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.UploadingStateMsg} UploadingStateMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UploadingStateMsg.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.UploadingStateMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.localVersion = reader.uint64();
                        break;
                    }
                case 2: {
                        message.remoteVersion = reader.uint64();
                        break;
                    }
                case 3: {
                        message.bytesLeftToUpload = reader.uint64();
                        break;
                    }
                case 4: {
                        message.uploadStarted = reader.bool();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an UploadingStateMsg message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.UploadingStateMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.UploadingStateMsg} UploadingStateMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UploadingStateMsg.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an UploadingStateMsg message.
         * @function verify
         * @memberof file.UploadingStateMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        UploadingStateMsg.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                if (!$util.isInteger(message.localVersion) && !(message.localVersion && $util.isInteger(message.localVersion.low) && $util.isInteger(message.localVersion.high)))
                    return "localVersion: integer|Long expected";
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                if (!$util.isInteger(message.remoteVersion) && !(message.remoteVersion && $util.isInteger(message.remoteVersion.low) && $util.isInteger(message.remoteVersion.high)))
                    return "remoteVersion: integer|Long expected";
            if (message.bytesLeftToUpload != null && Object.hasOwnProperty.call(message, "bytesLeftToUpload"))
                if (!$util.isInteger(message.bytesLeftToUpload) && !(message.bytesLeftToUpload && $util.isInteger(message.bytesLeftToUpload.low) && $util.isInteger(message.bytesLeftToUpload.high)))
                    return "bytesLeftToUpload: integer|Long expected";
            if (message.uploadStarted != null && Object.hasOwnProperty.call(message, "uploadStarted"))
                if (typeof message.uploadStarted !== "boolean")
                    return "uploadStarted: boolean expected";
            return null;
        };

        /**
         * Creates an UploadingStateMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.UploadingStateMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.UploadingStateMsg} UploadingStateMsg
         */
        UploadingStateMsg.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.UploadingStateMsg)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.UploadingStateMsg: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.UploadingStateMsg();
            if (object.localVersion != null)
                if ($util.Long)
                    message.localVersion = $util.Long.fromValue(object.localVersion, true);
                else if (typeof object.localVersion === "string")
                    message.localVersion = parseInt(object.localVersion, 10);
                else if (typeof object.localVersion === "number")
                    message.localVersion = object.localVersion;
                else if (typeof object.localVersion === "object")
                    message.localVersion = new $util.LongBits(object.localVersion.low >>> 0, object.localVersion.high >>> 0).toNumber(true);
            if (object.remoteVersion != null)
                if ($util.Long)
                    message.remoteVersion = $util.Long.fromValue(object.remoteVersion, true);
                else if (typeof object.remoteVersion === "string")
                    message.remoteVersion = parseInt(object.remoteVersion, 10);
                else if (typeof object.remoteVersion === "number")
                    message.remoteVersion = object.remoteVersion;
                else if (typeof object.remoteVersion === "object")
                    message.remoteVersion = new $util.LongBits(object.remoteVersion.low >>> 0, object.remoteVersion.high >>> 0).toNumber(true);
            if (object.bytesLeftToUpload != null)
                if ($util.Long)
                    message.bytesLeftToUpload = $util.Long.fromValue(object.bytesLeftToUpload, true);
                else if (typeof object.bytesLeftToUpload === "string")
                    message.bytesLeftToUpload = parseInt(object.bytesLeftToUpload, 10);
                else if (typeof object.bytesLeftToUpload === "number")
                    message.bytesLeftToUpload = object.bytesLeftToUpload;
                else if (typeof object.bytesLeftToUpload === "object")
                    message.bytesLeftToUpload = new $util.LongBits(object.bytesLeftToUpload.low >>> 0, object.bytesLeftToUpload.high >>> 0).toNumber(true);
            if (object.uploadStarted != null)
                message.uploadStarted = Boolean(object.uploadStarted);
            return message;
        };

        /**
         * Creates a plain object from an UploadingStateMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.UploadingStateMsg
         * @static
         * @param {file.UploadingStateMsg} message UploadingStateMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        UploadingStateMsg.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.localVersion = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.localVersion = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.remoteVersion = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.remoteVersion = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.bytesLeftToUpload = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.bytesLeftToUpload = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.uploadStarted = false;
            }
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.localVersion = typeof message.localVersion === "number" ? BigInt(message.localVersion) : $util.Long.fromBits(message.localVersion.low >>> 0, message.localVersion.high >>> 0, true).toBigInt();
                else if (typeof message.localVersion === "number")
                    object.localVersion = options.longs === String ? String(message.localVersion) : message.localVersion;
                else
                    object.localVersion = options.longs === String ? $util.Long.prototype.toString.call(message.localVersion) : options.longs === Number ? new $util.LongBits(message.localVersion.low >>> 0, message.localVersion.high >>> 0).toNumber(true) : message.localVersion;
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.remoteVersion = typeof message.remoteVersion === "number" ? BigInt(message.remoteVersion) : $util.Long.fromBits(message.remoteVersion.low >>> 0, message.remoteVersion.high >>> 0, true).toBigInt();
                else if (typeof message.remoteVersion === "number")
                    object.remoteVersion = options.longs === String ? String(message.remoteVersion) : message.remoteVersion;
                else
                    object.remoteVersion = options.longs === String ? $util.Long.prototype.toString.call(message.remoteVersion) : options.longs === Number ? new $util.LongBits(message.remoteVersion.low >>> 0, message.remoteVersion.high >>> 0).toNumber(true) : message.remoteVersion;
            if (message.bytesLeftToUpload != null && Object.hasOwnProperty.call(message, "bytesLeftToUpload"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.bytesLeftToUpload = typeof message.bytesLeftToUpload === "number" ? BigInt(message.bytesLeftToUpload) : $util.Long.fromBits(message.bytesLeftToUpload.low >>> 0, message.bytesLeftToUpload.high >>> 0, true).toBigInt();
                else if (typeof message.bytesLeftToUpload === "number")
                    object.bytesLeftToUpload = options.longs === String ? String(message.bytesLeftToUpload) : message.bytesLeftToUpload;
                else
                    object.bytesLeftToUpload = options.longs === String ? $util.Long.prototype.toString.call(message.bytesLeftToUpload) : options.longs === Number ? new $util.LongBits(message.bytesLeftToUpload.low >>> 0, message.bytesLeftToUpload.high >>> 0).toNumber(true) : message.bytesLeftToUpload;
            if (message.uploadStarted != null && Object.hasOwnProperty.call(message, "uploadStarted"))
                object.uploadStarted = message.uploadStarted;
            return object;
        };

        /**
         * Converts this UploadingStateMsg to JSON.
         * @function toJSON
         * @memberof file.UploadingStateMsg
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        UploadingStateMsg.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for UploadingStateMsg
         * @function getTypeUrl
         * @memberof file.UploadingStateMsg
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        UploadingStateMsg.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.UploadingStateMsg";
        };

        return UploadingStateMsg;
    })();

    file.StatsMsg = (function() {

        /**
         * Properties of a StatsMsg.
         * @memberof file
         * @interface IStatsMsg
         * @property {common.IBooleanValue|null} [isFile] StatsMsg isFile
         * @property {common.IBooleanValue|null} [isFolder] StatsMsg isFolder
         * @property {common.IBooleanValue|null} [isLink] StatsMsg isLink
         * @property {boolean|null} [writable] StatsMsg writable
         * @property {common.IUInt64Value|null} [size] StatsMsg size
         * @property {common.IUInt64Value|null} [mtime] StatsMsg mtime
         * @property {common.IUInt64Value|null} [ctime] StatsMsg ctime
         * @property {common.IUInt64Value|null} [version] StatsMsg version
         * @property {common.IUInt64Value|null} [bytesNeedDownload] StatsMsg bytesNeedDownload
         * @property {common.IStringValue|null} [versionSyncBranch] StatsMsg versionSyncBranch
         */

        /**
         * Constructs a new StatsMsg.
         * @memberof file
         * @classdesc Represents a StatsMsg.
         * @implements IStatsMsg
         * @constructor
         * @param {file.IStatsMsg=} [properties] Properties to set
         */
        function StatsMsg(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * StatsMsg isFile.
         * @member {common.IBooleanValue|null|undefined} isFile
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.isFile = null;

        /**
         * StatsMsg isFolder.
         * @member {common.IBooleanValue|null|undefined} isFolder
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.isFolder = null;

        /**
         * StatsMsg isLink.
         * @member {common.IBooleanValue|null|undefined} isLink
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.isLink = null;

        /**
         * StatsMsg writable.
         * @member {boolean} writable
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.writable = false;

        /**
         * StatsMsg size.
         * @member {common.IUInt64Value|null|undefined} size
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.size = null;

        /**
         * StatsMsg mtime.
         * @member {common.IUInt64Value|null|undefined} mtime
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.mtime = null;

        /**
         * StatsMsg ctime.
         * @member {common.IUInt64Value|null|undefined} ctime
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.ctime = null;

        /**
         * StatsMsg version.
         * @member {common.IUInt64Value|null|undefined} version
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.version = null;

        /**
         * StatsMsg bytesNeedDownload.
         * @member {common.IUInt64Value|null|undefined} bytesNeedDownload
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.bytesNeedDownload = null;

        /**
         * StatsMsg versionSyncBranch.
         * @member {common.IStringValue|null|undefined} versionSyncBranch
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.versionSyncBranch = null;

        /**
         * Creates a new StatsMsg instance using the specified properties.
         * @function create
         * @memberof file.StatsMsg
         * @static
         * @param {file.IStatsMsg=} [properties] Properties to set
         * @returns {file.StatsMsg} StatsMsg instance
         */
        StatsMsg.create = function create(properties) {
            return new StatsMsg(properties);
        };

        /**
         * Encodes the specified StatsMsg message. Does not implicitly {@link file.StatsMsg.verify|verify} messages.
         * @function encode
         * @memberof file.StatsMsg
         * @static
         * @param {file.IStatsMsg} message StatsMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StatsMsg.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                $root.common.BooleanValue.encode(message.isFile, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                $root.common.BooleanValue.encode(message.isFolder, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink"))
                $root.common.BooleanValue.encode(message.isLink, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.writable != null && Object.hasOwnProperty.call(message, "writable"))
                writer.uint32(/* id 4, wireType 0 =*/32).bool(message.writable);
            if (message.size != null && Object.hasOwnProperty.call(message, "size"))
                $root.common.UInt64Value.encode(message.size, writer.uint32(/* id 5, wireType 2 =*/42).fork(), q + 1).ldelim();
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime"))
                $root.common.UInt64Value.encode(message.mtime, writer.uint32(/* id 6, wireType 2 =*/50).fork(), q + 1).ldelim();
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime"))
                $root.common.UInt64Value.encode(message.ctime, writer.uint32(/* id 7, wireType 2 =*/58).fork(), q + 1).ldelim();
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                $root.common.UInt64Value.encode(message.version, writer.uint32(/* id 8, wireType 2 =*/66).fork(), q + 1).ldelim();
            if (message.bytesNeedDownload != null && Object.hasOwnProperty.call(message, "bytesNeedDownload"))
                $root.common.UInt64Value.encode(message.bytesNeedDownload, writer.uint32(/* id 9, wireType 2 =*/74).fork(), q + 1).ldelim();
            if (message.versionSyncBranch != null && Object.hasOwnProperty.call(message, "versionSyncBranch"))
                $root.common.StringValue.encode(message.versionSyncBranch, writer.uint32(/* id 10, wireType 2 =*/82).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified StatsMsg message, length delimited. Does not implicitly {@link file.StatsMsg.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.StatsMsg
         * @static
         * @param {file.IStatsMsg} message StatsMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StatsMsg.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a StatsMsg message from the specified reader or buffer.
         * @function decode
         * @memberof file.StatsMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.StatsMsg} StatsMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StatsMsg.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.StatsMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.isFile = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.isFolder = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.isLink = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.writable = reader.bool();
                        break;
                    }
                case 5: {
                        message.size = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 6: {
                        message.mtime = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 7: {
                        message.ctime = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 8: {
                        message.version = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 9: {
                        message.bytesNeedDownload = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 10: {
                        message.versionSyncBranch = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a StatsMsg message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.StatsMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.StatsMsg} StatsMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StatsMsg.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a StatsMsg message.
         * @function verify
         * @memberof file.StatsMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        StatsMsg.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile")) {
                var error = $root.common.BooleanValue.verify(message.isFile, long + 1);
                if (error)
                    return "isFile." + error;
            }
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder")) {
                var error = $root.common.BooleanValue.verify(message.isFolder, long + 1);
                if (error)
                    return "isFolder." + error;
            }
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink")) {
                var error = $root.common.BooleanValue.verify(message.isLink, long + 1);
                if (error)
                    return "isLink." + error;
            }
            if (message.writable != null && Object.hasOwnProperty.call(message, "writable"))
                if (typeof message.writable !== "boolean")
                    return "writable: boolean expected";
            if (message.size != null && Object.hasOwnProperty.call(message, "size")) {
                var error = $root.common.UInt64Value.verify(message.size, long + 1);
                if (error)
                    return "size." + error;
            }
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime")) {
                var error = $root.common.UInt64Value.verify(message.mtime, long + 1);
                if (error)
                    return "mtime." + error;
            }
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime")) {
                var error = $root.common.UInt64Value.verify(message.ctime, long + 1);
                if (error)
                    return "ctime." + error;
            }
            if (message.version != null && Object.hasOwnProperty.call(message, "version")) {
                var error = $root.common.UInt64Value.verify(message.version, long + 1);
                if (error)
                    return "version." + error;
            }
            if (message.bytesNeedDownload != null && Object.hasOwnProperty.call(message, "bytesNeedDownload")) {
                var error = $root.common.UInt64Value.verify(message.bytesNeedDownload, long + 1);
                if (error)
                    return "bytesNeedDownload." + error;
            }
            if (message.versionSyncBranch != null && Object.hasOwnProperty.call(message, "versionSyncBranch")) {
                var error = $root.common.StringValue.verify(message.versionSyncBranch, long + 1);
                if (error)
                    return "versionSyncBranch." + error;
            }
            return null;
        };

        /**
         * Creates a StatsMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.StatsMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.StatsMsg} StatsMsg
         */
        StatsMsg.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.StatsMsg)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.StatsMsg: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.StatsMsg();
            if (object.isFile != null) {
                if (!$util.isObject(object.isFile))
                    throw TypeError(".file.StatsMsg.isFile: object expected");
                message.isFile = $root.common.BooleanValue.fromObject(object.isFile, long + 1);
            }
            if (object.isFolder != null) {
                if (!$util.isObject(object.isFolder))
                    throw TypeError(".file.StatsMsg.isFolder: object expected");
                message.isFolder = $root.common.BooleanValue.fromObject(object.isFolder, long + 1);
            }
            if (object.isLink != null) {
                if (!$util.isObject(object.isLink))
                    throw TypeError(".file.StatsMsg.isLink: object expected");
                message.isLink = $root.common.BooleanValue.fromObject(object.isLink, long + 1);
            }
            if (object.writable != null)
                message.writable = Boolean(object.writable);
            if (object.size != null) {
                if (!$util.isObject(object.size))
                    throw TypeError(".file.StatsMsg.size: object expected");
                message.size = $root.common.UInt64Value.fromObject(object.size, long + 1);
            }
            if (object.mtime != null) {
                if (!$util.isObject(object.mtime))
                    throw TypeError(".file.StatsMsg.mtime: object expected");
                message.mtime = $root.common.UInt64Value.fromObject(object.mtime, long + 1);
            }
            if (object.ctime != null) {
                if (!$util.isObject(object.ctime))
                    throw TypeError(".file.StatsMsg.ctime: object expected");
                message.ctime = $root.common.UInt64Value.fromObject(object.ctime, long + 1);
            }
            if (object.version != null) {
                if (!$util.isObject(object.version))
                    throw TypeError(".file.StatsMsg.version: object expected");
                message.version = $root.common.UInt64Value.fromObject(object.version, long + 1);
            }
            if (object.bytesNeedDownload != null) {
                if (!$util.isObject(object.bytesNeedDownload))
                    throw TypeError(".file.StatsMsg.bytesNeedDownload: object expected");
                message.bytesNeedDownload = $root.common.UInt64Value.fromObject(object.bytesNeedDownload, long + 1);
            }
            if (object.versionSyncBranch != null) {
                if (!$util.isObject(object.versionSyncBranch))
                    throw TypeError(".file.StatsMsg.versionSyncBranch: object expected");
                message.versionSyncBranch = $root.common.StringValue.fromObject(object.versionSyncBranch, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a StatsMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.StatsMsg
         * @static
         * @param {file.StatsMsg} message StatsMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        StatsMsg.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.isFile = null;
                object.isFolder = null;
                object.isLink = null;
                object.writable = false;
                object.size = null;
                object.mtime = null;
                object.ctime = null;
                object.version = null;
                object.bytesNeedDownload = null;
                object.versionSyncBranch = null;
            }
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                object.isFile = $root.common.BooleanValue.toObject(message.isFile, options, q + 1);
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                object.isFolder = $root.common.BooleanValue.toObject(message.isFolder, options, q + 1);
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink"))
                object.isLink = $root.common.BooleanValue.toObject(message.isLink, options, q + 1);
            if (message.writable != null && Object.hasOwnProperty.call(message, "writable"))
                object.writable = message.writable;
            if (message.size != null && Object.hasOwnProperty.call(message, "size"))
                object.size = $root.common.UInt64Value.toObject(message.size, options, q + 1);
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime"))
                object.mtime = $root.common.UInt64Value.toObject(message.mtime, options, q + 1);
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime"))
                object.ctime = $root.common.UInt64Value.toObject(message.ctime, options, q + 1);
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                object.version = $root.common.UInt64Value.toObject(message.version, options, q + 1);
            if (message.bytesNeedDownload != null && Object.hasOwnProperty.call(message, "bytesNeedDownload"))
                object.bytesNeedDownload = $root.common.UInt64Value.toObject(message.bytesNeedDownload, options, q + 1);
            if (message.versionSyncBranch != null && Object.hasOwnProperty.call(message, "versionSyncBranch"))
                object.versionSyncBranch = $root.common.StringValue.toObject(message.versionSyncBranch, options, q + 1);
            return object;
        };

        /**
         * Converts this StatsMsg to JSON.
         * @function toJSON
         * @memberof file.StatsMsg
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        StatsMsg.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for StatsMsg
         * @function getTypeUrl
         * @memberof file.StatsMsg
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        StatsMsg.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.StatsMsg";
        };

        return StatsMsg;
    })();

    file.GetXAttrRequestBody = (function() {

        /**
         * Properties of a GetXAttrRequestBody.
         * @memberof file
         * @interface IGetXAttrRequestBody
         * @property {string|null} [xaName] GetXAttrRequestBody xaName
         */

        /**
         * Constructs a new GetXAttrRequestBody.
         * @memberof file
         * @classdesc Represents a GetXAttrRequestBody.
         * @implements IGetXAttrRequestBody
         * @constructor
         * @param {file.IGetXAttrRequestBody=} [properties] Properties to set
         */
        function GetXAttrRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * GetXAttrRequestBody xaName.
         * @member {string} xaName
         * @memberof file.GetXAttrRequestBody
         * @instance
         */
        GetXAttrRequestBody.prototype.xaName = "";

        /**
         * Creates a new GetXAttrRequestBody instance using the specified properties.
         * @function create
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {file.IGetXAttrRequestBody=} [properties] Properties to set
         * @returns {file.GetXAttrRequestBody} GetXAttrRequestBody instance
         */
        GetXAttrRequestBody.create = function create(properties) {
            return new GetXAttrRequestBody(properties);
        };

        /**
         * Encodes the specified GetXAttrRequestBody message. Does not implicitly {@link file.GetXAttrRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {file.IGetXAttrRequestBody} message GetXAttrRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        GetXAttrRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.xaName);
            return writer;
        };

        /**
         * Encodes the specified GetXAttrRequestBody message, length delimited. Does not implicitly {@link file.GetXAttrRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {file.IGetXAttrRequestBody} message GetXAttrRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        GetXAttrRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a GetXAttrRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.GetXAttrRequestBody} GetXAttrRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        GetXAttrRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.GetXAttrRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.xaName = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a GetXAttrRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.GetXAttrRequestBody} GetXAttrRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        GetXAttrRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a GetXAttrRequestBody message.
         * @function verify
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        GetXAttrRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                if (!$util.isString(message.xaName))
                    return "xaName: string expected";
            return null;
        };

        /**
         * Creates a GetXAttrRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.GetXAttrRequestBody} GetXAttrRequestBody
         */
        GetXAttrRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.GetXAttrRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.GetXAttrRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.GetXAttrRequestBody();
            if (object.xaName != null)
                message.xaName = String(object.xaName);
            return message;
        };

        /**
         * Creates a plain object from a GetXAttrRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {file.GetXAttrRequestBody} message GetXAttrRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        GetXAttrRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.xaName = "";
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                object.xaName = message.xaName;
            return object;
        };

        /**
         * Converts this GetXAttrRequestBody to JSON.
         * @function toJSON
         * @memberof file.GetXAttrRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        GetXAttrRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for GetXAttrRequestBody
         * @function getTypeUrl
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        GetXAttrRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.GetXAttrRequestBody";
        };

        return GetXAttrRequestBody;
    })();

    file.XAttrValue = (function() {

        /**
         * Properties of a XAttrValue.
         * @memberof file
         * @interface IXAttrValue
         * @property {common.IStringValue|null} [str] XAttrValue str
         * @property {common.IStringValue|null} [json] XAttrValue json
         * @property {common.IBytesValue|null} [bytes] XAttrValue bytes
         */

        /**
         * Constructs a new XAttrValue.
         * @memberof file
         * @classdesc Represents a XAttrValue.
         * @implements IXAttrValue
         * @constructor
         * @param {file.IXAttrValue=} [properties] Properties to set
         */
        function XAttrValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * XAttrValue str.
         * @member {common.IStringValue|null|undefined} str
         * @memberof file.XAttrValue
         * @instance
         */
        XAttrValue.prototype.str = null;

        /**
         * XAttrValue json.
         * @member {common.IStringValue|null|undefined} json
         * @memberof file.XAttrValue
         * @instance
         */
        XAttrValue.prototype.json = null;

        /**
         * XAttrValue bytes.
         * @member {common.IBytesValue|null|undefined} bytes
         * @memberof file.XAttrValue
         * @instance
         */
        XAttrValue.prototype.bytes = null;

        /**
         * Creates a new XAttrValue instance using the specified properties.
         * @function create
         * @memberof file.XAttrValue
         * @static
         * @param {file.IXAttrValue=} [properties] Properties to set
         * @returns {file.XAttrValue} XAttrValue instance
         */
        XAttrValue.create = function create(properties) {
            return new XAttrValue(properties);
        };

        /**
         * Encodes the specified XAttrValue message. Does not implicitly {@link file.XAttrValue.verify|verify} messages.
         * @function encode
         * @memberof file.XAttrValue
         * @static
         * @param {file.IXAttrValue} message XAttrValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        XAttrValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.str != null && Object.hasOwnProperty.call(message, "str"))
                $root.common.StringValue.encode(message.str, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified XAttrValue message, length delimited. Does not implicitly {@link file.XAttrValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.XAttrValue
         * @static
         * @param {file.IXAttrValue} message XAttrValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        XAttrValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a XAttrValue message from the specified reader or buffer.
         * @function decode
         * @memberof file.XAttrValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.XAttrValue} XAttrValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        XAttrValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.XAttrValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.str = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.json = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a XAttrValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.XAttrValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.XAttrValue} XAttrValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        XAttrValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a XAttrValue message.
         * @function verify
         * @memberof file.XAttrValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        XAttrValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.str != null && Object.hasOwnProperty.call(message, "str")) {
                var error = $root.common.StringValue.verify(message.str, long + 1);
                if (error)
                    return "str." + error;
            }
            if (message.json != null && Object.hasOwnProperty.call(message, "json")) {
                var error = $root.common.StringValue.verify(message.json, long + 1);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes, long + 1);
                if (error)
                    return "bytes." + error;
            }
            return null;
        };

        /**
         * Creates a XAttrValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.XAttrValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.XAttrValue} XAttrValue
         */
        XAttrValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.XAttrValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.XAttrValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.XAttrValue();
            if (object.str != null) {
                if (!$util.isObject(object.str))
                    throw TypeError(".file.XAttrValue.str: object expected");
                message.str = $root.common.StringValue.fromObject(object.str, long + 1);
            }
            if (object.json != null) {
                if (!$util.isObject(object.json))
                    throw TypeError(".file.XAttrValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json, long + 1);
            }
            if (object.bytes != null) {
                if (!$util.isObject(object.bytes))
                    throw TypeError(".file.XAttrValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a XAttrValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.XAttrValue
         * @static
         * @param {file.XAttrValue} message XAttrValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        XAttrValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.str = null;
                object.json = null;
                object.bytes = null;
            }
            if (message.str != null && Object.hasOwnProperty.call(message, "str"))
                object.str = $root.common.StringValue.toObject(message.str, options, q + 1);
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = $root.common.StringValue.toObject(message.json, options, q + 1);
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options, q + 1);
            return object;
        };

        /**
         * Converts this XAttrValue to JSON.
         * @function toJSON
         * @memberof file.XAttrValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        XAttrValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for XAttrValue
         * @function getTypeUrl
         * @memberof file.XAttrValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        XAttrValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.XAttrValue";
        };

        return XAttrValue;
    })();

    file.ReadBytesRequestBody = (function() {

        /**
         * Properties of a ReadBytesRequestBody.
         * @memberof file
         * @interface IReadBytesRequestBody
         * @property {common.IUInt64Value|null} [start] ReadBytesRequestBody start
         * @property {common.IUInt64Value|null} [end] ReadBytesRequestBody end
         */

        /**
         * Constructs a new ReadBytesRequestBody.
         * @memberof file
         * @classdesc Represents a ReadBytesRequestBody.
         * @implements IReadBytesRequestBody
         * @constructor
         * @param {file.IReadBytesRequestBody=} [properties] Properties to set
         */
        function ReadBytesRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ReadBytesRequestBody start.
         * @member {common.IUInt64Value|null|undefined} start
         * @memberof file.ReadBytesRequestBody
         * @instance
         */
        ReadBytesRequestBody.prototype.start = null;

        /**
         * ReadBytesRequestBody end.
         * @member {common.IUInt64Value|null|undefined} end
         * @memberof file.ReadBytesRequestBody
         * @instance
         */
        ReadBytesRequestBody.prototype.end = null;

        /**
         * Creates a new ReadBytesRequestBody instance using the specified properties.
         * @function create
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {file.IReadBytesRequestBody=} [properties] Properties to set
         * @returns {file.ReadBytesRequestBody} ReadBytesRequestBody instance
         */
        ReadBytesRequestBody.create = function create(properties) {
            return new ReadBytesRequestBody(properties);
        };

        /**
         * Encodes the specified ReadBytesRequestBody message. Does not implicitly {@link file.ReadBytesRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {file.IReadBytesRequestBody} message ReadBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ReadBytesRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                $root.common.UInt64Value.encode(message.start, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                $root.common.UInt64Value.encode(message.end, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified ReadBytesRequestBody message, length delimited. Does not implicitly {@link file.ReadBytesRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {file.IReadBytesRequestBody} message ReadBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ReadBytesRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a ReadBytesRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.ReadBytesRequestBody} ReadBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ReadBytesRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ReadBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.start = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.end = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a ReadBytesRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.ReadBytesRequestBody} ReadBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ReadBytesRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a ReadBytesRequestBody message.
         * @function verify
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ReadBytesRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.start != null && Object.hasOwnProperty.call(message, "start")) {
                var error = $root.common.UInt64Value.verify(message.start, long + 1);
                if (error)
                    return "start." + error;
            }
            if (message.end != null && Object.hasOwnProperty.call(message, "end")) {
                var error = $root.common.UInt64Value.verify(message.end, long + 1);
                if (error)
                    return "end." + error;
            }
            return null;
        };

        /**
         * Creates a ReadBytesRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.ReadBytesRequestBody} ReadBytesRequestBody
         */
        ReadBytesRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.ReadBytesRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.ReadBytesRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.ReadBytesRequestBody();
            if (object.start != null) {
                if (!$util.isObject(object.start))
                    throw TypeError(".file.ReadBytesRequestBody.start: object expected");
                message.start = $root.common.UInt64Value.fromObject(object.start, long + 1);
            }
            if (object.end != null) {
                if (!$util.isObject(object.end))
                    throw TypeError(".file.ReadBytesRequestBody.end: object expected");
                message.end = $root.common.UInt64Value.fromObject(object.end, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a ReadBytesRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {file.ReadBytesRequestBody} message ReadBytesRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ReadBytesRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.start = null;
                object.end = null;
            }
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                object.start = $root.common.UInt64Value.toObject(message.start, options, q + 1);
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                object.end = $root.common.UInt64Value.toObject(message.end, options, q + 1);
            return object;
        };

        /**
         * Converts this ReadBytesRequestBody to JSON.
         * @function toJSON
         * @memberof file.ReadBytesRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ReadBytesRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ReadBytesRequestBody
         * @function getTypeUrl
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ReadBytesRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.ReadBytesRequestBody";
        };

        return ReadBytesRequestBody;
    })();

    file.ReadBytesReplyBody = (function() {

        /**
         * Properties of a ReadBytesReplyBody.
         * @memberof file
         * @interface IReadBytesReplyBody
         * @property {common.IBytesValue|null} [bytes] ReadBytesReplyBody bytes
         */

        /**
         * Constructs a new ReadBytesReplyBody.
         * @memberof file
         * @classdesc Represents a ReadBytesReplyBody.
         * @implements IReadBytesReplyBody
         * @constructor
         * @param {file.IReadBytesReplyBody=} [properties] Properties to set
         */
        function ReadBytesReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ReadBytesReplyBody bytes.
         * @member {common.IBytesValue|null|undefined} bytes
         * @memberof file.ReadBytesReplyBody
         * @instance
         */
        ReadBytesReplyBody.prototype.bytes = null;

        /**
         * Creates a new ReadBytesReplyBody instance using the specified properties.
         * @function create
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {file.IReadBytesReplyBody=} [properties] Properties to set
         * @returns {file.ReadBytesReplyBody} ReadBytesReplyBody instance
         */
        ReadBytesReplyBody.create = function create(properties) {
            return new ReadBytesReplyBody(properties);
        };

        /**
         * Encodes the specified ReadBytesReplyBody message. Does not implicitly {@link file.ReadBytesReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {file.IReadBytesReplyBody} message ReadBytesReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ReadBytesReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified ReadBytesReplyBody message, length delimited. Does not implicitly {@link file.ReadBytesReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {file.IReadBytesReplyBody} message ReadBytesReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ReadBytesReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a ReadBytesReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.ReadBytesReplyBody} ReadBytesReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ReadBytesReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ReadBytesReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a ReadBytesReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.ReadBytesReplyBody} ReadBytesReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ReadBytesReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a ReadBytesReplyBody message.
         * @function verify
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ReadBytesReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes, long + 1);
                if (error)
                    return "bytes." + error;
            }
            return null;
        };

        /**
         * Creates a ReadBytesReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.ReadBytesReplyBody} ReadBytesReplyBody
         */
        ReadBytesReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.ReadBytesReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.ReadBytesReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.ReadBytesReplyBody();
            if (object.bytes != null) {
                if (!$util.isObject(object.bytes))
                    throw TypeError(".file.ReadBytesReplyBody.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a ReadBytesReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {file.ReadBytesReplyBody} message ReadBytesReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ReadBytesReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.bytes = null;
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options, q + 1);
            return object;
        };

        /**
         * Converts this ReadBytesReplyBody to JSON.
         * @function toJSON
         * @memberof file.ReadBytesReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ReadBytesReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ReadBytesReplyBody
         * @function getTypeUrl
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ReadBytesReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.ReadBytesReplyBody";
        };

        return ReadBytesReplyBody;
    })();

    file.VersionedReadFlags = (function() {

        /**
         * Properties of a VersionedReadFlags.
         * @memberof file
         * @interface IVersionedReadFlags
         * @property {common.IUInt64Value|null} [archivedVersion] VersionedReadFlags archivedVersion
         * @property {common.IUInt64Value|null} [remoteVersion] VersionedReadFlags remoteVersion
         */

        /**
         * Constructs a new VersionedReadFlags.
         * @memberof file
         * @classdesc Represents a VersionedReadFlags.
         * @implements IVersionedReadFlags
         * @constructor
         * @param {file.IVersionedReadFlags=} [properties] Properties to set
         */
        function VersionedReadFlags(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedReadFlags archivedVersion.
         * @member {common.IUInt64Value|null|undefined} archivedVersion
         * @memberof file.VersionedReadFlags
         * @instance
         */
        VersionedReadFlags.prototype.archivedVersion = null;

        /**
         * VersionedReadFlags remoteVersion.
         * @member {common.IUInt64Value|null|undefined} remoteVersion
         * @memberof file.VersionedReadFlags
         * @instance
         */
        VersionedReadFlags.prototype.remoteVersion = null;

        /**
         * Creates a new VersionedReadFlags instance using the specified properties.
         * @function create
         * @memberof file.VersionedReadFlags
         * @static
         * @param {file.IVersionedReadFlags=} [properties] Properties to set
         * @returns {file.VersionedReadFlags} VersionedReadFlags instance
         */
        VersionedReadFlags.create = function create(properties) {
            return new VersionedReadFlags(properties);
        };

        /**
         * Encodes the specified VersionedReadFlags message. Does not implicitly {@link file.VersionedReadFlags.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedReadFlags
         * @static
         * @param {file.IVersionedReadFlags} message VersionedReadFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadFlags.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.archivedVersion != null && Object.hasOwnProperty.call(message, "archivedVersion"))
                $root.common.UInt64Value.encode(message.archivedVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedReadFlags message, length delimited. Does not implicitly {@link file.VersionedReadFlags.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedReadFlags
         * @static
         * @param {file.IVersionedReadFlags} message VersionedReadFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadFlags.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedReadFlags message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedReadFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedReadFlags} VersionedReadFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadFlags.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.archivedVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedReadFlags message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedReadFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedReadFlags} VersionedReadFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadFlags.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedReadFlags message.
         * @function verify
         * @memberof file.VersionedReadFlags
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedReadFlags.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.archivedVersion != null && Object.hasOwnProperty.call(message, "archivedVersion")) {
                var error = $root.common.UInt64Value.verify(message.archivedVersion, long + 1);
                if (error)
                    return "archivedVersion." + error;
            }
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion, long + 1);
                if (error)
                    return "remoteVersion." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedReadFlags message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedReadFlags
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedReadFlags} VersionedReadFlags
         */
        VersionedReadFlags.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedReadFlags)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedReadFlags: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedReadFlags();
            if (object.archivedVersion != null) {
                if (!$util.isObject(object.archivedVersion))
                    throw TypeError(".file.VersionedReadFlags.archivedVersion: object expected");
                message.archivedVersion = $root.common.UInt64Value.fromObject(object.archivedVersion, long + 1);
            }
            if (object.remoteVersion != null) {
                if (!$util.isObject(object.remoteVersion))
                    throw TypeError(".file.VersionedReadFlags.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedReadFlags message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedReadFlags
         * @static
         * @param {file.VersionedReadFlags} message VersionedReadFlags
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedReadFlags.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.archivedVersion = null;
                object.remoteVersion = null;
            }
            if (message.archivedVersion != null && Object.hasOwnProperty.call(message, "archivedVersion"))
                object.archivedVersion = $root.common.UInt64Value.toObject(message.archivedVersion, options, q + 1);
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedReadFlags to JSON.
         * @function toJSON
         * @memberof file.VersionedReadFlags
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedReadFlags.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedReadFlags
         * @function getTypeUrl
         * @memberof file.VersionedReadFlags
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedReadFlags.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedReadFlags";
        };

        return VersionedReadFlags;
    })();

    file.RequestWithVersionedReadFlags = (function() {

        /**
         * Properties of a RequestWithVersionedReadFlags.
         * @memberof file
         * @interface IRequestWithVersionedReadFlags
         * @property {file.IVersionedReadFlags|null} [flags] RequestWithVersionedReadFlags flags
         */

        /**
         * Constructs a new RequestWithVersionedReadFlags.
         * @memberof file
         * @classdesc Represents a RequestWithVersionedReadFlags.
         * @implements IRequestWithVersionedReadFlags
         * @constructor
         * @param {file.IRequestWithVersionedReadFlags=} [properties] Properties to set
         */
        function RequestWithVersionedReadFlags(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * RequestWithVersionedReadFlags flags.
         * @member {file.IVersionedReadFlags|null|undefined} flags
         * @memberof file.RequestWithVersionedReadFlags
         * @instance
         */
        RequestWithVersionedReadFlags.prototype.flags = null;

        /**
         * Creates a new RequestWithVersionedReadFlags instance using the specified properties.
         * @function create
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {file.IRequestWithVersionedReadFlags=} [properties] Properties to set
         * @returns {file.RequestWithVersionedReadFlags} RequestWithVersionedReadFlags instance
         */
        RequestWithVersionedReadFlags.create = function create(properties) {
            return new RequestWithVersionedReadFlags(properties);
        };

        /**
         * Encodes the specified RequestWithVersionedReadFlags message. Does not implicitly {@link file.RequestWithVersionedReadFlags.verify|verify} messages.
         * @function encode
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {file.IRequestWithVersionedReadFlags} message RequestWithVersionedReadFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        RequestWithVersionedReadFlags.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified RequestWithVersionedReadFlags message, length delimited. Does not implicitly {@link file.RequestWithVersionedReadFlags.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {file.IRequestWithVersionedReadFlags} message RequestWithVersionedReadFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        RequestWithVersionedReadFlags.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a RequestWithVersionedReadFlags message from the specified reader or buffer.
         * @function decode
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.RequestWithVersionedReadFlags} RequestWithVersionedReadFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        RequestWithVersionedReadFlags.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.RequestWithVersionedReadFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a RequestWithVersionedReadFlags message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.RequestWithVersionedReadFlags} RequestWithVersionedReadFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        RequestWithVersionedReadFlags.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a RequestWithVersionedReadFlags message.
         * @function verify
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        RequestWithVersionedReadFlags.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a RequestWithVersionedReadFlags message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.RequestWithVersionedReadFlags} RequestWithVersionedReadFlags
         */
        RequestWithVersionedReadFlags.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.RequestWithVersionedReadFlags)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.RequestWithVersionedReadFlags: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.RequestWithVersionedReadFlags();
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".file.RequestWithVersionedReadFlags.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a RequestWithVersionedReadFlags message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {file.RequestWithVersionedReadFlags} message RequestWithVersionedReadFlags
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        RequestWithVersionedReadFlags.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.flags = null;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this RequestWithVersionedReadFlags to JSON.
         * @function toJSON
         * @memberof file.RequestWithVersionedReadFlags
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        RequestWithVersionedReadFlags.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for RequestWithVersionedReadFlags
         * @function getTypeUrl
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        RequestWithVersionedReadFlags.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.RequestWithVersionedReadFlags";
        };

        return RequestWithVersionedReadFlags;
    })();

    file.VersionedGetXAttrRequestBody = (function() {

        /**
         * Properties of a VersionedGetXAttrRequestBody.
         * @memberof file
         * @interface IVersionedGetXAttrRequestBody
         * @property {string|null} [xaName] VersionedGetXAttrRequestBody xaName
         * @property {file.IVersionedReadFlags|null} [flags] VersionedGetXAttrRequestBody flags
         */

        /**
         * Constructs a new VersionedGetXAttrRequestBody.
         * @memberof file
         * @classdesc Represents a VersionedGetXAttrRequestBody.
         * @implements IVersionedGetXAttrRequestBody
         * @constructor
         * @param {file.IVersionedGetXAttrRequestBody=} [properties] Properties to set
         */
        function VersionedGetXAttrRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedGetXAttrRequestBody xaName.
         * @member {string} xaName
         * @memberof file.VersionedGetXAttrRequestBody
         * @instance
         */
        VersionedGetXAttrRequestBody.prototype.xaName = "";

        /**
         * VersionedGetXAttrRequestBody flags.
         * @member {file.IVersionedReadFlags|null|undefined} flags
         * @memberof file.VersionedGetXAttrRequestBody
         * @instance
         */
        VersionedGetXAttrRequestBody.prototype.flags = null;

        /**
         * Creates a new VersionedGetXAttrRequestBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {file.IVersionedGetXAttrRequestBody=} [properties] Properties to set
         * @returns {file.VersionedGetXAttrRequestBody} VersionedGetXAttrRequestBody instance
         */
        VersionedGetXAttrRequestBody.create = function create(properties) {
            return new VersionedGetXAttrRequestBody(properties);
        };

        /**
         * Encodes the specified VersionedGetXAttrRequestBody message. Does not implicitly {@link file.VersionedGetXAttrRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {file.IVersionedGetXAttrRequestBody} message VersionedGetXAttrRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetXAttrRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.xaName);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedGetXAttrRequestBody message, length delimited. Does not implicitly {@link file.VersionedGetXAttrRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {file.IVersionedGetXAttrRequestBody} message VersionedGetXAttrRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetXAttrRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedGetXAttrRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedGetXAttrRequestBody} VersionedGetXAttrRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetXAttrRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetXAttrRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.xaName = reader.string();
                        break;
                    }
                case 2: {
                        message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedGetXAttrRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedGetXAttrRequestBody} VersionedGetXAttrRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetXAttrRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedGetXAttrRequestBody message.
         * @function verify
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedGetXAttrRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                if (!$util.isString(message.xaName))
                    return "xaName: string expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedGetXAttrRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedGetXAttrRequestBody} VersionedGetXAttrRequestBody
         */
        VersionedGetXAttrRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedGetXAttrRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedGetXAttrRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedGetXAttrRequestBody();
            if (object.xaName != null)
                message.xaName = String(object.xaName);
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".file.VersionedGetXAttrRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedGetXAttrRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {file.VersionedGetXAttrRequestBody} message VersionedGetXAttrRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedGetXAttrRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.xaName = "";
                object.flags = null;
            }
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                object.xaName = message.xaName;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedGetXAttrRequestBody to JSON.
         * @function toJSON
         * @memberof file.VersionedGetXAttrRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedGetXAttrRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedGetXAttrRequestBody
         * @function getTypeUrl
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedGetXAttrRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedGetXAttrRequestBody";
        };

        return VersionedGetXAttrRequestBody;
    })();

    file.VersionedGetXAttrReplyBody = (function() {

        /**
         * Properties of a VersionedGetXAttrReplyBody.
         * @memberof file
         * @interface IVersionedGetXAttrReplyBody
         * @property {number|Long|null} [version] VersionedGetXAttrReplyBody version
         * @property {common.IStringValue|null} [str] VersionedGetXAttrReplyBody str
         * @property {common.IStringValue|null} [json] VersionedGetXAttrReplyBody json
         * @property {common.IBytesValue|null} [bytes] VersionedGetXAttrReplyBody bytes
         */

        /**
         * Constructs a new VersionedGetXAttrReplyBody.
         * @memberof file
         * @classdesc Represents a VersionedGetXAttrReplyBody.
         * @implements IVersionedGetXAttrReplyBody
         * @constructor
         * @param {file.IVersionedGetXAttrReplyBody=} [properties] Properties to set
         */
        function VersionedGetXAttrReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedGetXAttrReplyBody version.
         * @member {number|Long} version
         * @memberof file.VersionedGetXAttrReplyBody
         * @instance
         */
        VersionedGetXAttrReplyBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * VersionedGetXAttrReplyBody str.
         * @member {common.IStringValue|null|undefined} str
         * @memberof file.VersionedGetXAttrReplyBody
         * @instance
         */
        VersionedGetXAttrReplyBody.prototype.str = null;

        /**
         * VersionedGetXAttrReplyBody json.
         * @member {common.IStringValue|null|undefined} json
         * @memberof file.VersionedGetXAttrReplyBody
         * @instance
         */
        VersionedGetXAttrReplyBody.prototype.json = null;

        /**
         * VersionedGetXAttrReplyBody bytes.
         * @member {common.IBytesValue|null|undefined} bytes
         * @memberof file.VersionedGetXAttrReplyBody
         * @instance
         */
        VersionedGetXAttrReplyBody.prototype.bytes = null;

        /**
         * Creates a new VersionedGetXAttrReplyBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {file.IVersionedGetXAttrReplyBody=} [properties] Properties to set
         * @returns {file.VersionedGetXAttrReplyBody} VersionedGetXAttrReplyBody instance
         */
        VersionedGetXAttrReplyBody.create = function create(properties) {
            return new VersionedGetXAttrReplyBody(properties);
        };

        /**
         * Encodes the specified VersionedGetXAttrReplyBody message. Does not implicitly {@link file.VersionedGetXAttrReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {file.IVersionedGetXAttrReplyBody} message VersionedGetXAttrReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetXAttrReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            if (message.str != null && Object.hasOwnProperty.call(message, "str"))
                $root.common.StringValue.encode(message.str, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedGetXAttrReplyBody message, length delimited. Does not implicitly {@link file.VersionedGetXAttrReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {file.IVersionedGetXAttrReplyBody} message VersionedGetXAttrReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetXAttrReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedGetXAttrReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedGetXAttrReplyBody} VersionedGetXAttrReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetXAttrReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetXAttrReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.str = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.json = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedGetXAttrReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedGetXAttrReplyBody} VersionedGetXAttrReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetXAttrReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedGetXAttrReplyBody message.
         * @function verify
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedGetXAttrReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            if (message.str != null && Object.hasOwnProperty.call(message, "str")) {
                var error = $root.common.StringValue.verify(message.str, long + 1);
                if (error)
                    return "str." + error;
            }
            if (message.json != null && Object.hasOwnProperty.call(message, "json")) {
                var error = $root.common.StringValue.verify(message.json, long + 1);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes, long + 1);
                if (error)
                    return "bytes." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedGetXAttrReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedGetXAttrReplyBody} VersionedGetXAttrReplyBody
         */
        VersionedGetXAttrReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedGetXAttrReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedGetXAttrReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedGetXAttrReplyBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            if (object.str != null) {
                if (!$util.isObject(object.str))
                    throw TypeError(".file.VersionedGetXAttrReplyBody.str: object expected");
                message.str = $root.common.StringValue.fromObject(object.str, long + 1);
            }
            if (object.json != null) {
                if (!$util.isObject(object.json))
                    throw TypeError(".file.VersionedGetXAttrReplyBody.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json, long + 1);
            }
            if (object.bytes != null) {
                if (!$util.isObject(object.bytes))
                    throw TypeError(".file.VersionedGetXAttrReplyBody.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedGetXAttrReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {file.VersionedGetXAttrReplyBody} message VersionedGetXAttrReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedGetXAttrReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.str = null;
                object.json = null;
                object.bytes = null;
            }
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            if (message.str != null && Object.hasOwnProperty.call(message, "str"))
                object.str = $root.common.StringValue.toObject(message.str, options, q + 1);
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = $root.common.StringValue.toObject(message.json, options, q + 1);
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedGetXAttrReplyBody to JSON.
         * @function toJSON
         * @memberof file.VersionedGetXAttrReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedGetXAttrReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedGetXAttrReplyBody
         * @function getTypeUrl
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedGetXAttrReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedGetXAttrReplyBody";
        };

        return VersionedGetXAttrReplyBody;
    })();

    file.VersionedListXAttrsReplyBody = (function() {

        /**
         * Properties of a VersionedListXAttrsReplyBody.
         * @memberof file
         * @interface IVersionedListXAttrsReplyBody
         * @property {number|Long|null} [version] VersionedListXAttrsReplyBody version
         * @property {Array.<string>|null} [xaNames] VersionedListXAttrsReplyBody xaNames
         */

        /**
         * Constructs a new VersionedListXAttrsReplyBody.
         * @memberof file
         * @classdesc Represents a VersionedListXAttrsReplyBody.
         * @implements IVersionedListXAttrsReplyBody
         * @constructor
         * @param {file.IVersionedListXAttrsReplyBody=} [properties] Properties to set
         */
        function VersionedListXAttrsReplyBody(properties) {
            this.xaNames = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedListXAttrsReplyBody version.
         * @member {number|Long} version
         * @memberof file.VersionedListXAttrsReplyBody
         * @instance
         */
        VersionedListXAttrsReplyBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * VersionedListXAttrsReplyBody xaNames.
         * @member {Array.<string>} xaNames
         * @memberof file.VersionedListXAttrsReplyBody
         * @instance
         */
        VersionedListXAttrsReplyBody.prototype.xaNames = $util.emptyArray;

        /**
         * Creates a new VersionedListXAttrsReplyBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {file.IVersionedListXAttrsReplyBody=} [properties] Properties to set
         * @returns {file.VersionedListXAttrsReplyBody} VersionedListXAttrsReplyBody instance
         */
        VersionedListXAttrsReplyBody.create = function create(properties) {
            return new VersionedListXAttrsReplyBody(properties);
        };

        /**
         * Encodes the specified VersionedListXAttrsReplyBody message. Does not implicitly {@link file.VersionedListXAttrsReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {file.IVersionedListXAttrsReplyBody} message VersionedListXAttrsReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedListXAttrsReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            if (message.xaNames != null && message.xaNames.length)
                for (var i = 0; i < message.xaNames.length; ++i)
                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.xaNames[i]);
            return writer;
        };

        /**
         * Encodes the specified VersionedListXAttrsReplyBody message, length delimited. Does not implicitly {@link file.VersionedListXAttrsReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {file.IVersionedListXAttrsReplyBody} message VersionedListXAttrsReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedListXAttrsReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedListXAttrsReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedListXAttrsReplyBody} VersionedListXAttrsReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedListXAttrsReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedListXAttrsReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        if (!(message.xaNames && message.xaNames.length))
                            message.xaNames = [];
                        message.xaNames.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedListXAttrsReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedListXAttrsReplyBody} VersionedListXAttrsReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedListXAttrsReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedListXAttrsReplyBody message.
         * @function verify
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedListXAttrsReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            if (message.xaNames != null && Object.hasOwnProperty.call(message, "xaNames")) {
                if (!Array.isArray(message.xaNames))
                    return "xaNames: array expected";
                for (var i = 0; i < message.xaNames.length; ++i)
                    if (!$util.isString(message.xaNames[i]))
                        return "xaNames: string[] expected";
            }
            return null;
        };

        /**
         * Creates a VersionedListXAttrsReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedListXAttrsReplyBody} VersionedListXAttrsReplyBody
         */
        VersionedListXAttrsReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedListXAttrsReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedListXAttrsReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedListXAttrsReplyBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            if (object.xaNames) {
                if (!Array.isArray(object.xaNames))
                    throw TypeError(".file.VersionedListXAttrsReplyBody.xaNames: array expected");
                message.xaNames = [];
                for (var i = 0; i < object.xaNames.length; ++i)
                    message.xaNames[i] = String(object.xaNames[i]);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedListXAttrsReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {file.VersionedListXAttrsReplyBody} message VersionedListXAttrsReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedListXAttrsReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.xaNames = [];
            if (options.defaults)
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            if (message.xaNames && message.xaNames.length) {
                object.xaNames = [];
                for (var j = 0; j < message.xaNames.length; ++j)
                    object.xaNames[j] = message.xaNames[j];
            }
            return object;
        };

        /**
         * Converts this VersionedListXAttrsReplyBody to JSON.
         * @function toJSON
         * @memberof file.VersionedListXAttrsReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedListXAttrsReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedListXAttrsReplyBody
         * @function getTypeUrl
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedListXAttrsReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedListXAttrsReplyBody";
        };

        return VersionedListXAttrsReplyBody;
    })();

    file.VersionedReadBytesRequestBody = (function() {

        /**
         * Properties of a VersionedReadBytesRequestBody.
         * @memberof file
         * @interface IVersionedReadBytesRequestBody
         * @property {common.IUInt64Value|null} [start] VersionedReadBytesRequestBody start
         * @property {common.IUInt64Value|null} [end] VersionedReadBytesRequestBody end
         * @property {file.IVersionedReadFlags|null} [flags] VersionedReadBytesRequestBody flags
         */

        /**
         * Constructs a new VersionedReadBytesRequestBody.
         * @memberof file
         * @classdesc Represents a VersionedReadBytesRequestBody.
         * @implements IVersionedReadBytesRequestBody
         * @constructor
         * @param {file.IVersionedReadBytesRequestBody=} [properties] Properties to set
         */
        function VersionedReadBytesRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedReadBytesRequestBody start.
         * @member {common.IUInt64Value|null|undefined} start
         * @memberof file.VersionedReadBytesRequestBody
         * @instance
         */
        VersionedReadBytesRequestBody.prototype.start = null;

        /**
         * VersionedReadBytesRequestBody end.
         * @member {common.IUInt64Value|null|undefined} end
         * @memberof file.VersionedReadBytesRequestBody
         * @instance
         */
        VersionedReadBytesRequestBody.prototype.end = null;

        /**
         * VersionedReadBytesRequestBody flags.
         * @member {file.IVersionedReadFlags|null|undefined} flags
         * @memberof file.VersionedReadBytesRequestBody
         * @instance
         */
        VersionedReadBytesRequestBody.prototype.flags = null;

        /**
         * Creates a new VersionedReadBytesRequestBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {file.IVersionedReadBytesRequestBody=} [properties] Properties to set
         * @returns {file.VersionedReadBytesRequestBody} VersionedReadBytesRequestBody instance
         */
        VersionedReadBytesRequestBody.create = function create(properties) {
            return new VersionedReadBytesRequestBody(properties);
        };

        /**
         * Encodes the specified VersionedReadBytesRequestBody message. Does not implicitly {@link file.VersionedReadBytesRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {file.IVersionedReadBytesRequestBody} message VersionedReadBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadBytesRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                $root.common.UInt64Value.encode(message.start, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                $root.common.UInt64Value.encode(message.end, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 10, wireType 2 =*/82).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedReadBytesRequestBody message, length delimited. Does not implicitly {@link file.VersionedReadBytesRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {file.IVersionedReadBytesRequestBody} message VersionedReadBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadBytesRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedReadBytesRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedReadBytesRequestBody} VersionedReadBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadBytesRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.start = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.end = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 10: {
                        message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedReadBytesRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedReadBytesRequestBody} VersionedReadBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadBytesRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedReadBytesRequestBody message.
         * @function verify
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedReadBytesRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.start != null && Object.hasOwnProperty.call(message, "start")) {
                var error = $root.common.UInt64Value.verify(message.start, long + 1);
                if (error)
                    return "start." + error;
            }
            if (message.end != null && Object.hasOwnProperty.call(message, "end")) {
                var error = $root.common.UInt64Value.verify(message.end, long + 1);
                if (error)
                    return "end." + error;
            }
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedReadBytesRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedReadBytesRequestBody} VersionedReadBytesRequestBody
         */
        VersionedReadBytesRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedReadBytesRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedReadBytesRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedReadBytesRequestBody();
            if (object.start != null) {
                if (!$util.isObject(object.start))
                    throw TypeError(".file.VersionedReadBytesRequestBody.start: object expected");
                message.start = $root.common.UInt64Value.fromObject(object.start, long + 1);
            }
            if (object.end != null) {
                if (!$util.isObject(object.end))
                    throw TypeError(".file.VersionedReadBytesRequestBody.end: object expected");
                message.end = $root.common.UInt64Value.fromObject(object.end, long + 1);
            }
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".file.VersionedReadBytesRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedReadBytesRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {file.VersionedReadBytesRequestBody} message VersionedReadBytesRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedReadBytesRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.start = null;
                object.end = null;
                object.flags = null;
            }
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                object.start = $root.common.UInt64Value.toObject(message.start, options, q + 1);
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                object.end = $root.common.UInt64Value.toObject(message.end, options, q + 1);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedReadBytesRequestBody to JSON.
         * @function toJSON
         * @memberof file.VersionedReadBytesRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedReadBytesRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedReadBytesRequestBody
         * @function getTypeUrl
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedReadBytesRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedReadBytesRequestBody";
        };

        return VersionedReadBytesRequestBody;
    })();

    file.VersionedReadBytesReplyBody = (function() {

        /**
         * Properties of a VersionedReadBytesReplyBody.
         * @memberof file
         * @interface IVersionedReadBytesReplyBody
         * @property {number|Long|null} [version] VersionedReadBytesReplyBody version
         * @property {common.IBytesValue|null} [bytes] VersionedReadBytesReplyBody bytes
         */

        /**
         * Constructs a new VersionedReadBytesReplyBody.
         * @memberof file
         * @classdesc Represents a VersionedReadBytesReplyBody.
         * @implements IVersionedReadBytesReplyBody
         * @constructor
         * @param {file.IVersionedReadBytesReplyBody=} [properties] Properties to set
         */
        function VersionedReadBytesReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedReadBytesReplyBody version.
         * @member {number|Long} version
         * @memberof file.VersionedReadBytesReplyBody
         * @instance
         */
        VersionedReadBytesReplyBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * VersionedReadBytesReplyBody bytes.
         * @member {common.IBytesValue|null|undefined} bytes
         * @memberof file.VersionedReadBytesReplyBody
         * @instance
         */
        VersionedReadBytesReplyBody.prototype.bytes = null;

        /**
         * Creates a new VersionedReadBytesReplyBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {file.IVersionedReadBytesReplyBody=} [properties] Properties to set
         * @returns {file.VersionedReadBytesReplyBody} VersionedReadBytesReplyBody instance
         */
        VersionedReadBytesReplyBody.create = function create(properties) {
            return new VersionedReadBytesReplyBody(properties);
        };

        /**
         * Encodes the specified VersionedReadBytesReplyBody message. Does not implicitly {@link file.VersionedReadBytesReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {file.IVersionedReadBytesReplyBody} message VersionedReadBytesReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadBytesReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedReadBytesReplyBody message, length delimited. Does not implicitly {@link file.VersionedReadBytesReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {file.IVersionedReadBytesReplyBody} message VersionedReadBytesReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadBytesReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedReadBytesReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedReadBytesReplyBody} VersionedReadBytesReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadBytesReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadBytesReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedReadBytesReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedReadBytesReplyBody} VersionedReadBytesReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadBytesReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedReadBytesReplyBody message.
         * @function verify
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedReadBytesReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes, long + 1);
                if (error)
                    return "bytes." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedReadBytesReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedReadBytesReplyBody} VersionedReadBytesReplyBody
         */
        VersionedReadBytesReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedReadBytesReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedReadBytesReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedReadBytesReplyBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            if (object.bytes != null) {
                if (!$util.isObject(object.bytes))
                    throw TypeError(".file.VersionedReadBytesReplyBody.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedReadBytesReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {file.VersionedReadBytesReplyBody} message VersionedReadBytesReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedReadBytesReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.bytes = null;
            }
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedReadBytesReplyBody to JSON.
         * @function toJSON
         * @memberof file.VersionedReadBytesReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedReadBytesReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedReadBytesReplyBody
         * @function getTypeUrl
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedReadBytesReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedReadBytesReplyBody";
        };

        return VersionedReadBytesReplyBody;
    })();

    file.VersionedReadTxtReplyBody = (function() {

        /**
         * Properties of a VersionedReadTxtReplyBody.
         * @memberof file
         * @interface IVersionedReadTxtReplyBody
         * @property {number|Long|null} [version] VersionedReadTxtReplyBody version
         * @property {string|null} [txt] VersionedReadTxtReplyBody txt
         */

        /**
         * Constructs a new VersionedReadTxtReplyBody.
         * @memberof file
         * @classdesc Represents a VersionedReadTxtReplyBody.
         * @implements IVersionedReadTxtReplyBody
         * @constructor
         * @param {file.IVersionedReadTxtReplyBody=} [properties] Properties to set
         */
        function VersionedReadTxtReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedReadTxtReplyBody version.
         * @member {number|Long} version
         * @memberof file.VersionedReadTxtReplyBody
         * @instance
         */
        VersionedReadTxtReplyBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * VersionedReadTxtReplyBody txt.
         * @member {string} txt
         * @memberof file.VersionedReadTxtReplyBody
         * @instance
         */
        VersionedReadTxtReplyBody.prototype.txt = "";

        /**
         * Creates a new VersionedReadTxtReplyBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {file.IVersionedReadTxtReplyBody=} [properties] Properties to set
         * @returns {file.VersionedReadTxtReplyBody} VersionedReadTxtReplyBody instance
         */
        VersionedReadTxtReplyBody.create = function create(properties) {
            return new VersionedReadTxtReplyBody(properties);
        };

        /**
         * Encodes the specified VersionedReadTxtReplyBody message. Does not implicitly {@link file.VersionedReadTxtReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {file.IVersionedReadTxtReplyBody} message VersionedReadTxtReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadTxtReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.txt);
            return writer;
        };

        /**
         * Encodes the specified VersionedReadTxtReplyBody message, length delimited. Does not implicitly {@link file.VersionedReadTxtReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {file.IVersionedReadTxtReplyBody} message VersionedReadTxtReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadTxtReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedReadTxtReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedReadTxtReplyBody} VersionedReadTxtReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadTxtReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadTxtReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.txt = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedReadTxtReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedReadTxtReplyBody} VersionedReadTxtReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadTxtReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedReadTxtReplyBody message.
         * @function verify
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedReadTxtReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                if (!$util.isString(message.txt))
                    return "txt: string expected";
            return null;
        };

        /**
         * Creates a VersionedReadTxtReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedReadTxtReplyBody} VersionedReadTxtReplyBody
         */
        VersionedReadTxtReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedReadTxtReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedReadTxtReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedReadTxtReplyBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            if (object.txt != null)
                message.txt = String(object.txt);
            return message;
        };

        /**
         * Creates a plain object from a VersionedReadTxtReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {file.VersionedReadTxtReplyBody} message VersionedReadTxtReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedReadTxtReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.txt = "";
            }
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                object.txt = message.txt;
            return object;
        };

        /**
         * Converts this VersionedReadTxtReplyBody to JSON.
         * @function toJSON
         * @memberof file.VersionedReadTxtReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedReadTxtReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedReadTxtReplyBody
         * @function getTypeUrl
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedReadTxtReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedReadTxtReplyBody";
        };

        return VersionedReadTxtReplyBody;
    })();

    file.VersionedReadJsonReplyBody = (function() {

        /**
         * Properties of a VersionedReadJsonReplyBody.
         * @memberof file
         * @interface IVersionedReadJsonReplyBody
         * @property {number|Long|null} [version] VersionedReadJsonReplyBody version
         * @property {string|null} [json] VersionedReadJsonReplyBody json
         */

        /**
         * Constructs a new VersionedReadJsonReplyBody.
         * @memberof file
         * @classdesc Represents a VersionedReadJsonReplyBody.
         * @implements IVersionedReadJsonReplyBody
         * @constructor
         * @param {file.IVersionedReadJsonReplyBody=} [properties] Properties to set
         */
        function VersionedReadJsonReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedReadJsonReplyBody version.
         * @member {number|Long} version
         * @memberof file.VersionedReadJsonReplyBody
         * @instance
         */
        VersionedReadJsonReplyBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * VersionedReadJsonReplyBody json.
         * @member {string} json
         * @memberof file.VersionedReadJsonReplyBody
         * @instance
         */
        VersionedReadJsonReplyBody.prototype.json = "";

        /**
         * Creates a new VersionedReadJsonReplyBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {file.IVersionedReadJsonReplyBody=} [properties] Properties to set
         * @returns {file.VersionedReadJsonReplyBody} VersionedReadJsonReplyBody instance
         */
        VersionedReadJsonReplyBody.create = function create(properties) {
            return new VersionedReadJsonReplyBody(properties);
        };

        /**
         * Encodes the specified VersionedReadJsonReplyBody message. Does not implicitly {@link file.VersionedReadJsonReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {file.IVersionedReadJsonReplyBody} message VersionedReadJsonReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadJsonReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.json);
            return writer;
        };

        /**
         * Encodes the specified VersionedReadJsonReplyBody message, length delimited. Does not implicitly {@link file.VersionedReadJsonReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {file.IVersionedReadJsonReplyBody} message VersionedReadJsonReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadJsonReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedReadJsonReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedReadJsonReplyBody} VersionedReadJsonReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadJsonReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadJsonReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.json = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedReadJsonReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedReadJsonReplyBody} VersionedReadJsonReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadJsonReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedReadJsonReplyBody message.
         * @function verify
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedReadJsonReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                if (!$util.isString(message.json))
                    return "json: string expected";
            return null;
        };

        /**
         * Creates a VersionedReadJsonReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedReadJsonReplyBody} VersionedReadJsonReplyBody
         */
        VersionedReadJsonReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedReadJsonReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedReadJsonReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedReadJsonReplyBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            if (object.json != null)
                message.json = String(object.json);
            return message;
        };

        /**
         * Creates a plain object from a VersionedReadJsonReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {file.VersionedReadJsonReplyBody} message VersionedReadJsonReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedReadJsonReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.json = "";
            }
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = message.json;
            return object;
        };

        /**
         * Converts this VersionedReadJsonReplyBody to JSON.
         * @function toJSON
         * @memberof file.VersionedReadJsonReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedReadJsonReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedReadJsonReplyBody
         * @function getTypeUrl
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedReadJsonReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedReadJsonReplyBody";
        };

        return VersionedReadJsonReplyBody;
    })();

    file.VersionedGetByteSourceReplyBody = (function() {

        /**
         * Properties of a VersionedGetByteSourceReplyBody.
         * @memberof file
         * @interface IVersionedGetByteSourceReplyBody
         * @property {number|Long|null} [version] VersionedGetByteSourceReplyBody version
         * @property {common.IObjectReference|null} [src] VersionedGetByteSourceReplyBody src
         */

        /**
         * Constructs a new VersionedGetByteSourceReplyBody.
         * @memberof file
         * @classdesc Represents a VersionedGetByteSourceReplyBody.
         * @implements IVersionedGetByteSourceReplyBody
         * @constructor
         * @param {file.IVersionedGetByteSourceReplyBody=} [properties] Properties to set
         */
        function VersionedGetByteSourceReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedGetByteSourceReplyBody version.
         * @member {number|Long} version
         * @memberof file.VersionedGetByteSourceReplyBody
         * @instance
         */
        VersionedGetByteSourceReplyBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * VersionedGetByteSourceReplyBody src.
         * @member {common.IObjectReference|null|undefined} src
         * @memberof file.VersionedGetByteSourceReplyBody
         * @instance
         */
        VersionedGetByteSourceReplyBody.prototype.src = null;

        /**
         * Creates a new VersionedGetByteSourceReplyBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {file.IVersionedGetByteSourceReplyBody=} [properties] Properties to set
         * @returns {file.VersionedGetByteSourceReplyBody} VersionedGetByteSourceReplyBody instance
         */
        VersionedGetByteSourceReplyBody.create = function create(properties) {
            return new VersionedGetByteSourceReplyBody(properties);
        };

        /**
         * Encodes the specified VersionedGetByteSourceReplyBody message. Does not implicitly {@link file.VersionedGetByteSourceReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {file.IVersionedGetByteSourceReplyBody} message VersionedGetByteSourceReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetByteSourceReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                $root.common.ObjectReference.encode(message.src, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedGetByteSourceReplyBody message, length delimited. Does not implicitly {@link file.VersionedGetByteSourceReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {file.IVersionedGetByteSourceReplyBody} message VersionedGetByteSourceReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetByteSourceReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedGetByteSourceReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedGetByteSourceReplyBody} VersionedGetByteSourceReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetByteSourceReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetByteSourceReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.src = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedGetByteSourceReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedGetByteSourceReplyBody} VersionedGetByteSourceReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetByteSourceReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedGetByteSourceReplyBody message.
         * @function verify
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedGetByteSourceReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            if (message.src != null && Object.hasOwnProperty.call(message, "src")) {
                var error = $root.common.ObjectReference.verify(message.src, long + 1);
                if (error)
                    return "src." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedGetByteSourceReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedGetByteSourceReplyBody} VersionedGetByteSourceReplyBody
         */
        VersionedGetByteSourceReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedGetByteSourceReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedGetByteSourceReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedGetByteSourceReplyBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            if (object.src != null) {
                if (!$util.isObject(object.src))
                    throw TypeError(".file.VersionedGetByteSourceReplyBody.src: object expected");
                message.src = $root.common.ObjectReference.fromObject(object.src, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedGetByteSourceReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {file.VersionedGetByteSourceReplyBody} message VersionedGetByteSourceReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedGetByteSourceReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.src = null;
            }
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                object.src = $root.common.ObjectReference.toObject(message.src, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedGetByteSourceReplyBody to JSON.
         * @function toJSON
         * @memberof file.VersionedGetByteSourceReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedGetByteSourceReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedGetByteSourceReplyBody
         * @function getTypeUrl
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedGetByteSourceReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedGetByteSourceReplyBody";
        };

        return VersionedGetByteSourceReplyBody;
    })();

    file.ListVersionsReplyBody = (function() {

        /**
         * Properties of a ListVersionsReplyBody.
         * @memberof file
         * @interface IListVersionsReplyBody
         * @property {common.IUInt64Value|null} [current] ListVersionsReplyBody current
         * @property {Array.<number|Long>|null} [archived] ListVersionsReplyBody archived
         */

        /**
         * Constructs a new ListVersionsReplyBody.
         * @memberof file
         * @classdesc Represents a ListVersionsReplyBody.
         * @implements IListVersionsReplyBody
         * @constructor
         * @param {file.IListVersionsReplyBody=} [properties] Properties to set
         */
        function ListVersionsReplyBody(properties) {
            this.archived = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ListVersionsReplyBody current.
         * @member {common.IUInt64Value|null|undefined} current
         * @memberof file.ListVersionsReplyBody
         * @instance
         */
        ListVersionsReplyBody.prototype.current = null;

        /**
         * ListVersionsReplyBody archived.
         * @member {Array.<number|Long>} archived
         * @memberof file.ListVersionsReplyBody
         * @instance
         */
        ListVersionsReplyBody.prototype.archived = $util.emptyArray;

        /**
         * Creates a new ListVersionsReplyBody instance using the specified properties.
         * @function create
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {file.IListVersionsReplyBody=} [properties] Properties to set
         * @returns {file.ListVersionsReplyBody} ListVersionsReplyBody instance
         */
        ListVersionsReplyBody.create = function create(properties) {
            return new ListVersionsReplyBody(properties);
        };

        /**
         * Encodes the specified ListVersionsReplyBody message. Does not implicitly {@link file.ListVersionsReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {file.IListVersionsReplyBody} message ListVersionsReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ListVersionsReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                $root.common.UInt64Value.encode(message.current, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.archived != null && message.archived.length) {
                writer.uint32(/* id 2, wireType 2 =*/18).fork();
                for (var i = 0; i < message.archived.length; ++i)
                    writer.uint64(message.archived[i]);
                writer.ldelim();
            }
            return writer;
        };

        /**
         * Encodes the specified ListVersionsReplyBody message, length delimited. Does not implicitly {@link file.ListVersionsReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {file.IListVersionsReplyBody} message ListVersionsReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ListVersionsReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a ListVersionsReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.ListVersionsReplyBody} ListVersionsReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ListVersionsReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ListVersionsReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.current = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        if (!(message.archived && message.archived.length))
                            message.archived = [];
                        if ((tag & 7) === 2) {
                            var end2 = reader.uint32() + reader.pos;
                            while (reader.pos < end2)
                                message.archived.push(reader.uint64());
                        } else
                            message.archived.push(reader.uint64());
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a ListVersionsReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.ListVersionsReplyBody} ListVersionsReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ListVersionsReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a ListVersionsReplyBody message.
         * @function verify
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ListVersionsReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.current != null && Object.hasOwnProperty.call(message, "current")) {
                var error = $root.common.UInt64Value.verify(message.current, long + 1);
                if (error)
                    return "current." + error;
            }
            if (message.archived != null && Object.hasOwnProperty.call(message, "archived")) {
                if (!Array.isArray(message.archived))
                    return "archived: array expected";
                for (var i = 0; i < message.archived.length; ++i)
                    if (!$util.isInteger(message.archived[i]) && !(message.archived[i] && $util.isInteger(message.archived[i].low) && $util.isInteger(message.archived[i].high)))
                        return "archived: integer|Long[] expected";
            }
            return null;
        };

        /**
         * Creates a ListVersionsReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.ListVersionsReplyBody} ListVersionsReplyBody
         */
        ListVersionsReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.ListVersionsReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.ListVersionsReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.ListVersionsReplyBody();
            if (object.current != null) {
                if (!$util.isObject(object.current))
                    throw TypeError(".file.ListVersionsReplyBody.current: object expected");
                message.current = $root.common.UInt64Value.fromObject(object.current, long + 1);
            }
            if (object.archived) {
                if (!Array.isArray(object.archived))
                    throw TypeError(".file.ListVersionsReplyBody.archived: array expected");
                message.archived = [];
                for (var i = 0; i < object.archived.length; ++i)
                    if ($util.Long)
                        message.archived[i] = $util.Long.fromValue(object.archived[i], true);
                    else if (typeof object.archived[i] === "string")
                        message.archived[i] = parseInt(object.archived[i], 10);
                    else if (typeof object.archived[i] === "number")
                        message.archived[i] = object.archived[i];
                    else if (typeof object.archived[i] === "object")
                        message.archived[i] = new $util.LongBits(object.archived[i].low >>> 0, object.archived[i].high >>> 0).toNumber(true);
            }
            return message;
        };

        /**
         * Creates a plain object from a ListVersionsReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {file.ListVersionsReplyBody} message ListVersionsReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ListVersionsReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.archived = [];
            if (options.defaults)
                object.current = null;
            if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                object.current = $root.common.UInt64Value.toObject(message.current, options, q + 1);
            if (message.archived && message.archived.length) {
                object.archived = [];
                for (var j = 0; j < message.archived.length; ++j)
                    if (typeof BigInt !== "undefined" && options.longs === BigInt)
                        object.archived[j] = typeof message.archived[j] === "number" ? BigInt(message.archived[j]) : $util.Long.fromBits(message.archived[j].low >>> 0, message.archived[j].high >>> 0, true).toBigInt();
                    else if (typeof message.archived[j] === "number")
                        object.archived[j] = options.longs === String ? String(message.archived[j]) : message.archived[j];
                    else
                        object.archived[j] = options.longs === String ? $util.Long.prototype.toString.call(message.archived[j]) : options.longs === Number ? new $util.LongBits(message.archived[j].low >>> 0, message.archived[j].high >>> 0).toNumber(true) : message.archived[j];
            }
            return object;
        };

        /**
         * Converts this ListVersionsReplyBody to JSON.
         * @function toJSON
         * @memberof file.ListVersionsReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ListVersionsReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ListVersionsReplyBody
         * @function getTypeUrl
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ListVersionsReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.ListVersionsReplyBody";
        };

        return ListVersionsReplyBody;
    })();

    file.UpdateXAttrsRequestBody = (function() {

        /**
         * Properties of an UpdateXAttrsRequestBody.
         * @memberof file
         * @interface IUpdateXAttrsRequestBody
         * @property {file.IXAttrsChanges|null} [changes] UpdateXAttrsRequestBody changes
         */

        /**
         * Constructs a new UpdateXAttrsRequestBody.
         * @memberof file
         * @classdesc Represents an UpdateXAttrsRequestBody.
         * @implements IUpdateXAttrsRequestBody
         * @constructor
         * @param {file.IUpdateXAttrsRequestBody=} [properties] Properties to set
         */
        function UpdateXAttrsRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * UpdateXAttrsRequestBody changes.
         * @member {file.IXAttrsChanges|null|undefined} changes
         * @memberof file.UpdateXAttrsRequestBody
         * @instance
         */
        UpdateXAttrsRequestBody.prototype.changes = null;

        /**
         * Creates a new UpdateXAttrsRequestBody instance using the specified properties.
         * @function create
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {file.IUpdateXAttrsRequestBody=} [properties] Properties to set
         * @returns {file.UpdateXAttrsRequestBody} UpdateXAttrsRequestBody instance
         */
        UpdateXAttrsRequestBody.create = function create(properties) {
            return new UpdateXAttrsRequestBody(properties);
        };

        /**
         * Encodes the specified UpdateXAttrsRequestBody message. Does not implicitly {@link file.UpdateXAttrsRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {file.IUpdateXAttrsRequestBody} message UpdateXAttrsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UpdateXAttrsRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.changes != null && Object.hasOwnProperty.call(message, "changes"))
                $root.file.XAttrsChanges.encode(message.changes, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified UpdateXAttrsRequestBody message, length delimited. Does not implicitly {@link file.UpdateXAttrsRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {file.IUpdateXAttrsRequestBody} message UpdateXAttrsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UpdateXAttrsRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an UpdateXAttrsRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.UpdateXAttrsRequestBody} UpdateXAttrsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UpdateXAttrsRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.UpdateXAttrsRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.changes = $root.file.XAttrsChanges.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an UpdateXAttrsRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.UpdateXAttrsRequestBody} UpdateXAttrsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UpdateXAttrsRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an UpdateXAttrsRequestBody message.
         * @function verify
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        UpdateXAttrsRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.changes != null && Object.hasOwnProperty.call(message, "changes")) {
                var error = $root.file.XAttrsChanges.verify(message.changes, long + 1);
                if (error)
                    return "changes." + error;
            }
            return null;
        };

        /**
         * Creates an UpdateXAttrsRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.UpdateXAttrsRequestBody} UpdateXAttrsRequestBody
         */
        UpdateXAttrsRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.UpdateXAttrsRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.UpdateXAttrsRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.UpdateXAttrsRequestBody();
            if (object.changes != null) {
                if (!$util.isObject(object.changes))
                    throw TypeError(".file.UpdateXAttrsRequestBody.changes: object expected");
                message.changes = $root.file.XAttrsChanges.fromObject(object.changes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an UpdateXAttrsRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {file.UpdateXAttrsRequestBody} message UpdateXAttrsRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        UpdateXAttrsRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.changes = null;
            if (message.changes != null && Object.hasOwnProperty.call(message, "changes"))
                object.changes = $root.file.XAttrsChanges.toObject(message.changes, options, q + 1);
            return object;
        };

        /**
         * Converts this UpdateXAttrsRequestBody to JSON.
         * @function toJSON
         * @memberof file.UpdateXAttrsRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        UpdateXAttrsRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for UpdateXAttrsRequestBody
         * @function getTypeUrl
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        UpdateXAttrsRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.UpdateXAttrsRequestBody";
        };

        return UpdateXAttrsRequestBody;
    })();

    file.NameAndXAttrValue = (function() {

        /**
         * Properties of a NameAndXAttrValue.
         * @memberof file
         * @interface INameAndXAttrValue
         * @property {string|null} [xaName] NameAndXAttrValue xaName
         * @property {common.IStringValue|null} [str] NameAndXAttrValue str
         * @property {common.IStringValue|null} [json] NameAndXAttrValue json
         * @property {common.IBytesValue|null} [bytes] NameAndXAttrValue bytes
         */

        /**
         * Constructs a new NameAndXAttrValue.
         * @memberof file
         * @classdesc Represents a NameAndXAttrValue.
         * @implements INameAndXAttrValue
         * @constructor
         * @param {file.INameAndXAttrValue=} [properties] Properties to set
         */
        function NameAndXAttrValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * NameAndXAttrValue xaName.
         * @member {string} xaName
         * @memberof file.NameAndXAttrValue
         * @instance
         */
        NameAndXAttrValue.prototype.xaName = "";

        /**
         * NameAndXAttrValue str.
         * @member {common.IStringValue|null|undefined} str
         * @memberof file.NameAndXAttrValue
         * @instance
         */
        NameAndXAttrValue.prototype.str = null;

        /**
         * NameAndXAttrValue json.
         * @member {common.IStringValue|null|undefined} json
         * @memberof file.NameAndXAttrValue
         * @instance
         */
        NameAndXAttrValue.prototype.json = null;

        /**
         * NameAndXAttrValue bytes.
         * @member {common.IBytesValue|null|undefined} bytes
         * @memberof file.NameAndXAttrValue
         * @instance
         */
        NameAndXAttrValue.prototype.bytes = null;

        /**
         * Creates a new NameAndXAttrValue instance using the specified properties.
         * @function create
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {file.INameAndXAttrValue=} [properties] Properties to set
         * @returns {file.NameAndXAttrValue} NameAndXAttrValue instance
         */
        NameAndXAttrValue.create = function create(properties) {
            return new NameAndXAttrValue(properties);
        };

        /**
         * Encodes the specified NameAndXAttrValue message. Does not implicitly {@link file.NameAndXAttrValue.verify|verify} messages.
         * @function encode
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {file.INameAndXAttrValue} message NameAndXAttrValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        NameAndXAttrValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.xaName);
            if (message.str != null && Object.hasOwnProperty.call(message, "str"))
                $root.common.StringValue.encode(message.str, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified NameAndXAttrValue message, length delimited. Does not implicitly {@link file.NameAndXAttrValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {file.INameAndXAttrValue} message NameAndXAttrValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        NameAndXAttrValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a NameAndXAttrValue message from the specified reader or buffer.
         * @function decode
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.NameAndXAttrValue} NameAndXAttrValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        NameAndXAttrValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.NameAndXAttrValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.xaName = reader.string();
                        break;
                    }
                case 2: {
                        message.str = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.json = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a NameAndXAttrValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.NameAndXAttrValue} NameAndXAttrValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        NameAndXAttrValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a NameAndXAttrValue message.
         * @function verify
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        NameAndXAttrValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                if (!$util.isString(message.xaName))
                    return "xaName: string expected";
            if (message.str != null && Object.hasOwnProperty.call(message, "str")) {
                var error = $root.common.StringValue.verify(message.str, long + 1);
                if (error)
                    return "str." + error;
            }
            if (message.json != null && Object.hasOwnProperty.call(message, "json")) {
                var error = $root.common.StringValue.verify(message.json, long + 1);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes, long + 1);
                if (error)
                    return "bytes." + error;
            }
            return null;
        };

        /**
         * Creates a NameAndXAttrValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.NameAndXAttrValue} NameAndXAttrValue
         */
        NameAndXAttrValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.NameAndXAttrValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.NameAndXAttrValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.NameAndXAttrValue();
            if (object.xaName != null)
                message.xaName = String(object.xaName);
            if (object.str != null) {
                if (!$util.isObject(object.str))
                    throw TypeError(".file.NameAndXAttrValue.str: object expected");
                message.str = $root.common.StringValue.fromObject(object.str, long + 1);
            }
            if (object.json != null) {
                if (!$util.isObject(object.json))
                    throw TypeError(".file.NameAndXAttrValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json, long + 1);
            }
            if (object.bytes != null) {
                if (!$util.isObject(object.bytes))
                    throw TypeError(".file.NameAndXAttrValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a NameAndXAttrValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {file.NameAndXAttrValue} message NameAndXAttrValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        NameAndXAttrValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.xaName = "";
                object.str = null;
                object.json = null;
                object.bytes = null;
            }
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                object.xaName = message.xaName;
            if (message.str != null && Object.hasOwnProperty.call(message, "str"))
                object.str = $root.common.StringValue.toObject(message.str, options, q + 1);
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = $root.common.StringValue.toObject(message.json, options, q + 1);
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options, q + 1);
            return object;
        };

        /**
         * Converts this NameAndXAttrValue to JSON.
         * @function toJSON
         * @memberof file.NameAndXAttrValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        NameAndXAttrValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for NameAndXAttrValue
         * @function getTypeUrl
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        NameAndXAttrValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.NameAndXAttrValue";
        };

        return NameAndXAttrValue;
    })();

    file.XAttrsChanges = (function() {

        /**
         * Properties of a XAttrsChanges.
         * @memberof file
         * @interface IXAttrsChanges
         * @property {Array.<file.INameAndXAttrValue>|null} [set] XAttrsChanges set
         * @property {Array.<string>|null} [remove] XAttrsChanges remove
         */

        /**
         * Constructs a new XAttrsChanges.
         * @memberof file
         * @classdesc Represents a XAttrsChanges.
         * @implements IXAttrsChanges
         * @constructor
         * @param {file.IXAttrsChanges=} [properties] Properties to set
         */
        function XAttrsChanges(properties) {
            this.set = [];
            this.remove = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * XAttrsChanges set.
         * @member {Array.<file.INameAndXAttrValue>} set
         * @memberof file.XAttrsChanges
         * @instance
         */
        XAttrsChanges.prototype.set = $util.emptyArray;

        /**
         * XAttrsChanges remove.
         * @member {Array.<string>} remove
         * @memberof file.XAttrsChanges
         * @instance
         */
        XAttrsChanges.prototype.remove = $util.emptyArray;

        /**
         * Creates a new XAttrsChanges instance using the specified properties.
         * @function create
         * @memberof file.XAttrsChanges
         * @static
         * @param {file.IXAttrsChanges=} [properties] Properties to set
         * @returns {file.XAttrsChanges} XAttrsChanges instance
         */
        XAttrsChanges.create = function create(properties) {
            return new XAttrsChanges(properties);
        };

        /**
         * Encodes the specified XAttrsChanges message. Does not implicitly {@link file.XAttrsChanges.verify|verify} messages.
         * @function encode
         * @memberof file.XAttrsChanges
         * @static
         * @param {file.IXAttrsChanges} message XAttrsChanges message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        XAttrsChanges.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.set != null && message.set.length)
                for (var i = 0; i < message.set.length; ++i)
                    $root.file.NameAndXAttrValue.encode(message.set[i], writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.remove != null && message.remove.length)
                for (var i = 0; i < message.remove.length; ++i)
                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.remove[i]);
            return writer;
        };

        /**
         * Encodes the specified XAttrsChanges message, length delimited. Does not implicitly {@link file.XAttrsChanges.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.XAttrsChanges
         * @static
         * @param {file.IXAttrsChanges} message XAttrsChanges message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        XAttrsChanges.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a XAttrsChanges message from the specified reader or buffer.
         * @function decode
         * @memberof file.XAttrsChanges
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.XAttrsChanges} XAttrsChanges
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        XAttrsChanges.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.XAttrsChanges();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.set && message.set.length))
                            message.set = [];
                        message.set.push($root.file.NameAndXAttrValue.decode(reader, reader.uint32(), undefined, long + 1));
                        break;
                    }
                case 2: {
                        if (!(message.remove && message.remove.length))
                            message.remove = [];
                        message.remove.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a XAttrsChanges message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.XAttrsChanges
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.XAttrsChanges} XAttrsChanges
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        XAttrsChanges.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a XAttrsChanges message.
         * @function verify
         * @memberof file.XAttrsChanges
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        XAttrsChanges.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.set != null && Object.hasOwnProperty.call(message, "set")) {
                if (!Array.isArray(message.set))
                    return "set: array expected";
                for (var i = 0; i < message.set.length; ++i) {
                    var error = $root.file.NameAndXAttrValue.verify(message.set[i], long + 1);
                    if (error)
                        return "set." + error;
                }
            }
            if (message.remove != null && Object.hasOwnProperty.call(message, "remove")) {
                if (!Array.isArray(message.remove))
                    return "remove: array expected";
                for (var i = 0; i < message.remove.length; ++i)
                    if (!$util.isString(message.remove[i]))
                        return "remove: string[] expected";
            }
            return null;
        };

        /**
         * Creates a XAttrsChanges message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.XAttrsChanges
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.XAttrsChanges} XAttrsChanges
         */
        XAttrsChanges.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.XAttrsChanges)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.XAttrsChanges: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.XAttrsChanges();
            if (object.set) {
                if (!Array.isArray(object.set))
                    throw TypeError(".file.XAttrsChanges.set: array expected");
                message.set = [];
                for (var i = 0; i < object.set.length; ++i) {
                    if (!$util.isObject(object.set[i]))
                        throw TypeError(".file.XAttrsChanges.set: object expected");
                    message.set[i] = $root.file.NameAndXAttrValue.fromObject(object.set[i], long + 1);
                }
            }
            if (object.remove) {
                if (!Array.isArray(object.remove))
                    throw TypeError(".file.XAttrsChanges.remove: array expected");
                message.remove = [];
                for (var i = 0; i < object.remove.length; ++i)
                    message.remove[i] = String(object.remove[i]);
            }
            return message;
        };

        /**
         * Creates a plain object from a XAttrsChanges message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.XAttrsChanges
         * @static
         * @param {file.XAttrsChanges} message XAttrsChanges
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        XAttrsChanges.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults) {
                object.set = [];
                object.remove = [];
            }
            if (message.set && message.set.length) {
                object.set = [];
                for (var j = 0; j < message.set.length; ++j)
                    object.set[j] = $root.file.NameAndXAttrValue.toObject(message.set[j], options, q + 1);
            }
            if (message.remove && message.remove.length) {
                object.remove = [];
                for (var j = 0; j < message.remove.length; ++j)
                    object.remove[j] = message.remove[j];
            }
            return object;
        };

        /**
         * Converts this XAttrsChanges to JSON.
         * @function toJSON
         * @memberof file.XAttrsChanges
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        XAttrsChanges.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for XAttrsChanges
         * @function getTypeUrl
         * @memberof file.XAttrsChanges
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        XAttrsChanges.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.XAttrsChanges";
        };

        return XAttrsChanges;
    })();

    file.WriteBytesRequestBody = (function() {

        /**
         * Properties of a WriteBytesRequestBody.
         * @memberof file
         * @interface IWriteBytesRequestBody
         * @property {Uint8Array|null} [bytes] WriteBytesRequestBody bytes
         */

        /**
         * Constructs a new WriteBytesRequestBody.
         * @memberof file
         * @classdesc Represents a WriteBytesRequestBody.
         * @implements IWriteBytesRequestBody
         * @constructor
         * @param {file.IWriteBytesRequestBody=} [properties] Properties to set
         */
        function WriteBytesRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * WriteBytesRequestBody bytes.
         * @member {Uint8Array} bytes
         * @memberof file.WriteBytesRequestBody
         * @instance
         */
        WriteBytesRequestBody.prototype.bytes = $util.newBuffer([]);

        /**
         * Creates a new WriteBytesRequestBody instance using the specified properties.
         * @function create
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {file.IWriteBytesRequestBody=} [properties] Properties to set
         * @returns {file.WriteBytesRequestBody} WriteBytesRequestBody instance
         */
        WriteBytesRequestBody.create = function create(properties) {
            return new WriteBytesRequestBody(properties);
        };

        /**
         * Encodes the specified WriteBytesRequestBody message. Does not implicitly {@link file.WriteBytesRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {file.IWriteBytesRequestBody} message WriteBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteBytesRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.bytes);
            return writer;
        };

        /**
         * Encodes the specified WriteBytesRequestBody message, length delimited. Does not implicitly {@link file.WriteBytesRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {file.IWriteBytesRequestBody} message WriteBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteBytesRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a WriteBytesRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.WriteBytesRequestBody} WriteBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteBytesRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.WriteBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.bytes = reader.bytes();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a WriteBytesRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.WriteBytesRequestBody} WriteBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteBytesRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a WriteBytesRequestBody message.
         * @function verify
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        WriteBytesRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                if (!(message.bytes && typeof message.bytes.length === "number" || $util.isString(message.bytes)))
                    return "bytes: buffer expected";
            return null;
        };

        /**
         * Creates a WriteBytesRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.WriteBytesRequestBody} WriteBytesRequestBody
         */
        WriteBytesRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.WriteBytesRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.WriteBytesRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.WriteBytesRequestBody();
            if (object.bytes != null)
                if (typeof object.bytes === "string")
                    $util.base64.decode(object.bytes, message.bytes = $util.newBuffer($util.base64.length(object.bytes)), 0);
                else if (object.bytes.length >= 0)
                    message.bytes = object.bytes;
            return message;
        };

        /**
         * Creates a plain object from a WriteBytesRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {file.WriteBytesRequestBody} message WriteBytesRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        WriteBytesRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if (options.bytes === String)
                    object.bytes = "";
                else {
                    object.bytes = [];
                    if (options.bytes !== Array)
                        object.bytes = $util.newBuffer(object.bytes);
                }
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = options.bytes === String ? $util.base64.encode(message.bytes, 0, message.bytes.length) : options.bytes === Array ? Array.prototype.slice.call(message.bytes) : message.bytes;
            return object;
        };

        /**
         * Converts this WriteBytesRequestBody to JSON.
         * @function toJSON
         * @memberof file.WriteBytesRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        WriteBytesRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for WriteBytesRequestBody
         * @function getTypeUrl
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        WriteBytesRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.WriteBytesRequestBody";
        };

        return WriteBytesRequestBody;
    })();

    file.WriteTxtRequestBody = (function() {

        /**
         * Properties of a WriteTxtRequestBody.
         * @memberof file
         * @interface IWriteTxtRequestBody
         * @property {string|null} [txt] WriteTxtRequestBody txt
         */

        /**
         * Constructs a new WriteTxtRequestBody.
         * @memberof file
         * @classdesc Represents a WriteTxtRequestBody.
         * @implements IWriteTxtRequestBody
         * @constructor
         * @param {file.IWriteTxtRequestBody=} [properties] Properties to set
         */
        function WriteTxtRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * WriteTxtRequestBody txt.
         * @member {string} txt
         * @memberof file.WriteTxtRequestBody
         * @instance
         */
        WriteTxtRequestBody.prototype.txt = "";

        /**
         * Creates a new WriteTxtRequestBody instance using the specified properties.
         * @function create
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {file.IWriteTxtRequestBody=} [properties] Properties to set
         * @returns {file.WriteTxtRequestBody} WriteTxtRequestBody instance
         */
        WriteTxtRequestBody.create = function create(properties) {
            return new WriteTxtRequestBody(properties);
        };

        /**
         * Encodes the specified WriteTxtRequestBody message. Does not implicitly {@link file.WriteTxtRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {file.IWriteTxtRequestBody} message WriteTxtRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteTxtRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.txt);
            return writer;
        };

        /**
         * Encodes the specified WriteTxtRequestBody message, length delimited. Does not implicitly {@link file.WriteTxtRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {file.IWriteTxtRequestBody} message WriteTxtRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteTxtRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a WriteTxtRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.WriteTxtRequestBody} WriteTxtRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteTxtRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.WriteTxtRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.txt = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a WriteTxtRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.WriteTxtRequestBody} WriteTxtRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteTxtRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a WriteTxtRequestBody message.
         * @function verify
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        WriteTxtRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                if (!$util.isString(message.txt))
                    return "txt: string expected";
            return null;
        };

        /**
         * Creates a WriteTxtRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.WriteTxtRequestBody} WriteTxtRequestBody
         */
        WriteTxtRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.WriteTxtRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.WriteTxtRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.WriteTxtRequestBody();
            if (object.txt != null)
                message.txt = String(object.txt);
            return message;
        };

        /**
         * Creates a plain object from a WriteTxtRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {file.WriteTxtRequestBody} message WriteTxtRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        WriteTxtRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.txt = "";
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                object.txt = message.txt;
            return object;
        };

        /**
         * Converts this WriteTxtRequestBody to JSON.
         * @function toJSON
         * @memberof file.WriteTxtRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        WriteTxtRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for WriteTxtRequestBody
         * @function getTypeUrl
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        WriteTxtRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.WriteTxtRequestBody";
        };

        return WriteTxtRequestBody;
    })();

    file.WriteJsonRequestBody = (function() {

        /**
         * Properties of a WriteJsonRequestBody.
         * @memberof file
         * @interface IWriteJsonRequestBody
         * @property {string|null} [json] WriteJsonRequestBody json
         */

        /**
         * Constructs a new WriteJsonRequestBody.
         * @memberof file
         * @classdesc Represents a WriteJsonRequestBody.
         * @implements IWriteJsonRequestBody
         * @constructor
         * @param {file.IWriteJsonRequestBody=} [properties] Properties to set
         */
        function WriteJsonRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * WriteJsonRequestBody json.
         * @member {string} json
         * @memberof file.WriteJsonRequestBody
         * @instance
         */
        WriteJsonRequestBody.prototype.json = "";

        /**
         * Creates a new WriteJsonRequestBody instance using the specified properties.
         * @function create
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {file.IWriteJsonRequestBody=} [properties] Properties to set
         * @returns {file.WriteJsonRequestBody} WriteJsonRequestBody instance
         */
        WriteJsonRequestBody.create = function create(properties) {
            return new WriteJsonRequestBody(properties);
        };

        /**
         * Encodes the specified WriteJsonRequestBody message. Does not implicitly {@link file.WriteJsonRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {file.IWriteJsonRequestBody} message WriteJsonRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteJsonRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.json);
            return writer;
        };

        /**
         * Encodes the specified WriteJsonRequestBody message, length delimited. Does not implicitly {@link file.WriteJsonRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {file.IWriteJsonRequestBody} message WriteJsonRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteJsonRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a WriteJsonRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.WriteJsonRequestBody} WriteJsonRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteJsonRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.WriteJsonRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.json = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a WriteJsonRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.WriteJsonRequestBody} WriteJsonRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteJsonRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a WriteJsonRequestBody message.
         * @function verify
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        WriteJsonRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                if (!$util.isString(message.json))
                    return "json: string expected";
            return null;
        };

        /**
         * Creates a WriteJsonRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.WriteJsonRequestBody} WriteJsonRequestBody
         */
        WriteJsonRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.WriteJsonRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.WriteJsonRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.WriteJsonRequestBody();
            if (object.json != null)
                message.json = String(object.json);
            return message;
        };

        /**
         * Creates a plain object from a WriteJsonRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {file.WriteJsonRequestBody} message WriteJsonRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        WriteJsonRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.json = "";
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = message.json;
            return object;
        };

        /**
         * Converts this WriteJsonRequestBody to JSON.
         * @function toJSON
         * @memberof file.WriteJsonRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        WriteJsonRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for WriteJsonRequestBody
         * @function getTypeUrl
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        WriteJsonRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.WriteJsonRequestBody";
        };

        return WriteJsonRequestBody;
    })();

    file.GetByteSinkRequestBody = (function() {

        /**
         * Properties of a GetByteSinkRequestBody.
         * @memberof file
         * @interface IGetByteSinkRequestBody
         * @property {common.IBooleanValue|null} [truncateFile] GetByteSinkRequestBody truncateFile
         */

        /**
         * Constructs a new GetByteSinkRequestBody.
         * @memberof file
         * @classdesc Represents a GetByteSinkRequestBody.
         * @implements IGetByteSinkRequestBody
         * @constructor
         * @param {file.IGetByteSinkRequestBody=} [properties] Properties to set
         */
        function GetByteSinkRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * GetByteSinkRequestBody truncateFile.
         * @member {common.IBooleanValue|null|undefined} truncateFile
         * @memberof file.GetByteSinkRequestBody
         * @instance
         */
        GetByteSinkRequestBody.prototype.truncateFile = null;

        /**
         * Creates a new GetByteSinkRequestBody instance using the specified properties.
         * @function create
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {file.IGetByteSinkRequestBody=} [properties] Properties to set
         * @returns {file.GetByteSinkRequestBody} GetByteSinkRequestBody instance
         */
        GetByteSinkRequestBody.create = function create(properties) {
            return new GetByteSinkRequestBody(properties);
        };

        /**
         * Encodes the specified GetByteSinkRequestBody message. Does not implicitly {@link file.GetByteSinkRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {file.IGetByteSinkRequestBody} message GetByteSinkRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        GetByteSinkRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.truncateFile != null && Object.hasOwnProperty.call(message, "truncateFile"))
                $root.common.BooleanValue.encode(message.truncateFile, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified GetByteSinkRequestBody message, length delimited. Does not implicitly {@link file.GetByteSinkRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {file.IGetByteSinkRequestBody} message GetByteSinkRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        GetByteSinkRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a GetByteSinkRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.GetByteSinkRequestBody} GetByteSinkRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        GetByteSinkRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.GetByteSinkRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.truncateFile = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a GetByteSinkRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.GetByteSinkRequestBody} GetByteSinkRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        GetByteSinkRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a GetByteSinkRequestBody message.
         * @function verify
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        GetByteSinkRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.truncateFile != null && Object.hasOwnProperty.call(message, "truncateFile")) {
                var error = $root.common.BooleanValue.verify(message.truncateFile, long + 1);
                if (error)
                    return "truncateFile." + error;
            }
            return null;
        };

        /**
         * Creates a GetByteSinkRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.GetByteSinkRequestBody} GetByteSinkRequestBody
         */
        GetByteSinkRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.GetByteSinkRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.GetByteSinkRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.GetByteSinkRequestBody();
            if (object.truncateFile != null) {
                if (!$util.isObject(object.truncateFile))
                    throw TypeError(".file.GetByteSinkRequestBody.truncateFile: object expected");
                message.truncateFile = $root.common.BooleanValue.fromObject(object.truncateFile, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a GetByteSinkRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {file.GetByteSinkRequestBody} message GetByteSinkRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        GetByteSinkRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.truncateFile = null;
            if (message.truncateFile != null && Object.hasOwnProperty.call(message, "truncateFile"))
                object.truncateFile = $root.common.BooleanValue.toObject(message.truncateFile, options, q + 1);
            return object;
        };

        /**
         * Converts this GetByteSinkRequestBody to JSON.
         * @function toJSON
         * @memberof file.GetByteSinkRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        GetByteSinkRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for GetByteSinkRequestBody
         * @function getTypeUrl
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        GetByteSinkRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.GetByteSinkRequestBody";
        };

        return GetByteSinkRequestBody;
    })();

    file.CopyRequestBody = (function() {

        /**
         * Properties of a CopyRequestBody.
         * @memberof file
         * @interface ICopyRequestBody
         * @property {common.IObjectReference|null} [file] CopyRequestBody file
         */

        /**
         * Constructs a new CopyRequestBody.
         * @memberof file
         * @classdesc Represents a CopyRequestBody.
         * @implements ICopyRequestBody
         * @constructor
         * @param {file.ICopyRequestBody=} [properties] Properties to set
         */
        function CopyRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * CopyRequestBody file.
         * @member {common.IObjectReference|null|undefined} file
         * @memberof file.CopyRequestBody
         * @instance
         */
        CopyRequestBody.prototype.file = null;

        /**
         * Creates a new CopyRequestBody instance using the specified properties.
         * @function create
         * @memberof file.CopyRequestBody
         * @static
         * @param {file.ICopyRequestBody=} [properties] Properties to set
         * @returns {file.CopyRequestBody} CopyRequestBody instance
         */
        CopyRequestBody.create = function create(properties) {
            return new CopyRequestBody(properties);
        };

        /**
         * Encodes the specified CopyRequestBody message. Does not implicitly {@link file.CopyRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.CopyRequestBody
         * @static
         * @param {file.ICopyRequestBody} message CopyRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CopyRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                $root.common.ObjectReference.encode(message.file, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified CopyRequestBody message, length delimited. Does not implicitly {@link file.CopyRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.CopyRequestBody
         * @static
         * @param {file.ICopyRequestBody} message CopyRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CopyRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a CopyRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.CopyRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.CopyRequestBody} CopyRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CopyRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.CopyRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.file = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a CopyRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.CopyRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.CopyRequestBody} CopyRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CopyRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a CopyRequestBody message.
         * @function verify
         * @memberof file.CopyRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        CopyRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.file != null && Object.hasOwnProperty.call(message, "file")) {
                var error = $root.common.ObjectReference.verify(message.file, long + 1);
                if (error)
                    return "file." + error;
            }
            return null;
        };

        /**
         * Creates a CopyRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.CopyRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.CopyRequestBody} CopyRequestBody
         */
        CopyRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.CopyRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.CopyRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.CopyRequestBody();
            if (object.file != null) {
                if (!$util.isObject(object.file))
                    throw TypeError(".file.CopyRequestBody.file: object expected");
                message.file = $root.common.ObjectReference.fromObject(object.file, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a CopyRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.CopyRequestBody
         * @static
         * @param {file.CopyRequestBody} message CopyRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        CopyRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.file = null;
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                object.file = $root.common.ObjectReference.toObject(message.file, options, q + 1);
            return object;
        };

        /**
         * Converts this CopyRequestBody to JSON.
         * @function toJSON
         * @memberof file.CopyRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        CopyRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for CopyRequestBody
         * @function getTypeUrl
         * @memberof file.CopyRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        CopyRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.CopyRequestBody";
        };

        return CopyRequestBody;
    })();

    file.VersionedGetByteSinkRequestBody = (function() {

        /**
         * Properties of a VersionedGetByteSinkRequestBody.
         * @memberof file
         * @interface IVersionedGetByteSinkRequestBody
         * @property {common.IBooleanValue|null} [truncateFile] VersionedGetByteSinkRequestBody truncateFile
         * @property {common.IUInt64Value|null} [currentVersion] VersionedGetByteSinkRequestBody currentVersion
         */

        /**
         * Constructs a new VersionedGetByteSinkRequestBody.
         * @memberof file
         * @classdesc Represents a VersionedGetByteSinkRequestBody.
         * @implements IVersionedGetByteSinkRequestBody
         * @constructor
         * @param {file.IVersionedGetByteSinkRequestBody=} [properties] Properties to set
         */
        function VersionedGetByteSinkRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedGetByteSinkRequestBody truncateFile.
         * @member {common.IBooleanValue|null|undefined} truncateFile
         * @memberof file.VersionedGetByteSinkRequestBody
         * @instance
         */
        VersionedGetByteSinkRequestBody.prototype.truncateFile = null;

        /**
         * VersionedGetByteSinkRequestBody currentVersion.
         * @member {common.IUInt64Value|null|undefined} currentVersion
         * @memberof file.VersionedGetByteSinkRequestBody
         * @instance
         */
        VersionedGetByteSinkRequestBody.prototype.currentVersion = null;

        /**
         * Creates a new VersionedGetByteSinkRequestBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {file.IVersionedGetByteSinkRequestBody=} [properties] Properties to set
         * @returns {file.VersionedGetByteSinkRequestBody} VersionedGetByteSinkRequestBody instance
         */
        VersionedGetByteSinkRequestBody.create = function create(properties) {
            return new VersionedGetByteSinkRequestBody(properties);
        };

        /**
         * Encodes the specified VersionedGetByteSinkRequestBody message. Does not implicitly {@link file.VersionedGetByteSinkRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {file.IVersionedGetByteSinkRequestBody} message VersionedGetByteSinkRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetByteSinkRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.truncateFile != null && Object.hasOwnProperty.call(message, "truncateFile"))
                $root.common.BooleanValue.encode(message.truncateFile, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                $root.common.UInt64Value.encode(message.currentVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedGetByteSinkRequestBody message, length delimited. Does not implicitly {@link file.VersionedGetByteSinkRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {file.IVersionedGetByteSinkRequestBody} message VersionedGetByteSinkRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetByteSinkRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedGetByteSinkRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedGetByteSinkRequestBody} VersionedGetByteSinkRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetByteSinkRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetByteSinkRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.truncateFile = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.currentVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedGetByteSinkRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedGetByteSinkRequestBody} VersionedGetByteSinkRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetByteSinkRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedGetByteSinkRequestBody message.
         * @function verify
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedGetByteSinkRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.truncateFile != null && Object.hasOwnProperty.call(message, "truncateFile")) {
                var error = $root.common.BooleanValue.verify(message.truncateFile, long + 1);
                if (error)
                    return "truncateFile." + error;
            }
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion")) {
                var error = $root.common.UInt64Value.verify(message.currentVersion, long + 1);
                if (error)
                    return "currentVersion." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedGetByteSinkRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedGetByteSinkRequestBody} VersionedGetByteSinkRequestBody
         */
        VersionedGetByteSinkRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedGetByteSinkRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedGetByteSinkRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedGetByteSinkRequestBody();
            if (object.truncateFile != null) {
                if (!$util.isObject(object.truncateFile))
                    throw TypeError(".file.VersionedGetByteSinkRequestBody.truncateFile: object expected");
                message.truncateFile = $root.common.BooleanValue.fromObject(object.truncateFile, long + 1);
            }
            if (object.currentVersion != null) {
                if (!$util.isObject(object.currentVersion))
                    throw TypeError(".file.VersionedGetByteSinkRequestBody.currentVersion: object expected");
                message.currentVersion = $root.common.UInt64Value.fromObject(object.currentVersion, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedGetByteSinkRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {file.VersionedGetByteSinkRequestBody} message VersionedGetByteSinkRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedGetByteSinkRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.truncateFile = null;
                object.currentVersion = null;
            }
            if (message.truncateFile != null && Object.hasOwnProperty.call(message, "truncateFile"))
                object.truncateFile = $root.common.BooleanValue.toObject(message.truncateFile, options, q + 1);
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                object.currentVersion = $root.common.UInt64Value.toObject(message.currentVersion, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedGetByteSinkRequestBody to JSON.
         * @function toJSON
         * @memberof file.VersionedGetByteSinkRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedGetByteSinkRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedGetByteSinkRequestBody
         * @function getTypeUrl
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedGetByteSinkRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedGetByteSinkRequestBody";
        };

        return VersionedGetByteSinkRequestBody;
    })();

    file.VersionedGetByteSinkReplyBody = (function() {

        /**
         * Properties of a VersionedGetByteSinkReplyBody.
         * @memberof file
         * @interface IVersionedGetByteSinkReplyBody
         * @property {number|Long|null} [version] VersionedGetByteSinkReplyBody version
         * @property {common.IObjectReference|null} [sink] VersionedGetByteSinkReplyBody sink
         */

        /**
         * Constructs a new VersionedGetByteSinkReplyBody.
         * @memberof file
         * @classdesc Represents a VersionedGetByteSinkReplyBody.
         * @implements IVersionedGetByteSinkReplyBody
         * @constructor
         * @param {file.IVersionedGetByteSinkReplyBody=} [properties] Properties to set
         */
        function VersionedGetByteSinkReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedGetByteSinkReplyBody version.
         * @member {number|Long} version
         * @memberof file.VersionedGetByteSinkReplyBody
         * @instance
         */
        VersionedGetByteSinkReplyBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * VersionedGetByteSinkReplyBody sink.
         * @member {common.IObjectReference|null|undefined} sink
         * @memberof file.VersionedGetByteSinkReplyBody
         * @instance
         */
        VersionedGetByteSinkReplyBody.prototype.sink = null;

        /**
         * Creates a new VersionedGetByteSinkReplyBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {file.IVersionedGetByteSinkReplyBody=} [properties] Properties to set
         * @returns {file.VersionedGetByteSinkReplyBody} VersionedGetByteSinkReplyBody instance
         */
        VersionedGetByteSinkReplyBody.create = function create(properties) {
            return new VersionedGetByteSinkReplyBody(properties);
        };

        /**
         * Encodes the specified VersionedGetByteSinkReplyBody message. Does not implicitly {@link file.VersionedGetByteSinkReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {file.IVersionedGetByteSinkReplyBody} message VersionedGetByteSinkReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetByteSinkReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            if (message.sink != null && Object.hasOwnProperty.call(message, "sink"))
                $root.common.ObjectReference.encode(message.sink, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedGetByteSinkReplyBody message, length delimited. Does not implicitly {@link file.VersionedGetByteSinkReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {file.IVersionedGetByteSinkReplyBody} message VersionedGetByteSinkReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetByteSinkReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedGetByteSinkReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedGetByteSinkReplyBody} VersionedGetByteSinkReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetByteSinkReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetByteSinkReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.sink = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedGetByteSinkReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedGetByteSinkReplyBody} VersionedGetByteSinkReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetByteSinkReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedGetByteSinkReplyBody message.
         * @function verify
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedGetByteSinkReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            if (message.sink != null && Object.hasOwnProperty.call(message, "sink")) {
                var error = $root.common.ObjectReference.verify(message.sink, long + 1);
                if (error)
                    return "sink." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedGetByteSinkReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedGetByteSinkReplyBody} VersionedGetByteSinkReplyBody
         */
        VersionedGetByteSinkReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedGetByteSinkReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedGetByteSinkReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedGetByteSinkReplyBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            if (object.sink != null) {
                if (!$util.isObject(object.sink))
                    throw TypeError(".file.VersionedGetByteSinkReplyBody.sink: object expected");
                message.sink = $root.common.ObjectReference.fromObject(object.sink, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedGetByteSinkReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {file.VersionedGetByteSinkReplyBody} message VersionedGetByteSinkReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedGetByteSinkReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.sink = null;
            }
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            if (message.sink != null && Object.hasOwnProperty.call(message, "sink"))
                object.sink = $root.common.ObjectReference.toObject(message.sink, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedGetByteSinkReplyBody to JSON.
         * @function toJSON
         * @memberof file.VersionedGetByteSinkReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedGetByteSinkReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedGetByteSinkReplyBody
         * @function getTypeUrl
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedGetByteSinkReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedGetByteSinkReplyBody";
        };

        return VersionedGetByteSinkReplyBody;
    })();

    file.ArchiveCurrentRequestBody = (function() {

        /**
         * Properties of an ArchiveCurrentRequestBody.
         * @memberof file
         * @interface IArchiveCurrentRequestBody
         * @property {common.IUInt64Value|null} [version] ArchiveCurrentRequestBody version
         */

        /**
         * Constructs a new ArchiveCurrentRequestBody.
         * @memberof file
         * @classdesc Represents an ArchiveCurrentRequestBody.
         * @implements IArchiveCurrentRequestBody
         * @constructor
         * @param {file.IArchiveCurrentRequestBody=} [properties] Properties to set
         */
        function ArchiveCurrentRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ArchiveCurrentRequestBody version.
         * @member {common.IUInt64Value|null|undefined} version
         * @memberof file.ArchiveCurrentRequestBody
         * @instance
         */
        ArchiveCurrentRequestBody.prototype.version = null;

        /**
         * Creates a new ArchiveCurrentRequestBody instance using the specified properties.
         * @function create
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {file.IArchiveCurrentRequestBody=} [properties] Properties to set
         * @returns {file.ArchiveCurrentRequestBody} ArchiveCurrentRequestBody instance
         */
        ArchiveCurrentRequestBody.create = function create(properties) {
            return new ArchiveCurrentRequestBody(properties);
        };

        /**
         * Encodes the specified ArchiveCurrentRequestBody message. Does not implicitly {@link file.ArchiveCurrentRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {file.IArchiveCurrentRequestBody} message ArchiveCurrentRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ArchiveCurrentRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                $root.common.UInt64Value.encode(message.version, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified ArchiveCurrentRequestBody message, length delimited. Does not implicitly {@link file.ArchiveCurrentRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {file.IArchiveCurrentRequestBody} message ArchiveCurrentRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ArchiveCurrentRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an ArchiveCurrentRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.ArchiveCurrentRequestBody} ArchiveCurrentRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ArchiveCurrentRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ArchiveCurrentRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an ArchiveCurrentRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.ArchiveCurrentRequestBody} ArchiveCurrentRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ArchiveCurrentRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an ArchiveCurrentRequestBody message.
         * @function verify
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ArchiveCurrentRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version")) {
                var error = $root.common.UInt64Value.verify(message.version, long + 1);
                if (error)
                    return "version." + error;
            }
            return null;
        };

        /**
         * Creates an ArchiveCurrentRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.ArchiveCurrentRequestBody} ArchiveCurrentRequestBody
         */
        ArchiveCurrentRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.ArchiveCurrentRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.ArchiveCurrentRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.ArchiveCurrentRequestBody();
            if (object.version != null) {
                if (!$util.isObject(object.version))
                    throw TypeError(".file.ArchiveCurrentRequestBody.version: object expected");
                message.version = $root.common.UInt64Value.fromObject(object.version, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an ArchiveCurrentRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {file.ArchiveCurrentRequestBody} message ArchiveCurrentRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ArchiveCurrentRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.version = null;
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                object.version = $root.common.UInt64Value.toObject(message.version, options, q + 1);
            return object;
        };

        /**
         * Converts this ArchiveCurrentRequestBody to JSON.
         * @function toJSON
         * @memberof file.ArchiveCurrentRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ArchiveCurrentRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ArchiveCurrentRequestBody
         * @function getTypeUrl
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ArchiveCurrentRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.ArchiveCurrentRequestBody";
        };

        return ArchiveCurrentRequestBody;
    })();

    file.FileSyncIsOnDiskRequestBody = (function() {

        /**
         * Properties of a FileSyncIsOnDiskRequestBody.
         * @memberof file
         * @interface IFileSyncIsOnDiskRequestBody
         * @property {number|Long|null} [version] FileSyncIsOnDiskRequestBody version
         */

        /**
         * Constructs a new FileSyncIsOnDiskRequestBody.
         * @memberof file
         * @classdesc Represents a FileSyncIsOnDiskRequestBody.
         * @implements IFileSyncIsOnDiskRequestBody
         * @constructor
         * @param {file.IFileSyncIsOnDiskRequestBody=} [properties] Properties to set
         */
        function FileSyncIsOnDiskRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileSyncIsOnDiskRequestBody version.
         * @member {number|Long} version
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @instance
         */
        FileSyncIsOnDiskRequestBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new FileSyncIsOnDiskRequestBody instance using the specified properties.
         * @function create
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {file.IFileSyncIsOnDiskRequestBody=} [properties] Properties to set
         * @returns {file.FileSyncIsOnDiskRequestBody} FileSyncIsOnDiskRequestBody instance
         */
        FileSyncIsOnDiskRequestBody.create = function create(properties) {
            return new FileSyncIsOnDiskRequestBody(properties);
        };

        /**
         * Encodes the specified FileSyncIsOnDiskRequestBody message. Does not implicitly {@link file.FileSyncIsOnDiskRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {file.IFileSyncIsOnDiskRequestBody} message FileSyncIsOnDiskRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncIsOnDiskRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            return writer;
        };

        /**
         * Encodes the specified FileSyncIsOnDiskRequestBody message, length delimited. Does not implicitly {@link file.FileSyncIsOnDiskRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {file.IFileSyncIsOnDiskRequestBody} message FileSyncIsOnDiskRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncIsOnDiskRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileSyncIsOnDiskRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileSyncIsOnDiskRequestBody} FileSyncIsOnDiskRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncIsOnDiskRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncIsOnDiskRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileSyncIsOnDiskRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.FileSyncIsOnDiskRequestBody} FileSyncIsOnDiskRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncIsOnDiskRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileSyncIsOnDiskRequestBody message.
         * @function verify
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileSyncIsOnDiskRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            return null;
        };

        /**
         * Creates a FileSyncIsOnDiskRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileSyncIsOnDiskRequestBody} FileSyncIsOnDiskRequestBody
         */
        FileSyncIsOnDiskRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.FileSyncIsOnDiskRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.FileSyncIsOnDiskRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.FileSyncIsOnDiskRequestBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from a FileSyncIsOnDiskRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {file.FileSyncIsOnDiskRequestBody} message FileSyncIsOnDiskRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileSyncIsOnDiskRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            return object;
        };

        /**
         * Converts this FileSyncIsOnDiskRequestBody to JSON.
         * @function toJSON
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileSyncIsOnDiskRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileSyncIsOnDiskRequestBody
         * @function getTypeUrl
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileSyncIsOnDiskRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.FileSyncIsOnDiskRequestBody";
        };

        return FileSyncIsOnDiskRequestBody;
    })();

    file.FileSyncIsOnDiskReplyBody = (function() {

        /**
         * Properties of a FileSyncIsOnDiskReplyBody.
         * @memberof file
         * @interface IFileSyncIsOnDiskReplyBody
         * @property {string|null} [status] FileSyncIsOnDiskReplyBody status
         */

        /**
         * Constructs a new FileSyncIsOnDiskReplyBody.
         * @memberof file
         * @classdesc Represents a FileSyncIsOnDiskReplyBody.
         * @implements IFileSyncIsOnDiskReplyBody
         * @constructor
         * @param {file.IFileSyncIsOnDiskReplyBody=} [properties] Properties to set
         */
        function FileSyncIsOnDiskReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileSyncIsOnDiskReplyBody status.
         * @member {string} status
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @instance
         */
        FileSyncIsOnDiskReplyBody.prototype.status = "";

        /**
         * Creates a new FileSyncIsOnDiskReplyBody instance using the specified properties.
         * @function create
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {file.IFileSyncIsOnDiskReplyBody=} [properties] Properties to set
         * @returns {file.FileSyncIsOnDiskReplyBody} FileSyncIsOnDiskReplyBody instance
         */
        FileSyncIsOnDiskReplyBody.create = function create(properties) {
            return new FileSyncIsOnDiskReplyBody(properties);
        };

        /**
         * Encodes the specified FileSyncIsOnDiskReplyBody message. Does not implicitly {@link file.FileSyncIsOnDiskReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {file.IFileSyncIsOnDiskReplyBody} message FileSyncIsOnDiskReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncIsOnDiskReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.status != null && Object.hasOwnProperty.call(message, "status"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.status);
            return writer;
        };

        /**
         * Encodes the specified FileSyncIsOnDiskReplyBody message, length delimited. Does not implicitly {@link file.FileSyncIsOnDiskReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {file.IFileSyncIsOnDiskReplyBody} message FileSyncIsOnDiskReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncIsOnDiskReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileSyncIsOnDiskReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileSyncIsOnDiskReplyBody} FileSyncIsOnDiskReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncIsOnDiskReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncIsOnDiskReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.status = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileSyncIsOnDiskReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.FileSyncIsOnDiskReplyBody} FileSyncIsOnDiskReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncIsOnDiskReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileSyncIsOnDiskReplyBody message.
         * @function verify
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileSyncIsOnDiskReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.status != null && Object.hasOwnProperty.call(message, "status"))
                if (!$util.isString(message.status))
                    return "status: string expected";
            return null;
        };

        /**
         * Creates a FileSyncIsOnDiskReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileSyncIsOnDiskReplyBody} FileSyncIsOnDiskReplyBody
         */
        FileSyncIsOnDiskReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.FileSyncIsOnDiskReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.FileSyncIsOnDiskReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.FileSyncIsOnDiskReplyBody();
            if (object.status != null)
                message.status = String(object.status);
            return message;
        };

        /**
         * Creates a plain object from a FileSyncIsOnDiskReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {file.FileSyncIsOnDiskReplyBody} message FileSyncIsOnDiskReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileSyncIsOnDiskReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.status = "";
            if (message.status != null && Object.hasOwnProperty.call(message, "status"))
                object.status = message.status;
            return object;
        };

        /**
         * Converts this FileSyncIsOnDiskReplyBody to JSON.
         * @function toJSON
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileSyncIsOnDiskReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileSyncIsOnDiskReplyBody
         * @function getTypeUrl
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileSyncIsOnDiskReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.FileSyncIsOnDiskReplyBody";
        };

        return FileSyncIsOnDiskReplyBody;
    })();

    file.FileSyncStartDownloadRequestBody = (function() {

        /**
         * Properties of a FileSyncStartDownloadRequestBody.
         * @memberof file
         * @interface IFileSyncStartDownloadRequestBody
         * @property {number|Long|null} [version] FileSyncStartDownloadRequestBody version
         */

        /**
         * Constructs a new FileSyncStartDownloadRequestBody.
         * @memberof file
         * @classdesc Represents a FileSyncStartDownloadRequestBody.
         * @implements IFileSyncStartDownloadRequestBody
         * @constructor
         * @param {file.IFileSyncStartDownloadRequestBody=} [properties] Properties to set
         */
        function FileSyncStartDownloadRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileSyncStartDownloadRequestBody version.
         * @member {number|Long} version
         * @memberof file.FileSyncStartDownloadRequestBody
         * @instance
         */
        FileSyncStartDownloadRequestBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new FileSyncStartDownloadRequestBody instance using the specified properties.
         * @function create
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {file.IFileSyncStartDownloadRequestBody=} [properties] Properties to set
         * @returns {file.FileSyncStartDownloadRequestBody} FileSyncStartDownloadRequestBody instance
         */
        FileSyncStartDownloadRequestBody.create = function create(properties) {
            return new FileSyncStartDownloadRequestBody(properties);
        };

        /**
         * Encodes the specified FileSyncStartDownloadRequestBody message. Does not implicitly {@link file.FileSyncStartDownloadRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {file.IFileSyncStartDownloadRequestBody} message FileSyncStartDownloadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncStartDownloadRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            return writer;
        };

        /**
         * Encodes the specified FileSyncStartDownloadRequestBody message, length delimited. Does not implicitly {@link file.FileSyncStartDownloadRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {file.IFileSyncStartDownloadRequestBody} message FileSyncStartDownloadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncStartDownloadRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileSyncStartDownloadRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileSyncStartDownloadRequestBody} FileSyncStartDownloadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncStartDownloadRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncStartDownloadRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileSyncStartDownloadRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.FileSyncStartDownloadRequestBody} FileSyncStartDownloadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncStartDownloadRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileSyncStartDownloadRequestBody message.
         * @function verify
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileSyncStartDownloadRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            return null;
        };

        /**
         * Creates a FileSyncStartDownloadRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileSyncStartDownloadRequestBody} FileSyncStartDownloadRequestBody
         */
        FileSyncStartDownloadRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.FileSyncStartDownloadRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.FileSyncStartDownloadRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.FileSyncStartDownloadRequestBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from a FileSyncStartDownloadRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {file.FileSyncStartDownloadRequestBody} message FileSyncStartDownloadRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileSyncStartDownloadRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            return object;
        };

        /**
         * Converts this FileSyncStartDownloadRequestBody to JSON.
         * @function toJSON
         * @memberof file.FileSyncStartDownloadRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileSyncStartDownloadRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileSyncStartDownloadRequestBody
         * @function getTypeUrl
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileSyncStartDownloadRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.FileSyncStartDownloadRequestBody";
        };

        return FileSyncStartDownloadRequestBody;
    })();

    file.FileSyncStartDownloadReplyBody = (function() {

        /**
         * Properties of a FileSyncStartDownloadReplyBody.
         * @memberof file
         * @interface IFileSyncStartDownloadReplyBody
         * @property {file.FileSyncStartDownloadReplyBody.IDownloadInfo|null} [startedDownload] FileSyncStartDownloadReplyBody startedDownload
         */

        /**
         * Constructs a new FileSyncStartDownloadReplyBody.
         * @memberof file
         * @classdesc Represents a FileSyncStartDownloadReplyBody.
         * @implements IFileSyncStartDownloadReplyBody
         * @constructor
         * @param {file.IFileSyncStartDownloadReplyBody=} [properties] Properties to set
         */
        function FileSyncStartDownloadReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileSyncStartDownloadReplyBody startedDownload.
         * @member {file.FileSyncStartDownloadReplyBody.IDownloadInfo|null|undefined} startedDownload
         * @memberof file.FileSyncStartDownloadReplyBody
         * @instance
         */
        FileSyncStartDownloadReplyBody.prototype.startedDownload = null;

        /**
         * Creates a new FileSyncStartDownloadReplyBody instance using the specified properties.
         * @function create
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {file.IFileSyncStartDownloadReplyBody=} [properties] Properties to set
         * @returns {file.FileSyncStartDownloadReplyBody} FileSyncStartDownloadReplyBody instance
         */
        FileSyncStartDownloadReplyBody.create = function create(properties) {
            return new FileSyncStartDownloadReplyBody(properties);
        };

        /**
         * Encodes the specified FileSyncStartDownloadReplyBody message. Does not implicitly {@link file.FileSyncStartDownloadReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {file.IFileSyncStartDownloadReplyBody} message FileSyncStartDownloadReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncStartDownloadReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.startedDownload != null && Object.hasOwnProperty.call(message, "startedDownload"))
                $root.file.FileSyncStartDownloadReplyBody.DownloadInfo.encode(message.startedDownload, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FileSyncStartDownloadReplyBody message, length delimited. Does not implicitly {@link file.FileSyncStartDownloadReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {file.IFileSyncStartDownloadReplyBody} message FileSyncStartDownloadReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncStartDownloadReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileSyncStartDownloadReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileSyncStartDownloadReplyBody} FileSyncStartDownloadReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncStartDownloadReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncStartDownloadReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.startedDownload = $root.file.FileSyncStartDownloadReplyBody.DownloadInfo.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileSyncStartDownloadReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.FileSyncStartDownloadReplyBody} FileSyncStartDownloadReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncStartDownloadReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileSyncStartDownloadReplyBody message.
         * @function verify
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileSyncStartDownloadReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.startedDownload != null && Object.hasOwnProperty.call(message, "startedDownload")) {
                var error = $root.file.FileSyncStartDownloadReplyBody.DownloadInfo.verify(message.startedDownload, long + 1);
                if (error)
                    return "startedDownload." + error;
            }
            return null;
        };

        /**
         * Creates a FileSyncStartDownloadReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileSyncStartDownloadReplyBody} FileSyncStartDownloadReplyBody
         */
        FileSyncStartDownloadReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.FileSyncStartDownloadReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.FileSyncStartDownloadReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.FileSyncStartDownloadReplyBody();
            if (object.startedDownload != null) {
                if (!$util.isObject(object.startedDownload))
                    throw TypeError(".file.FileSyncStartDownloadReplyBody.startedDownload: object expected");
                message.startedDownload = $root.file.FileSyncStartDownloadReplyBody.DownloadInfo.fromObject(object.startedDownload, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a FileSyncStartDownloadReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {file.FileSyncStartDownloadReplyBody} message FileSyncStartDownloadReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileSyncStartDownloadReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.startedDownload = null;
            if (message.startedDownload != null && Object.hasOwnProperty.call(message, "startedDownload"))
                object.startedDownload = $root.file.FileSyncStartDownloadReplyBody.DownloadInfo.toObject(message.startedDownload, options, q + 1);
            return object;
        };

        /**
         * Converts this FileSyncStartDownloadReplyBody to JSON.
         * @function toJSON
         * @memberof file.FileSyncStartDownloadReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileSyncStartDownloadReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileSyncStartDownloadReplyBody
         * @function getTypeUrl
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileSyncStartDownloadReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.FileSyncStartDownloadReplyBody";
        };

        FileSyncStartDownloadReplyBody.DownloadInfo = (function() {

            /**
             * Properties of a DownloadInfo.
             * @memberof file.FileSyncStartDownloadReplyBody
             * @interface IDownloadInfo
             * @property {number|Long|null} [downloadTaskId] DownloadInfo downloadTaskId
             */

            /**
             * Constructs a new DownloadInfo.
             * @memberof file.FileSyncStartDownloadReplyBody
             * @classdesc Represents a DownloadInfo.
             * @implements IDownloadInfo
             * @constructor
             * @param {file.FileSyncStartDownloadReplyBody.IDownloadInfo=} [properties] Properties to set
             */
            function DownloadInfo(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * DownloadInfo downloadTaskId.
             * @member {number|Long} downloadTaskId
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @instance
             */
            DownloadInfo.prototype.downloadTaskId = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

            /**
             * Creates a new DownloadInfo instance using the specified properties.
             * @function create
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {file.FileSyncStartDownloadReplyBody.IDownloadInfo=} [properties] Properties to set
             * @returns {file.FileSyncStartDownloadReplyBody.DownloadInfo} DownloadInfo instance
             */
            DownloadInfo.create = function create(properties) {
                return new DownloadInfo(properties);
            };

            /**
             * Encodes the specified DownloadInfo message. Does not implicitly {@link file.FileSyncStartDownloadReplyBody.DownloadInfo.verify|verify} messages.
             * @function encode
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {file.FileSyncStartDownloadReplyBody.IDownloadInfo} message DownloadInfo message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            DownloadInfo.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.downloadTaskId != null && Object.hasOwnProperty.call(message, "downloadTaskId"))
                    writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.downloadTaskId);
                return writer;
            };

            /**
             * Encodes the specified DownloadInfo message, length delimited. Does not implicitly {@link file.FileSyncStartDownloadReplyBody.DownloadInfo.verify|verify} messages.
             * @function encodeDelimited
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {file.FileSyncStartDownloadReplyBody.IDownloadInfo} message DownloadInfo message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            DownloadInfo.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes a DownloadInfo message from the specified reader or buffer.
             * @function decode
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {file.FileSyncStartDownloadReplyBody.DownloadInfo} DownloadInfo
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            DownloadInfo.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncStartDownloadReplyBody.DownloadInfo();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 2: {
                            message.downloadTaskId = reader.uint64();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a DownloadInfo message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {file.FileSyncStartDownloadReplyBody.DownloadInfo} DownloadInfo
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            DownloadInfo.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a DownloadInfo message.
             * @function verify
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            DownloadInfo.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.downloadTaskId != null && Object.hasOwnProperty.call(message, "downloadTaskId"))
                    if (!$util.isInteger(message.downloadTaskId) && !(message.downloadTaskId && $util.isInteger(message.downloadTaskId.low) && $util.isInteger(message.downloadTaskId.high)))
                        return "downloadTaskId: integer|Long expected";
                return null;
            };

            /**
             * Creates a DownloadInfo message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {file.FileSyncStartDownloadReplyBody.DownloadInfo} DownloadInfo
             */
            DownloadInfo.fromObject = function fromObject(object, long) {
                if (object instanceof $root.file.FileSyncStartDownloadReplyBody.DownloadInfo)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".file.FileSyncStartDownloadReplyBody.DownloadInfo: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.file.FileSyncStartDownloadReplyBody.DownloadInfo();
                if (object.downloadTaskId != null)
                    if ($util.Long)
                        message.downloadTaskId = $util.Long.fromValue(object.downloadTaskId, true);
                    else if (typeof object.downloadTaskId === "string")
                        message.downloadTaskId = parseInt(object.downloadTaskId, 10);
                    else if (typeof object.downloadTaskId === "number")
                        message.downloadTaskId = object.downloadTaskId;
                    else if (typeof object.downloadTaskId === "object")
                        message.downloadTaskId = new $util.LongBits(object.downloadTaskId.low >>> 0, object.downloadTaskId.high >>> 0).toNumber(true);
                return message;
            };

            /**
             * Creates a plain object from a DownloadInfo message. Also converts values to other types if specified.
             * @function toObject
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {file.FileSyncStartDownloadReplyBody.DownloadInfo} message DownloadInfo
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            DownloadInfo.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults)
                    if ($util.Long) {
                        var long = new $util.Long(0, 0, true);
                        object.downloadTaskId = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                    } else
                        object.downloadTaskId = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                if (message.downloadTaskId != null && Object.hasOwnProperty.call(message, "downloadTaskId"))
                    if (typeof BigInt !== "undefined" && options.longs === BigInt)
                        object.downloadTaskId = typeof message.downloadTaskId === "number" ? BigInt(message.downloadTaskId) : $util.Long.fromBits(message.downloadTaskId.low >>> 0, message.downloadTaskId.high >>> 0, true).toBigInt();
                    else if (typeof message.downloadTaskId === "number")
                        object.downloadTaskId = options.longs === String ? String(message.downloadTaskId) : message.downloadTaskId;
                    else
                        object.downloadTaskId = options.longs === String ? $util.Long.prototype.toString.call(message.downloadTaskId) : options.longs === Number ? new $util.LongBits(message.downloadTaskId.low >>> 0, message.downloadTaskId.high >>> 0).toNumber(true) : message.downloadTaskId;
                return object;
            };

            /**
             * Converts this DownloadInfo to JSON.
             * @function toJSON
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            DownloadInfo.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for DownloadInfo
             * @function getTypeUrl
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            DownloadInfo.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/file.FileSyncStartDownloadReplyBody.DownloadInfo";
            };

            return DownloadInfo;
        })();

        return FileSyncStartDownloadReplyBody;
    })();

    file.AdoptRemoteRequestBody = (function() {

        /**
         * Properties of an AdoptRemoteRequestBody.
         * @memberof file
         * @interface IAdoptRemoteRequestBody
         * @property {file.IOptionsToAdopteRemote|null} [opts] AdoptRemoteRequestBody opts
         */

        /**
         * Constructs a new AdoptRemoteRequestBody.
         * @memberof file
         * @classdesc Represents an AdoptRemoteRequestBody.
         * @implements IAdoptRemoteRequestBody
         * @constructor
         * @param {file.IAdoptRemoteRequestBody=} [properties] Properties to set
         */
        function AdoptRemoteRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * AdoptRemoteRequestBody opts.
         * @member {file.IOptionsToAdopteRemote|null|undefined} opts
         * @memberof file.AdoptRemoteRequestBody
         * @instance
         */
        AdoptRemoteRequestBody.prototype.opts = null;

        /**
         * Creates a new AdoptRemoteRequestBody instance using the specified properties.
         * @function create
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {file.IAdoptRemoteRequestBody=} [properties] Properties to set
         * @returns {file.AdoptRemoteRequestBody} AdoptRemoteRequestBody instance
         */
        AdoptRemoteRequestBody.create = function create(properties) {
            return new AdoptRemoteRequestBody(properties);
        };

        /**
         * Encodes the specified AdoptRemoteRequestBody message. Does not implicitly {@link file.AdoptRemoteRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {file.IAdoptRemoteRequestBody} message AdoptRemoteRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AdoptRemoteRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.file.OptionsToAdopteRemote.encode(message.opts, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified AdoptRemoteRequestBody message, length delimited. Does not implicitly {@link file.AdoptRemoteRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {file.IAdoptRemoteRequestBody} message AdoptRemoteRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AdoptRemoteRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an AdoptRemoteRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.AdoptRemoteRequestBody} AdoptRemoteRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AdoptRemoteRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.AdoptRemoteRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.opts = $root.file.OptionsToAdopteRemote.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an AdoptRemoteRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.AdoptRemoteRequestBody} AdoptRemoteRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AdoptRemoteRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an AdoptRemoteRequestBody message.
         * @function verify
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        AdoptRemoteRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts")) {
                var error = $root.file.OptionsToAdopteRemote.verify(message.opts, long + 1);
                if (error)
                    return "opts." + error;
            }
            return null;
        };

        /**
         * Creates an AdoptRemoteRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.AdoptRemoteRequestBody} AdoptRemoteRequestBody
         */
        AdoptRemoteRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.AdoptRemoteRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.AdoptRemoteRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.AdoptRemoteRequestBody();
            if (object.opts != null) {
                if (!$util.isObject(object.opts))
                    throw TypeError(".file.AdoptRemoteRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToAdopteRemote.fromObject(object.opts, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an AdoptRemoteRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {file.AdoptRemoteRequestBody} message AdoptRemoteRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        AdoptRemoteRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.opts = null;
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                object.opts = $root.file.OptionsToAdopteRemote.toObject(message.opts, options, q + 1);
            return object;
        };

        /**
         * Converts this AdoptRemoteRequestBody to JSON.
         * @function toJSON
         * @memberof file.AdoptRemoteRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        AdoptRemoteRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for AdoptRemoteRequestBody
         * @function getTypeUrl
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        AdoptRemoteRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.AdoptRemoteRequestBody";
        };

        return AdoptRemoteRequestBody;
    })();

    file.OptionsToAdopteRemote = (function() {

        /**
         * Properties of an OptionsToAdopteRemote.
         * @memberof file
         * @interface IOptionsToAdopteRemote
         * @property {common.IBooleanValue|null} [dropLocalVer] OptionsToAdopteRemote dropLocalVer
         * @property {common.IUInt64Value|null} [remoteVersion] OptionsToAdopteRemote remoteVersion
         */

        /**
         * Constructs a new OptionsToAdopteRemote.
         * @memberof file
         * @classdesc Represents an OptionsToAdopteRemote.
         * @implements IOptionsToAdopteRemote
         * @constructor
         * @param {file.IOptionsToAdopteRemote=} [properties] Properties to set
         */
        function OptionsToAdopteRemote(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * OptionsToAdopteRemote dropLocalVer.
         * @member {common.IBooleanValue|null|undefined} dropLocalVer
         * @memberof file.OptionsToAdopteRemote
         * @instance
         */
        OptionsToAdopteRemote.prototype.dropLocalVer = null;

        /**
         * OptionsToAdopteRemote remoteVersion.
         * @member {common.IUInt64Value|null|undefined} remoteVersion
         * @memberof file.OptionsToAdopteRemote
         * @instance
         */
        OptionsToAdopteRemote.prototype.remoteVersion = null;

        /**
         * Creates a new OptionsToAdopteRemote instance using the specified properties.
         * @function create
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {file.IOptionsToAdopteRemote=} [properties] Properties to set
         * @returns {file.OptionsToAdopteRemote} OptionsToAdopteRemote instance
         */
        OptionsToAdopteRemote.create = function create(properties) {
            return new OptionsToAdopteRemote(properties);
        };

        /**
         * Encodes the specified OptionsToAdopteRemote message. Does not implicitly {@link file.OptionsToAdopteRemote.verify|verify} messages.
         * @function encode
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {file.IOptionsToAdopteRemote} message OptionsToAdopteRemote message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        OptionsToAdopteRemote.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.dropLocalVer != null && Object.hasOwnProperty.call(message, "dropLocalVer"))
                $root.common.BooleanValue.encode(message.dropLocalVer, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified OptionsToAdopteRemote message, length delimited. Does not implicitly {@link file.OptionsToAdopteRemote.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {file.IOptionsToAdopteRemote} message OptionsToAdopteRemote message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        OptionsToAdopteRemote.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an OptionsToAdopteRemote message from the specified reader or buffer.
         * @function decode
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.OptionsToAdopteRemote} OptionsToAdopteRemote
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        OptionsToAdopteRemote.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.OptionsToAdopteRemote();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.dropLocalVer = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an OptionsToAdopteRemote message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.OptionsToAdopteRemote} OptionsToAdopteRemote
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        OptionsToAdopteRemote.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an OptionsToAdopteRemote message.
         * @function verify
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        OptionsToAdopteRemote.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.dropLocalVer != null && Object.hasOwnProperty.call(message, "dropLocalVer")) {
                var error = $root.common.BooleanValue.verify(message.dropLocalVer, long + 1);
                if (error)
                    return "dropLocalVer." + error;
            }
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion, long + 1);
                if (error)
                    return "remoteVersion." + error;
            }
            return null;
        };

        /**
         * Creates an OptionsToAdopteRemote message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.OptionsToAdopteRemote} OptionsToAdopteRemote
         */
        OptionsToAdopteRemote.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.OptionsToAdopteRemote)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.OptionsToAdopteRemote: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.OptionsToAdopteRemote();
            if (object.dropLocalVer != null) {
                if (!$util.isObject(object.dropLocalVer))
                    throw TypeError(".file.OptionsToAdopteRemote.dropLocalVer: object expected");
                message.dropLocalVer = $root.common.BooleanValue.fromObject(object.dropLocalVer, long + 1);
            }
            if (object.remoteVersion != null) {
                if (!$util.isObject(object.remoteVersion))
                    throw TypeError(".file.OptionsToAdopteRemote.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an OptionsToAdopteRemote message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {file.OptionsToAdopteRemote} message OptionsToAdopteRemote
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        OptionsToAdopteRemote.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.dropLocalVer = null;
                object.remoteVersion = null;
            }
            if (message.dropLocalVer != null && Object.hasOwnProperty.call(message, "dropLocalVer"))
                object.dropLocalVer = $root.common.BooleanValue.toObject(message.dropLocalVer, options, q + 1);
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options, q + 1);
            return object;
        };

        /**
         * Converts this OptionsToAdopteRemote to JSON.
         * @function toJSON
         * @memberof file.OptionsToAdopteRemote
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        OptionsToAdopteRemote.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for OptionsToAdopteRemote
         * @function getTypeUrl
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        OptionsToAdopteRemote.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.OptionsToAdopteRemote";
        };

        return OptionsToAdopteRemote;
    })();

    file.DiffCurrentAndRemoteRequestBody = (function() {

        /**
         * Properties of a DiffCurrentAndRemoteRequestBody.
         * @memberof file
         * @interface IDiffCurrentAndRemoteRequestBody
         * @property {file.IOptionsToDiffFileVersions|null} [opts] DiffCurrentAndRemoteRequestBody opts
         */

        /**
         * Constructs a new DiffCurrentAndRemoteRequestBody.
         * @memberof file
         * @classdesc Represents a DiffCurrentAndRemoteRequestBody.
         * @implements IDiffCurrentAndRemoteRequestBody
         * @constructor
         * @param {file.IDiffCurrentAndRemoteRequestBody=} [properties] Properties to set
         */
        function DiffCurrentAndRemoteRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * DiffCurrentAndRemoteRequestBody opts.
         * @member {file.IOptionsToDiffFileVersions|null|undefined} opts
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @instance
         */
        DiffCurrentAndRemoteRequestBody.prototype.opts = null;

        /**
         * Creates a new DiffCurrentAndRemoteRequestBody instance using the specified properties.
         * @function create
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {file.IDiffCurrentAndRemoteRequestBody=} [properties] Properties to set
         * @returns {file.DiffCurrentAndRemoteRequestBody} DiffCurrentAndRemoteRequestBody instance
         */
        DiffCurrentAndRemoteRequestBody.create = function create(properties) {
            return new DiffCurrentAndRemoteRequestBody(properties);
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteRequestBody message. Does not implicitly {@link file.DiffCurrentAndRemoteRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {file.IDiffCurrentAndRemoteRequestBody} message DiffCurrentAndRemoteRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.file.OptionsToDiffFileVersions.encode(message.opts, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteRequestBody message, length delimited. Does not implicitly {@link file.DiffCurrentAndRemoteRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {file.IDiffCurrentAndRemoteRequestBody} message DiffCurrentAndRemoteRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a DiffCurrentAndRemoteRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.DiffCurrentAndRemoteRequestBody} DiffCurrentAndRemoteRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.DiffCurrentAndRemoteRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.opts = $root.file.OptionsToDiffFileVersions.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a DiffCurrentAndRemoteRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.DiffCurrentAndRemoteRequestBody} DiffCurrentAndRemoteRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a DiffCurrentAndRemoteRequestBody message.
         * @function verify
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        DiffCurrentAndRemoteRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts")) {
                var error = $root.file.OptionsToDiffFileVersions.verify(message.opts, long + 1);
                if (error)
                    return "opts." + error;
            }
            return null;
        };

        /**
         * Creates a DiffCurrentAndRemoteRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.DiffCurrentAndRemoteRequestBody} DiffCurrentAndRemoteRequestBody
         */
        DiffCurrentAndRemoteRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.DiffCurrentAndRemoteRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.DiffCurrentAndRemoteRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.DiffCurrentAndRemoteRequestBody();
            if (object.opts != null) {
                if (!$util.isObject(object.opts))
                    throw TypeError(".file.DiffCurrentAndRemoteRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToDiffFileVersions.fromObject(object.opts, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a DiffCurrentAndRemoteRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {file.DiffCurrentAndRemoteRequestBody} message DiffCurrentAndRemoteRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        DiffCurrentAndRemoteRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.opts = null;
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                object.opts = $root.file.OptionsToDiffFileVersions.toObject(message.opts, options, q + 1);
            return object;
        };

        /**
         * Converts this DiffCurrentAndRemoteRequestBody to JSON.
         * @function toJSON
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        DiffCurrentAndRemoteRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for DiffCurrentAndRemoteRequestBody
         * @function getTypeUrl
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        DiffCurrentAndRemoteRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.DiffCurrentAndRemoteRequestBody";
        };

        return DiffCurrentAndRemoteRequestBody;
    })();

    file.DiffCurrentAndRemoteReplyBody = (function() {

        /**
         * Properties of a DiffCurrentAndRemoteReplyBody.
         * @memberof file
         * @interface IDiffCurrentAndRemoteReplyBody
         * @property {file.IFileDiff|null} [diff] DiffCurrentAndRemoteReplyBody diff
         */

        /**
         * Constructs a new DiffCurrentAndRemoteReplyBody.
         * @memberof file
         * @classdesc Represents a DiffCurrentAndRemoteReplyBody.
         * @implements IDiffCurrentAndRemoteReplyBody
         * @constructor
         * @param {file.IDiffCurrentAndRemoteReplyBody=} [properties] Properties to set
         */
        function DiffCurrentAndRemoteReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * DiffCurrentAndRemoteReplyBody diff.
         * @member {file.IFileDiff|null|undefined} diff
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @instance
         */
        DiffCurrentAndRemoteReplyBody.prototype.diff = null;

        /**
         * Creates a new DiffCurrentAndRemoteReplyBody instance using the specified properties.
         * @function create
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {file.IDiffCurrentAndRemoteReplyBody=} [properties] Properties to set
         * @returns {file.DiffCurrentAndRemoteReplyBody} DiffCurrentAndRemoteReplyBody instance
         */
        DiffCurrentAndRemoteReplyBody.create = function create(properties) {
            return new DiffCurrentAndRemoteReplyBody(properties);
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteReplyBody message. Does not implicitly {@link file.DiffCurrentAndRemoteReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {file.IDiffCurrentAndRemoteReplyBody} message DiffCurrentAndRemoteReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.diff != null && Object.hasOwnProperty.call(message, "diff"))
                $root.file.FileDiff.encode(message.diff, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteReplyBody message, length delimited. Does not implicitly {@link file.DiffCurrentAndRemoteReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {file.IDiffCurrentAndRemoteReplyBody} message DiffCurrentAndRemoteReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a DiffCurrentAndRemoteReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.DiffCurrentAndRemoteReplyBody} DiffCurrentAndRemoteReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.DiffCurrentAndRemoteReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.diff = $root.file.FileDiff.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a DiffCurrentAndRemoteReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.DiffCurrentAndRemoteReplyBody} DiffCurrentAndRemoteReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a DiffCurrentAndRemoteReplyBody message.
         * @function verify
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        DiffCurrentAndRemoteReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.diff != null && Object.hasOwnProperty.call(message, "diff")) {
                var error = $root.file.FileDiff.verify(message.diff, long + 1);
                if (error)
                    return "diff." + error;
            }
            return null;
        };

        /**
         * Creates a DiffCurrentAndRemoteReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.DiffCurrentAndRemoteReplyBody} DiffCurrentAndRemoteReplyBody
         */
        DiffCurrentAndRemoteReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.DiffCurrentAndRemoteReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.DiffCurrentAndRemoteReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.DiffCurrentAndRemoteReplyBody();
            if (object.diff != null) {
                if (!$util.isObject(object.diff))
                    throw TypeError(".file.DiffCurrentAndRemoteReplyBody.diff: object expected");
                message.diff = $root.file.FileDiff.fromObject(object.diff, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a DiffCurrentAndRemoteReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {file.DiffCurrentAndRemoteReplyBody} message DiffCurrentAndRemoteReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        DiffCurrentAndRemoteReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.diff = null;
            if (message.diff != null && Object.hasOwnProperty.call(message, "diff"))
                object.diff = $root.file.FileDiff.toObject(message.diff, options, q + 1);
            return object;
        };

        /**
         * Converts this DiffCurrentAndRemoteReplyBody to JSON.
         * @function toJSON
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        DiffCurrentAndRemoteReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for DiffCurrentAndRemoteReplyBody
         * @function getTypeUrl
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        DiffCurrentAndRemoteReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.DiffCurrentAndRemoteReplyBody";
        };

        return DiffCurrentAndRemoteReplyBody;
    })();

    file.OptionsToDiffFileVersions = (function() {

        /**
         * Properties of an OptionsToDiffFileVersions.
         * @memberof file
         * @interface IOptionsToDiffFileVersions
         * @property {common.IUInt64Value|null} [remoteVersion] OptionsToDiffFileVersions remoteVersion
         * @property {common.IBooleanValue|null} [compareContentIfSameMTime] OptionsToDiffFileVersions compareContentIfSameMTime
         */

        /**
         * Constructs a new OptionsToDiffFileVersions.
         * @memberof file
         * @classdesc Represents an OptionsToDiffFileVersions.
         * @implements IOptionsToDiffFileVersions
         * @constructor
         * @param {file.IOptionsToDiffFileVersions=} [properties] Properties to set
         */
        function OptionsToDiffFileVersions(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * OptionsToDiffFileVersions remoteVersion.
         * @member {common.IUInt64Value|null|undefined} remoteVersion
         * @memberof file.OptionsToDiffFileVersions
         * @instance
         */
        OptionsToDiffFileVersions.prototype.remoteVersion = null;

        /**
         * OptionsToDiffFileVersions compareContentIfSameMTime.
         * @member {common.IBooleanValue|null|undefined} compareContentIfSameMTime
         * @memberof file.OptionsToDiffFileVersions
         * @instance
         */
        OptionsToDiffFileVersions.prototype.compareContentIfSameMTime = null;

        /**
         * Creates a new OptionsToDiffFileVersions instance using the specified properties.
         * @function create
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {file.IOptionsToDiffFileVersions=} [properties] Properties to set
         * @returns {file.OptionsToDiffFileVersions} OptionsToDiffFileVersions instance
         */
        OptionsToDiffFileVersions.create = function create(properties) {
            return new OptionsToDiffFileVersions(properties);
        };

        /**
         * Encodes the specified OptionsToDiffFileVersions message. Does not implicitly {@link file.OptionsToDiffFileVersions.verify|verify} messages.
         * @function encode
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {file.IOptionsToDiffFileVersions} message OptionsToDiffFileVersions message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        OptionsToDiffFileVersions.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.compareContentIfSameMTime != null && Object.hasOwnProperty.call(message, "compareContentIfSameMTime"))
                $root.common.BooleanValue.encode(message.compareContentIfSameMTime, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified OptionsToDiffFileVersions message, length delimited. Does not implicitly {@link file.OptionsToDiffFileVersions.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {file.IOptionsToDiffFileVersions} message OptionsToDiffFileVersions message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        OptionsToDiffFileVersions.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an OptionsToDiffFileVersions message from the specified reader or buffer.
         * @function decode
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.OptionsToDiffFileVersions} OptionsToDiffFileVersions
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        OptionsToDiffFileVersions.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.OptionsToDiffFileVersions();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.compareContentIfSameMTime = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an OptionsToDiffFileVersions message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.OptionsToDiffFileVersions} OptionsToDiffFileVersions
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        OptionsToDiffFileVersions.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an OptionsToDiffFileVersions message.
         * @function verify
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        OptionsToDiffFileVersions.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion, long + 1);
                if (error)
                    return "remoteVersion." + error;
            }
            if (message.compareContentIfSameMTime != null && Object.hasOwnProperty.call(message, "compareContentIfSameMTime")) {
                var error = $root.common.BooleanValue.verify(message.compareContentIfSameMTime, long + 1);
                if (error)
                    return "compareContentIfSameMTime." + error;
            }
            return null;
        };

        /**
         * Creates an OptionsToDiffFileVersions message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.OptionsToDiffFileVersions} OptionsToDiffFileVersions
         */
        OptionsToDiffFileVersions.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.OptionsToDiffFileVersions)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.OptionsToDiffFileVersions: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.OptionsToDiffFileVersions();
            if (object.remoteVersion != null) {
                if (!$util.isObject(object.remoteVersion))
                    throw TypeError(".file.OptionsToDiffFileVersions.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion, long + 1);
            }
            if (object.compareContentIfSameMTime != null) {
                if (!$util.isObject(object.compareContentIfSameMTime))
                    throw TypeError(".file.OptionsToDiffFileVersions.compareContentIfSameMTime: object expected");
                message.compareContentIfSameMTime = $root.common.BooleanValue.fromObject(object.compareContentIfSameMTime, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an OptionsToDiffFileVersions message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {file.OptionsToDiffFileVersions} message OptionsToDiffFileVersions
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        OptionsToDiffFileVersions.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.remoteVersion = null;
                object.compareContentIfSameMTime = null;
            }
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options, q + 1);
            if (message.compareContentIfSameMTime != null && Object.hasOwnProperty.call(message, "compareContentIfSameMTime"))
                object.compareContentIfSameMTime = $root.common.BooleanValue.toObject(message.compareContentIfSameMTime, options, q + 1);
            return object;
        };

        /**
         * Converts this OptionsToDiffFileVersions to JSON.
         * @function toJSON
         * @memberof file.OptionsToDiffFileVersions
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        OptionsToDiffFileVersions.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for OptionsToDiffFileVersions
         * @function getTypeUrl
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        OptionsToDiffFileVersions.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.OptionsToDiffFileVersions";
        };

        return OptionsToDiffFileVersions;
    })();

    file.TimeStampsDiff = (function() {

        /**
         * Properties of a TimeStampsDiff.
         * @memberof file
         * @interface ITimeStampsDiff
         * @property {number|Long|null} [current] TimeStampsDiff current
         * @property {number|Long|null} [remote] TimeStampsDiff remote
         * @property {number|Long|null} [synced] TimeStampsDiff synced
         */

        /**
         * Constructs a new TimeStampsDiff.
         * @memberof file
         * @classdesc Represents a TimeStampsDiff.
         * @implements ITimeStampsDiff
         * @constructor
         * @param {file.ITimeStampsDiff=} [properties] Properties to set
         */
        function TimeStampsDiff(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * TimeStampsDiff current.
         * @member {number|Long} current
         * @memberof file.TimeStampsDiff
         * @instance
         */
        TimeStampsDiff.prototype.current = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * TimeStampsDiff remote.
         * @member {number|Long} remote
         * @memberof file.TimeStampsDiff
         * @instance
         */
        TimeStampsDiff.prototype.remote = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * TimeStampsDiff synced.
         * @member {number|Long} synced
         * @memberof file.TimeStampsDiff
         * @instance
         */
        TimeStampsDiff.prototype.synced = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new TimeStampsDiff instance using the specified properties.
         * @function create
         * @memberof file.TimeStampsDiff
         * @static
         * @param {file.ITimeStampsDiff=} [properties] Properties to set
         * @returns {file.TimeStampsDiff} TimeStampsDiff instance
         */
        TimeStampsDiff.create = function create(properties) {
            return new TimeStampsDiff(properties);
        };

        /**
         * Encodes the specified TimeStampsDiff message. Does not implicitly {@link file.TimeStampsDiff.verify|verify} messages.
         * @function encode
         * @memberof file.TimeStampsDiff
         * @static
         * @param {file.ITimeStampsDiff} message TimeStampsDiff message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        TimeStampsDiff.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.current);
            if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.remote);
            if (message.synced != null && Object.hasOwnProperty.call(message, "synced"))
                writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.synced);
            return writer;
        };

        /**
         * Encodes the specified TimeStampsDiff message, length delimited. Does not implicitly {@link file.TimeStampsDiff.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.TimeStampsDiff
         * @static
         * @param {file.ITimeStampsDiff} message TimeStampsDiff message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        TimeStampsDiff.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a TimeStampsDiff message from the specified reader or buffer.
         * @function decode
         * @memberof file.TimeStampsDiff
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.TimeStampsDiff} TimeStampsDiff
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        TimeStampsDiff.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.TimeStampsDiff();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.current = reader.uint64();
                        break;
                    }
                case 2: {
                        message.remote = reader.uint64();
                        break;
                    }
                case 3: {
                        message.synced = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a TimeStampsDiff message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.TimeStampsDiff
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.TimeStampsDiff} TimeStampsDiff
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        TimeStampsDiff.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a TimeStampsDiff message.
         * @function verify
         * @memberof file.TimeStampsDiff
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        TimeStampsDiff.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                if (!$util.isInteger(message.current) && !(message.current && $util.isInteger(message.current.low) && $util.isInteger(message.current.high)))
                    return "current: integer|Long expected";
            if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                if (!$util.isInteger(message.remote) && !(message.remote && $util.isInteger(message.remote.low) && $util.isInteger(message.remote.high)))
                    return "remote: integer|Long expected";
            if (message.synced != null && Object.hasOwnProperty.call(message, "synced"))
                if (!$util.isInteger(message.synced) && !(message.synced && $util.isInteger(message.synced.low) && $util.isInteger(message.synced.high)))
                    return "synced: integer|Long expected";
            return null;
        };

        /**
         * Creates a TimeStampsDiff message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.TimeStampsDiff
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.TimeStampsDiff} TimeStampsDiff
         */
        TimeStampsDiff.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.TimeStampsDiff)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.TimeStampsDiff: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.TimeStampsDiff();
            if (object.current != null)
                if ($util.Long)
                    message.current = $util.Long.fromValue(object.current, true);
                else if (typeof object.current === "string")
                    message.current = parseInt(object.current, 10);
                else if (typeof object.current === "number")
                    message.current = object.current;
                else if (typeof object.current === "object")
                    message.current = new $util.LongBits(object.current.low >>> 0, object.current.high >>> 0).toNumber(true);
            if (object.remote != null)
                if ($util.Long)
                    message.remote = $util.Long.fromValue(object.remote, true);
                else if (typeof object.remote === "string")
                    message.remote = parseInt(object.remote, 10);
                else if (typeof object.remote === "number")
                    message.remote = object.remote;
                else if (typeof object.remote === "object")
                    message.remote = new $util.LongBits(object.remote.low >>> 0, object.remote.high >>> 0).toNumber(true);
            if (object.synced != null)
                if ($util.Long)
                    message.synced = $util.Long.fromValue(object.synced, true);
                else if (typeof object.synced === "string")
                    message.synced = parseInt(object.synced, 10);
                else if (typeof object.synced === "number")
                    message.synced = object.synced;
                else if (typeof object.synced === "object")
                    message.synced = new $util.LongBits(object.synced.low >>> 0, object.synced.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from a TimeStampsDiff message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.TimeStampsDiff
         * @static
         * @param {file.TimeStampsDiff} message TimeStampsDiff
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        TimeStampsDiff.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.current = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.current = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.remote = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.remote = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.synced = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.synced = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            }
            if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.current = typeof message.current === "number" ? BigInt(message.current) : $util.Long.fromBits(message.current.low >>> 0, message.current.high >>> 0, true).toBigInt();
                else if (typeof message.current === "number")
                    object.current = options.longs === String ? String(message.current) : message.current;
                else
                    object.current = options.longs === String ? $util.Long.prototype.toString.call(message.current) : options.longs === Number ? new $util.LongBits(message.current.low >>> 0, message.current.high >>> 0).toNumber(true) : message.current;
            if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.remote = typeof message.remote === "number" ? BigInt(message.remote) : $util.Long.fromBits(message.remote.low >>> 0, message.remote.high >>> 0, true).toBigInt();
                else if (typeof message.remote === "number")
                    object.remote = options.longs === String ? String(message.remote) : message.remote;
                else
                    object.remote = options.longs === String ? $util.Long.prototype.toString.call(message.remote) : options.longs === Number ? new $util.LongBits(message.remote.low >>> 0, message.remote.high >>> 0).toNumber(true) : message.remote;
            if (message.synced != null && Object.hasOwnProperty.call(message, "synced"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.synced = typeof message.synced === "number" ? BigInt(message.synced) : $util.Long.fromBits(message.synced.low >>> 0, message.synced.high >>> 0, true).toBigInt();
                else if (typeof message.synced === "number")
                    object.synced = options.longs === String ? String(message.synced) : message.synced;
                else
                    object.synced = options.longs === String ? $util.Long.prototype.toString.call(message.synced) : options.longs === Number ? new $util.LongBits(message.synced.low >>> 0, message.synced.high >>> 0).toNumber(true) : message.synced;
            return object;
        };

        /**
         * Converts this TimeStampsDiff to JSON.
         * @function toJSON
         * @memberof file.TimeStampsDiff
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        TimeStampsDiff.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for TimeStampsDiff
         * @function getTypeUrl
         * @memberof file.TimeStampsDiff
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        TimeStampsDiff.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.TimeStampsDiff";
        };

        return TimeStampsDiff;
    })();

    file.XAttrDiff = (function() {

        /**
         * Properties of a XAttrDiff.
         * @memberof file
         * @interface IXAttrDiff
         * @property {string|null} [name] XAttrDiff name
         * @property {common.IStringValue|null} [addedIn] XAttrDiff addedIn
         * @property {common.IStringValue|null} [removedIn] XAttrDiff removedIn
         * @property {common.IStringValue|null} [changedIn] XAttrDiff changedIn
         */

        /**
         * Constructs a new XAttrDiff.
         * @memberof file
         * @classdesc Represents a XAttrDiff.
         * @implements IXAttrDiff
         * @constructor
         * @param {file.IXAttrDiff=} [properties] Properties to set
         */
        function XAttrDiff(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * XAttrDiff name.
         * @member {string} name
         * @memberof file.XAttrDiff
         * @instance
         */
        XAttrDiff.prototype.name = "";

        /**
         * XAttrDiff addedIn.
         * @member {common.IStringValue|null|undefined} addedIn
         * @memberof file.XAttrDiff
         * @instance
         */
        XAttrDiff.prototype.addedIn = null;

        /**
         * XAttrDiff removedIn.
         * @member {common.IStringValue|null|undefined} removedIn
         * @memberof file.XAttrDiff
         * @instance
         */
        XAttrDiff.prototype.removedIn = null;

        /**
         * XAttrDiff changedIn.
         * @member {common.IStringValue|null|undefined} changedIn
         * @memberof file.XAttrDiff
         * @instance
         */
        XAttrDiff.prototype.changedIn = null;

        /**
         * Creates a new XAttrDiff instance using the specified properties.
         * @function create
         * @memberof file.XAttrDiff
         * @static
         * @param {file.IXAttrDiff=} [properties] Properties to set
         * @returns {file.XAttrDiff} XAttrDiff instance
         */
        XAttrDiff.create = function create(properties) {
            return new XAttrDiff(properties);
        };

        /**
         * Encodes the specified XAttrDiff message. Does not implicitly {@link file.XAttrDiff.verify|verify} messages.
         * @function encode
         * @memberof file.XAttrDiff
         * @static
         * @param {file.IXAttrDiff} message XAttrDiff message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        XAttrDiff.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
            if (message.addedIn != null && Object.hasOwnProperty.call(message, "addedIn"))
                $root.common.StringValue.encode(message.addedIn, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.removedIn != null && Object.hasOwnProperty.call(message, "removedIn"))
                $root.common.StringValue.encode(message.removedIn, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.changedIn != null && Object.hasOwnProperty.call(message, "changedIn"))
                $root.common.StringValue.encode(message.changedIn, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified XAttrDiff message, length delimited. Does not implicitly {@link file.XAttrDiff.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.XAttrDiff
         * @static
         * @param {file.IXAttrDiff} message XAttrDiff message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        XAttrDiff.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a XAttrDiff message from the specified reader or buffer.
         * @function decode
         * @memberof file.XAttrDiff
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.XAttrDiff} XAttrDiff
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        XAttrDiff.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.XAttrDiff();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.name = reader.string();
                        break;
                    }
                case 2: {
                        message.addedIn = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.removedIn = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.changedIn = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a XAttrDiff message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.XAttrDiff
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.XAttrDiff} XAttrDiff
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        XAttrDiff.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a XAttrDiff message.
         * @function verify
         * @memberof file.XAttrDiff
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        XAttrDiff.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.addedIn != null && Object.hasOwnProperty.call(message, "addedIn")) {
                var error = $root.common.StringValue.verify(message.addedIn, long + 1);
                if (error)
                    return "addedIn." + error;
            }
            if (message.removedIn != null && Object.hasOwnProperty.call(message, "removedIn")) {
                var error = $root.common.StringValue.verify(message.removedIn, long + 1);
                if (error)
                    return "removedIn." + error;
            }
            if (message.changedIn != null && Object.hasOwnProperty.call(message, "changedIn")) {
                var error = $root.common.StringValue.verify(message.changedIn, long + 1);
                if (error)
                    return "changedIn." + error;
            }
            return null;
        };

        /**
         * Creates a XAttrDiff message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.XAttrDiff
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.XAttrDiff} XAttrDiff
         */
        XAttrDiff.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.XAttrDiff)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.XAttrDiff: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.XAttrDiff();
            if (object.name != null)
                message.name = String(object.name);
            if (object.addedIn != null) {
                if (!$util.isObject(object.addedIn))
                    throw TypeError(".file.XAttrDiff.addedIn: object expected");
                message.addedIn = $root.common.StringValue.fromObject(object.addedIn, long + 1);
            }
            if (object.removedIn != null) {
                if (!$util.isObject(object.removedIn))
                    throw TypeError(".file.XAttrDiff.removedIn: object expected");
                message.removedIn = $root.common.StringValue.fromObject(object.removedIn, long + 1);
            }
            if (object.changedIn != null) {
                if (!$util.isObject(object.changedIn))
                    throw TypeError(".file.XAttrDiff.changedIn: object expected");
                message.changedIn = $root.common.StringValue.fromObject(object.changedIn, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a XAttrDiff message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.XAttrDiff
         * @static
         * @param {file.XAttrDiff} message XAttrDiff
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        XAttrDiff.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.name = "";
                object.addedIn = null;
                object.removedIn = null;
                object.changedIn = null;
            }
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                object.name = message.name;
            if (message.addedIn != null && Object.hasOwnProperty.call(message, "addedIn"))
                object.addedIn = $root.common.StringValue.toObject(message.addedIn, options, q + 1);
            if (message.removedIn != null && Object.hasOwnProperty.call(message, "removedIn"))
                object.removedIn = $root.common.StringValue.toObject(message.removedIn, options, q + 1);
            if (message.changedIn != null && Object.hasOwnProperty.call(message, "changedIn"))
                object.changedIn = $root.common.StringValue.toObject(message.changedIn, options, q + 1);
            return object;
        };

        /**
         * Converts this XAttrDiff to JSON.
         * @function toJSON
         * @memberof file.XAttrDiff
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        XAttrDiff.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for XAttrDiff
         * @function getTypeUrl
         * @memberof file.XAttrDiff
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        XAttrDiff.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.XAttrDiff";
        };

        return XAttrDiff;
    })();

    file.FileDiff = (function() {

        /**
         * Properties of a FileDiff.
         * @memberof file
         * @interface IFileDiff
         * @property {number|Long|null} [currentVersion] FileDiff currentVersion
         * @property {boolean|null} [isCurrentLocal] FileDiff isCurrentLocal
         * @property {common.IUInt64Value|null} [remoteVersion] FileDiff remoteVersion
         * @property {common.IUInt64Value|null} [syncedVersion] FileDiff syncedVersion
         * @property {boolean|null} [isRemoteRemoved] FileDiff isRemoteRemoved
         * @property {file.ITimeStampsDiff|null} [ctime] FileDiff ctime
         * @property {file.ITimeStampsDiff|null} [mtime] FileDiff mtime
         * @property {Array.<file.IXAttrDiff>|null} [xattrs] FileDiff xattrs
         * @property {boolean|null} [areContentsSame] FileDiff areContentsSame
         * @property {file.FileDiff.ISize|null} [size] FileDiff size
         */

        /**
         * Constructs a new FileDiff.
         * @memberof file
         * @classdesc Represents a FileDiff.
         * @implements IFileDiff
         * @constructor
         * @param {file.IFileDiff=} [properties] Properties to set
         */
        function FileDiff(properties) {
            this.xattrs = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileDiff currentVersion.
         * @member {number|Long} currentVersion
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.currentVersion = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * FileDiff isCurrentLocal.
         * @member {boolean} isCurrentLocal
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.isCurrentLocal = false;

        /**
         * FileDiff remoteVersion.
         * @member {common.IUInt64Value|null|undefined} remoteVersion
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.remoteVersion = null;

        /**
         * FileDiff syncedVersion.
         * @member {common.IUInt64Value|null|undefined} syncedVersion
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.syncedVersion = null;

        /**
         * FileDiff isRemoteRemoved.
         * @member {boolean} isRemoteRemoved
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.isRemoteRemoved = false;

        /**
         * FileDiff ctime.
         * @member {file.ITimeStampsDiff|null|undefined} ctime
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.ctime = null;

        /**
         * FileDiff mtime.
         * @member {file.ITimeStampsDiff|null|undefined} mtime
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.mtime = null;

        /**
         * FileDiff xattrs.
         * @member {Array.<file.IXAttrDiff>} xattrs
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.xattrs = $util.emptyArray;

        /**
         * FileDiff areContentsSame.
         * @member {boolean} areContentsSame
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.areContentsSame = false;

        /**
         * FileDiff size.
         * @member {file.FileDiff.ISize|null|undefined} size
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.size = null;

        /**
         * Creates a new FileDiff instance using the specified properties.
         * @function create
         * @memberof file.FileDiff
         * @static
         * @param {file.IFileDiff=} [properties] Properties to set
         * @returns {file.FileDiff} FileDiff instance
         */
        FileDiff.create = function create(properties) {
            return new FileDiff(properties);
        };

        /**
         * Encodes the specified FileDiff message. Does not implicitly {@link file.FileDiff.verify|verify} messages.
         * @function encode
         * @memberof file.FileDiff
         * @static
         * @param {file.IFileDiff} message FileDiff message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileDiff.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.currentVersion);
            if (message.isCurrentLocal != null && Object.hasOwnProperty.call(message, "isCurrentLocal"))
                writer.uint32(/* id 2, wireType 0 =*/16).bool(message.isCurrentLocal);
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.syncedVersion != null && Object.hasOwnProperty.call(message, "syncedVersion"))
                $root.common.UInt64Value.encode(message.syncedVersion, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            if (message.isRemoteRemoved != null && Object.hasOwnProperty.call(message, "isRemoteRemoved"))
                writer.uint32(/* id 5, wireType 0 =*/40).bool(message.isRemoteRemoved);
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime"))
                $root.file.TimeStampsDiff.encode(message.ctime, writer.uint32(/* id 6, wireType 2 =*/50).fork(), q + 1).ldelim();
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime"))
                $root.file.TimeStampsDiff.encode(message.mtime, writer.uint32(/* id 7, wireType 2 =*/58).fork(), q + 1).ldelim();
            if (message.xattrs != null && message.xattrs.length)
                for (var i = 0; i < message.xattrs.length; ++i)
                    $root.file.XAttrDiff.encode(message.xattrs[i], writer.uint32(/* id 8, wireType 2 =*/66).fork(), q + 1).ldelim();
            if (message.areContentsSame != null && Object.hasOwnProperty.call(message, "areContentsSame"))
                writer.uint32(/* id 11, wireType 0 =*/88).bool(message.areContentsSame);
            if (message.size != null && Object.hasOwnProperty.call(message, "size"))
                $root.file.FileDiff.Size.encode(message.size, writer.uint32(/* id 12, wireType 2 =*/98).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FileDiff message, length delimited. Does not implicitly {@link file.FileDiff.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.FileDiff
         * @static
         * @param {file.IFileDiff} message FileDiff message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileDiff.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileDiff message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileDiff
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileDiff} FileDiff
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileDiff.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileDiff();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.currentVersion = reader.uint64();
                        break;
                    }
                case 2: {
                        message.isCurrentLocal = reader.bool();
                        break;
                    }
                case 3: {
                        message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.syncedVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 5: {
                        message.isRemoteRemoved = reader.bool();
                        break;
                    }
                case 6: {
                        message.ctime = $root.file.TimeStampsDiff.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 7: {
                        message.mtime = $root.file.TimeStampsDiff.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 8: {
                        if (!(message.xattrs && message.xattrs.length))
                            message.xattrs = [];
                        message.xattrs.push($root.file.XAttrDiff.decode(reader, reader.uint32(), undefined, long + 1));
                        break;
                    }
                case 11: {
                        message.areContentsSame = reader.bool();
                        break;
                    }
                case 12: {
                        message.size = $root.file.FileDiff.Size.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileDiff message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.FileDiff
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.FileDiff} FileDiff
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileDiff.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileDiff message.
         * @function verify
         * @memberof file.FileDiff
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileDiff.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                if (!$util.isInteger(message.currentVersion) && !(message.currentVersion && $util.isInteger(message.currentVersion.low) && $util.isInteger(message.currentVersion.high)))
                    return "currentVersion: integer|Long expected";
            if (message.isCurrentLocal != null && Object.hasOwnProperty.call(message, "isCurrentLocal"))
                if (typeof message.isCurrentLocal !== "boolean")
                    return "isCurrentLocal: boolean expected";
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion, long + 1);
                if (error)
                    return "remoteVersion." + error;
            }
            if (message.syncedVersion != null && Object.hasOwnProperty.call(message, "syncedVersion")) {
                var error = $root.common.UInt64Value.verify(message.syncedVersion, long + 1);
                if (error)
                    return "syncedVersion." + error;
            }
            if (message.isRemoteRemoved != null && Object.hasOwnProperty.call(message, "isRemoteRemoved"))
                if (typeof message.isRemoteRemoved !== "boolean")
                    return "isRemoteRemoved: boolean expected";
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime")) {
                var error = $root.file.TimeStampsDiff.verify(message.ctime, long + 1);
                if (error)
                    return "ctime." + error;
            }
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime")) {
                var error = $root.file.TimeStampsDiff.verify(message.mtime, long + 1);
                if (error)
                    return "mtime." + error;
            }
            if (message.xattrs != null && Object.hasOwnProperty.call(message, "xattrs")) {
                if (!Array.isArray(message.xattrs))
                    return "xattrs: array expected";
                for (var i = 0; i < message.xattrs.length; ++i) {
                    var error = $root.file.XAttrDiff.verify(message.xattrs[i], long + 1);
                    if (error)
                        return "xattrs." + error;
                }
            }
            if (message.areContentsSame != null && Object.hasOwnProperty.call(message, "areContentsSame"))
                if (typeof message.areContentsSame !== "boolean")
                    return "areContentsSame: boolean expected";
            if (message.size != null && Object.hasOwnProperty.call(message, "size")) {
                var error = $root.file.FileDiff.Size.verify(message.size, long + 1);
                if (error)
                    return "size." + error;
            }
            return null;
        };

        /**
         * Creates a FileDiff message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileDiff
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileDiff} FileDiff
         */
        FileDiff.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.FileDiff)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.FileDiff: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.FileDiff();
            if (object.currentVersion != null)
                if ($util.Long)
                    message.currentVersion = $util.Long.fromValue(object.currentVersion, true);
                else if (typeof object.currentVersion === "string")
                    message.currentVersion = parseInt(object.currentVersion, 10);
                else if (typeof object.currentVersion === "number")
                    message.currentVersion = object.currentVersion;
                else if (typeof object.currentVersion === "object")
                    message.currentVersion = new $util.LongBits(object.currentVersion.low >>> 0, object.currentVersion.high >>> 0).toNumber(true);
            if (object.isCurrentLocal != null)
                message.isCurrentLocal = Boolean(object.isCurrentLocal);
            if (object.remoteVersion != null) {
                if (!$util.isObject(object.remoteVersion))
                    throw TypeError(".file.FileDiff.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion, long + 1);
            }
            if (object.syncedVersion != null) {
                if (!$util.isObject(object.syncedVersion))
                    throw TypeError(".file.FileDiff.syncedVersion: object expected");
                message.syncedVersion = $root.common.UInt64Value.fromObject(object.syncedVersion, long + 1);
            }
            if (object.isRemoteRemoved != null)
                message.isRemoteRemoved = Boolean(object.isRemoteRemoved);
            if (object.ctime != null) {
                if (!$util.isObject(object.ctime))
                    throw TypeError(".file.FileDiff.ctime: object expected");
                message.ctime = $root.file.TimeStampsDiff.fromObject(object.ctime, long + 1);
            }
            if (object.mtime != null) {
                if (!$util.isObject(object.mtime))
                    throw TypeError(".file.FileDiff.mtime: object expected");
                message.mtime = $root.file.TimeStampsDiff.fromObject(object.mtime, long + 1);
            }
            if (object.xattrs) {
                if (!Array.isArray(object.xattrs))
                    throw TypeError(".file.FileDiff.xattrs: array expected");
                message.xattrs = [];
                for (var i = 0; i < object.xattrs.length; ++i) {
                    if (!$util.isObject(object.xattrs[i]))
                        throw TypeError(".file.FileDiff.xattrs: object expected");
                    message.xattrs[i] = $root.file.XAttrDiff.fromObject(object.xattrs[i], long + 1);
                }
            }
            if (object.areContentsSame != null)
                message.areContentsSame = Boolean(object.areContentsSame);
            if (object.size != null) {
                if (!$util.isObject(object.size))
                    throw TypeError(".file.FileDiff.size: object expected");
                message.size = $root.file.FileDiff.Size.fromObject(object.size, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a FileDiff message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileDiff
         * @static
         * @param {file.FileDiff} message FileDiff
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileDiff.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.xattrs = [];
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.currentVersion = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.currentVersion = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.isCurrentLocal = false;
                object.remoteVersion = null;
                object.syncedVersion = null;
                object.isRemoteRemoved = false;
                object.ctime = null;
                object.mtime = null;
                object.areContentsSame = false;
                object.size = null;
            }
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.currentVersion = typeof message.currentVersion === "number" ? BigInt(message.currentVersion) : $util.Long.fromBits(message.currentVersion.low >>> 0, message.currentVersion.high >>> 0, true).toBigInt();
                else if (typeof message.currentVersion === "number")
                    object.currentVersion = options.longs === String ? String(message.currentVersion) : message.currentVersion;
                else
                    object.currentVersion = options.longs === String ? $util.Long.prototype.toString.call(message.currentVersion) : options.longs === Number ? new $util.LongBits(message.currentVersion.low >>> 0, message.currentVersion.high >>> 0).toNumber(true) : message.currentVersion;
            if (message.isCurrentLocal != null && Object.hasOwnProperty.call(message, "isCurrentLocal"))
                object.isCurrentLocal = message.isCurrentLocal;
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options, q + 1);
            if (message.syncedVersion != null && Object.hasOwnProperty.call(message, "syncedVersion"))
                object.syncedVersion = $root.common.UInt64Value.toObject(message.syncedVersion, options, q + 1);
            if (message.isRemoteRemoved != null && Object.hasOwnProperty.call(message, "isRemoteRemoved"))
                object.isRemoteRemoved = message.isRemoteRemoved;
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime"))
                object.ctime = $root.file.TimeStampsDiff.toObject(message.ctime, options, q + 1);
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime"))
                object.mtime = $root.file.TimeStampsDiff.toObject(message.mtime, options, q + 1);
            if (message.xattrs && message.xattrs.length) {
                object.xattrs = [];
                for (var j = 0; j < message.xattrs.length; ++j)
                    object.xattrs[j] = $root.file.XAttrDiff.toObject(message.xattrs[j], options, q + 1);
            }
            if (message.areContentsSame != null && Object.hasOwnProperty.call(message, "areContentsSame"))
                object.areContentsSame = message.areContentsSame;
            if (message.size != null && Object.hasOwnProperty.call(message, "size"))
                object.size = $root.file.FileDiff.Size.toObject(message.size, options, q + 1);
            return object;
        };

        /**
         * Converts this FileDiff to JSON.
         * @function toJSON
         * @memberof file.FileDiff
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileDiff.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileDiff
         * @function getTypeUrl
         * @memberof file.FileDiff
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileDiff.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.FileDiff";
        };

        FileDiff.Size = (function() {

            /**
             * Properties of a Size.
             * @memberof file.FileDiff
             * @interface ISize
             * @property {number|Long|null} [current] Size current
             * @property {number|Long|null} [remote] Size remote
             */

            /**
             * Constructs a new Size.
             * @memberof file.FileDiff
             * @classdesc Represents a Size.
             * @implements ISize
             * @constructor
             * @param {file.FileDiff.ISize=} [properties] Properties to set
             */
            function Size(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * Size current.
             * @member {number|Long} current
             * @memberof file.FileDiff.Size
             * @instance
             */
            Size.prototype.current = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

            /**
             * Size remote.
             * @member {number|Long} remote
             * @memberof file.FileDiff.Size
             * @instance
             */
            Size.prototype.remote = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

            /**
             * Creates a new Size instance using the specified properties.
             * @function create
             * @memberof file.FileDiff.Size
             * @static
             * @param {file.FileDiff.ISize=} [properties] Properties to set
             * @returns {file.FileDiff.Size} Size instance
             */
            Size.create = function create(properties) {
                return new Size(properties);
            };

            /**
             * Encodes the specified Size message. Does not implicitly {@link file.FileDiff.Size.verify|verify} messages.
             * @function encode
             * @memberof file.FileDiff.Size
             * @static
             * @param {file.FileDiff.ISize} message Size message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Size.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                    writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.current);
                if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                    writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.remote);
                return writer;
            };

            /**
             * Encodes the specified Size message, length delimited. Does not implicitly {@link file.FileDiff.Size.verify|verify} messages.
             * @function encodeDelimited
             * @memberof file.FileDiff.Size
             * @static
             * @param {file.FileDiff.ISize} message Size message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Size.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes a Size message from the specified reader or buffer.
             * @function decode
             * @memberof file.FileDiff.Size
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {file.FileDiff.Size} Size
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Size.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileDiff.Size();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.current = reader.uint64();
                            break;
                        }
                    case 2: {
                            message.remote = reader.uint64();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a Size message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof file.FileDiff.Size
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {file.FileDiff.Size} Size
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Size.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a Size message.
             * @function verify
             * @memberof file.FileDiff.Size
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            Size.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                    if (!$util.isInteger(message.current) && !(message.current && $util.isInteger(message.current.low) && $util.isInteger(message.current.high)))
                        return "current: integer|Long expected";
                if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                    if (!$util.isInteger(message.remote) && !(message.remote && $util.isInteger(message.remote.low) && $util.isInteger(message.remote.high)))
                        return "remote: integer|Long expected";
                return null;
            };

            /**
             * Creates a Size message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof file.FileDiff.Size
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {file.FileDiff.Size} Size
             */
            Size.fromObject = function fromObject(object, long) {
                if (object instanceof $root.file.FileDiff.Size)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".file.FileDiff.Size: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.file.FileDiff.Size();
                if (object.current != null)
                    if ($util.Long)
                        message.current = $util.Long.fromValue(object.current, true);
                    else if (typeof object.current === "string")
                        message.current = parseInt(object.current, 10);
                    else if (typeof object.current === "number")
                        message.current = object.current;
                    else if (typeof object.current === "object")
                        message.current = new $util.LongBits(object.current.low >>> 0, object.current.high >>> 0).toNumber(true);
                if (object.remote != null)
                    if ($util.Long)
                        message.remote = $util.Long.fromValue(object.remote, true);
                    else if (typeof object.remote === "string")
                        message.remote = parseInt(object.remote, 10);
                    else if (typeof object.remote === "number")
                        message.remote = object.remote;
                    else if (typeof object.remote === "object")
                        message.remote = new $util.LongBits(object.remote.low >>> 0, object.remote.high >>> 0).toNumber(true);
                return message;
            };

            /**
             * Creates a plain object from a Size message. Also converts values to other types if specified.
             * @function toObject
             * @memberof file.FileDiff.Size
             * @static
             * @param {file.FileDiff.Size} message Size
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            Size.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults) {
                    if ($util.Long) {
                        var long = new $util.Long(0, 0, true);
                        object.current = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                    } else
                        object.current = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                    if ($util.Long) {
                        var long = new $util.Long(0, 0, true);
                        object.remote = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                    } else
                        object.remote = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                }
                if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                    if (typeof BigInt !== "undefined" && options.longs === BigInt)
                        object.current = typeof message.current === "number" ? BigInt(message.current) : $util.Long.fromBits(message.current.low >>> 0, message.current.high >>> 0, true).toBigInt();
                    else if (typeof message.current === "number")
                        object.current = options.longs === String ? String(message.current) : message.current;
                    else
                        object.current = options.longs === String ? $util.Long.prototype.toString.call(message.current) : options.longs === Number ? new $util.LongBits(message.current.low >>> 0, message.current.high >>> 0).toNumber(true) : message.current;
                if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                    if (typeof BigInt !== "undefined" && options.longs === BigInt)
                        object.remote = typeof message.remote === "number" ? BigInt(message.remote) : $util.Long.fromBits(message.remote.low >>> 0, message.remote.high >>> 0, true).toBigInt();
                    else if (typeof message.remote === "number")
                        object.remote = options.longs === String ? String(message.remote) : message.remote;
                    else
                        object.remote = options.longs === String ? $util.Long.prototype.toString.call(message.remote) : options.longs === Number ? new $util.LongBits(message.remote.low >>> 0, message.remote.high >>> 0).toNumber(true) : message.remote;
                return object;
            };

            /**
             * Converts this Size to JSON.
             * @function toJSON
             * @memberof file.FileDiff.Size
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            Size.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for Size
             * @function getTypeUrl
             * @memberof file.FileDiff.Size
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            Size.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/file.FileDiff.Size";
            };

            return Size;
        })();

        return FileDiff;
    })();

    file.FileSyncUploadRequestBody = (function() {

        /**
         * Properties of a FileSyncUploadRequestBody.
         * @memberof file
         * @interface IFileSyncUploadRequestBody
         * @property {file.IOptionsToUploadLocal|null} [opts] FileSyncUploadRequestBody opts
         */

        /**
         * Constructs a new FileSyncUploadRequestBody.
         * @memberof file
         * @classdesc Represents a FileSyncUploadRequestBody.
         * @implements IFileSyncUploadRequestBody
         * @constructor
         * @param {file.IFileSyncUploadRequestBody=} [properties] Properties to set
         */
        function FileSyncUploadRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileSyncUploadRequestBody opts.
         * @member {file.IOptionsToUploadLocal|null|undefined} opts
         * @memberof file.FileSyncUploadRequestBody
         * @instance
         */
        FileSyncUploadRequestBody.prototype.opts = null;

        /**
         * Creates a new FileSyncUploadRequestBody instance using the specified properties.
         * @function create
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {file.IFileSyncUploadRequestBody=} [properties] Properties to set
         * @returns {file.FileSyncUploadRequestBody} FileSyncUploadRequestBody instance
         */
        FileSyncUploadRequestBody.create = function create(properties) {
            return new FileSyncUploadRequestBody(properties);
        };

        /**
         * Encodes the specified FileSyncUploadRequestBody message. Does not implicitly {@link file.FileSyncUploadRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {file.IFileSyncUploadRequestBody} message FileSyncUploadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncUploadRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.file.OptionsToUploadLocal.encode(message.opts, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FileSyncUploadRequestBody message, length delimited. Does not implicitly {@link file.FileSyncUploadRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {file.IFileSyncUploadRequestBody} message FileSyncUploadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncUploadRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileSyncUploadRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileSyncUploadRequestBody} FileSyncUploadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncUploadRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncUploadRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.opts = $root.file.OptionsToUploadLocal.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileSyncUploadRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.FileSyncUploadRequestBody} FileSyncUploadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncUploadRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileSyncUploadRequestBody message.
         * @function verify
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileSyncUploadRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts")) {
                var error = $root.file.OptionsToUploadLocal.verify(message.opts, long + 1);
                if (error)
                    return "opts." + error;
            }
            return null;
        };

        /**
         * Creates a FileSyncUploadRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileSyncUploadRequestBody} FileSyncUploadRequestBody
         */
        FileSyncUploadRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.FileSyncUploadRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.FileSyncUploadRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.FileSyncUploadRequestBody();
            if (object.opts != null) {
                if (!$util.isObject(object.opts))
                    throw TypeError(".file.FileSyncUploadRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToUploadLocal.fromObject(object.opts, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a FileSyncUploadRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {file.FileSyncUploadRequestBody} message FileSyncUploadRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileSyncUploadRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.opts = null;
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                object.opts = $root.file.OptionsToUploadLocal.toObject(message.opts, options, q + 1);
            return object;
        };

        /**
         * Converts this FileSyncUploadRequestBody to JSON.
         * @function toJSON
         * @memberof file.FileSyncUploadRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileSyncUploadRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileSyncUploadRequestBody
         * @function getTypeUrl
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileSyncUploadRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.FileSyncUploadRequestBody";
        };

        return FileSyncUploadRequestBody;
    })();

    file.FileSyncUploadReplyBody = (function() {

        /**
         * Properties of a FileSyncUploadReplyBody.
         * @memberof file
         * @interface IFileSyncUploadReplyBody
         * @property {common.IUInt64Value|null} [uploadedVersion] FileSyncUploadReplyBody uploadedVersion
         */

        /**
         * Constructs a new FileSyncUploadReplyBody.
         * @memberof file
         * @classdesc Represents a FileSyncUploadReplyBody.
         * @implements IFileSyncUploadReplyBody
         * @constructor
         * @param {file.IFileSyncUploadReplyBody=} [properties] Properties to set
         */
        function FileSyncUploadReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileSyncUploadReplyBody uploadedVersion.
         * @member {common.IUInt64Value|null|undefined} uploadedVersion
         * @memberof file.FileSyncUploadReplyBody
         * @instance
         */
        FileSyncUploadReplyBody.prototype.uploadedVersion = null;

        /**
         * Creates a new FileSyncUploadReplyBody instance using the specified properties.
         * @function create
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {file.IFileSyncUploadReplyBody=} [properties] Properties to set
         * @returns {file.FileSyncUploadReplyBody} FileSyncUploadReplyBody instance
         */
        FileSyncUploadReplyBody.create = function create(properties) {
            return new FileSyncUploadReplyBody(properties);
        };

        /**
         * Encodes the specified FileSyncUploadReplyBody message. Does not implicitly {@link file.FileSyncUploadReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {file.IFileSyncUploadReplyBody} message FileSyncUploadReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncUploadReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.uploadedVersion != null && Object.hasOwnProperty.call(message, "uploadedVersion"))
                $root.common.UInt64Value.encode(message.uploadedVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FileSyncUploadReplyBody message, length delimited. Does not implicitly {@link file.FileSyncUploadReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {file.IFileSyncUploadReplyBody} message FileSyncUploadReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncUploadReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileSyncUploadReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileSyncUploadReplyBody} FileSyncUploadReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncUploadReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncUploadReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.uploadedVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileSyncUploadReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.FileSyncUploadReplyBody} FileSyncUploadReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncUploadReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileSyncUploadReplyBody message.
         * @function verify
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileSyncUploadReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.uploadedVersion != null && Object.hasOwnProperty.call(message, "uploadedVersion")) {
                var error = $root.common.UInt64Value.verify(message.uploadedVersion, long + 1);
                if (error)
                    return "uploadedVersion." + error;
            }
            return null;
        };

        /**
         * Creates a FileSyncUploadReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileSyncUploadReplyBody} FileSyncUploadReplyBody
         */
        FileSyncUploadReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.FileSyncUploadReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.FileSyncUploadReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.FileSyncUploadReplyBody();
            if (object.uploadedVersion != null) {
                if (!$util.isObject(object.uploadedVersion))
                    throw TypeError(".file.FileSyncUploadReplyBody.uploadedVersion: object expected");
                message.uploadedVersion = $root.common.UInt64Value.fromObject(object.uploadedVersion, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a FileSyncUploadReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {file.FileSyncUploadReplyBody} message FileSyncUploadReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileSyncUploadReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.uploadedVersion = null;
            if (message.uploadedVersion != null && Object.hasOwnProperty.call(message, "uploadedVersion"))
                object.uploadedVersion = $root.common.UInt64Value.toObject(message.uploadedVersion, options, q + 1);
            return object;
        };

        /**
         * Converts this FileSyncUploadReplyBody to JSON.
         * @function toJSON
         * @memberof file.FileSyncUploadReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileSyncUploadReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileSyncUploadReplyBody
         * @function getTypeUrl
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileSyncUploadReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.FileSyncUploadReplyBody";
        };

        return FileSyncUploadReplyBody;
    })();

    file.FileSyncStartUploadReplyBody = (function() {

        /**
         * Properties of a FileSyncStartUploadReplyBody.
         * @memberof file
         * @interface IFileSyncStartUploadReplyBody
         * @property {file.FileSyncStartUploadReplyBody.IUploadInfo|null} [startedUpload] FileSyncStartUploadReplyBody startedUpload
         */

        /**
         * Constructs a new FileSyncStartUploadReplyBody.
         * @memberof file
         * @classdesc Represents a FileSyncStartUploadReplyBody.
         * @implements IFileSyncStartUploadReplyBody
         * @constructor
         * @param {file.IFileSyncStartUploadReplyBody=} [properties] Properties to set
         */
        function FileSyncStartUploadReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileSyncStartUploadReplyBody startedUpload.
         * @member {file.FileSyncStartUploadReplyBody.IUploadInfo|null|undefined} startedUpload
         * @memberof file.FileSyncStartUploadReplyBody
         * @instance
         */
        FileSyncStartUploadReplyBody.prototype.startedUpload = null;

        /**
         * Creates a new FileSyncStartUploadReplyBody instance using the specified properties.
         * @function create
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {file.IFileSyncStartUploadReplyBody=} [properties] Properties to set
         * @returns {file.FileSyncStartUploadReplyBody} FileSyncStartUploadReplyBody instance
         */
        FileSyncStartUploadReplyBody.create = function create(properties) {
            return new FileSyncStartUploadReplyBody(properties);
        };

        /**
         * Encodes the specified FileSyncStartUploadReplyBody message. Does not implicitly {@link file.FileSyncStartUploadReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {file.IFileSyncStartUploadReplyBody} message FileSyncStartUploadReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncStartUploadReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.startedUpload != null && Object.hasOwnProperty.call(message, "startedUpload"))
                $root.file.FileSyncStartUploadReplyBody.UploadInfo.encode(message.startedUpload, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FileSyncStartUploadReplyBody message, length delimited. Does not implicitly {@link file.FileSyncStartUploadReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {file.IFileSyncStartUploadReplyBody} message FileSyncStartUploadReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncStartUploadReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileSyncStartUploadReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileSyncStartUploadReplyBody} FileSyncStartUploadReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncStartUploadReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncStartUploadReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.startedUpload = $root.file.FileSyncStartUploadReplyBody.UploadInfo.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileSyncStartUploadReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.FileSyncStartUploadReplyBody} FileSyncStartUploadReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncStartUploadReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileSyncStartUploadReplyBody message.
         * @function verify
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileSyncStartUploadReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.startedUpload != null && Object.hasOwnProperty.call(message, "startedUpload")) {
                var error = $root.file.FileSyncStartUploadReplyBody.UploadInfo.verify(message.startedUpload, long + 1);
                if (error)
                    return "startedUpload." + error;
            }
            return null;
        };

        /**
         * Creates a FileSyncStartUploadReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileSyncStartUploadReplyBody} FileSyncStartUploadReplyBody
         */
        FileSyncStartUploadReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.FileSyncStartUploadReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.FileSyncStartUploadReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.FileSyncStartUploadReplyBody();
            if (object.startedUpload != null) {
                if (!$util.isObject(object.startedUpload))
                    throw TypeError(".file.FileSyncStartUploadReplyBody.startedUpload: object expected");
                message.startedUpload = $root.file.FileSyncStartUploadReplyBody.UploadInfo.fromObject(object.startedUpload, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a FileSyncStartUploadReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {file.FileSyncStartUploadReplyBody} message FileSyncStartUploadReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileSyncStartUploadReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.startedUpload = null;
            if (message.startedUpload != null && Object.hasOwnProperty.call(message, "startedUpload"))
                object.startedUpload = $root.file.FileSyncStartUploadReplyBody.UploadInfo.toObject(message.startedUpload, options, q + 1);
            return object;
        };

        /**
         * Converts this FileSyncStartUploadReplyBody to JSON.
         * @function toJSON
         * @memberof file.FileSyncStartUploadReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileSyncStartUploadReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileSyncStartUploadReplyBody
         * @function getTypeUrl
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileSyncStartUploadReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.FileSyncStartUploadReplyBody";
        };

        FileSyncStartUploadReplyBody.UploadInfo = (function() {

            /**
             * Properties of an UploadInfo.
             * @memberof file.FileSyncStartUploadReplyBody
             * @interface IUploadInfo
             * @property {number|Long|null} [uploadVersion] UploadInfo uploadVersion
             * @property {number|Long|null} [uploadTaskId] UploadInfo uploadTaskId
             */

            /**
             * Constructs a new UploadInfo.
             * @memberof file.FileSyncStartUploadReplyBody
             * @classdesc Represents an UploadInfo.
             * @implements IUploadInfo
             * @constructor
             * @param {file.FileSyncStartUploadReplyBody.IUploadInfo=} [properties] Properties to set
             */
            function UploadInfo(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * UploadInfo uploadVersion.
             * @member {number|Long} uploadVersion
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @instance
             */
            UploadInfo.prototype.uploadVersion = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

            /**
             * UploadInfo uploadTaskId.
             * @member {number|Long} uploadTaskId
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @instance
             */
            UploadInfo.prototype.uploadTaskId = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

            /**
             * Creates a new UploadInfo instance using the specified properties.
             * @function create
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {file.FileSyncStartUploadReplyBody.IUploadInfo=} [properties] Properties to set
             * @returns {file.FileSyncStartUploadReplyBody.UploadInfo} UploadInfo instance
             */
            UploadInfo.create = function create(properties) {
                return new UploadInfo(properties);
            };

            /**
             * Encodes the specified UploadInfo message. Does not implicitly {@link file.FileSyncStartUploadReplyBody.UploadInfo.verify|verify} messages.
             * @function encode
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {file.FileSyncStartUploadReplyBody.IUploadInfo} message UploadInfo message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            UploadInfo.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                    writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.uploadVersion);
                if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                    writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.uploadTaskId);
                return writer;
            };

            /**
             * Encodes the specified UploadInfo message, length delimited. Does not implicitly {@link file.FileSyncStartUploadReplyBody.UploadInfo.verify|verify} messages.
             * @function encodeDelimited
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {file.FileSyncStartUploadReplyBody.IUploadInfo} message UploadInfo message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            UploadInfo.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes an UploadInfo message from the specified reader or buffer.
             * @function decode
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {file.FileSyncStartUploadReplyBody.UploadInfo} UploadInfo
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            UploadInfo.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncStartUploadReplyBody.UploadInfo();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.uploadVersion = reader.uint64();
                            break;
                        }
                    case 2: {
                            message.uploadTaskId = reader.uint64();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes an UploadInfo message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {file.FileSyncStartUploadReplyBody.UploadInfo} UploadInfo
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            UploadInfo.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies an UploadInfo message.
             * @function verify
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            UploadInfo.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                    if (!$util.isInteger(message.uploadVersion) && !(message.uploadVersion && $util.isInteger(message.uploadVersion.low) && $util.isInteger(message.uploadVersion.high)))
                        return "uploadVersion: integer|Long expected";
                if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                    if (!$util.isInteger(message.uploadTaskId) && !(message.uploadTaskId && $util.isInteger(message.uploadTaskId.low) && $util.isInteger(message.uploadTaskId.high)))
                        return "uploadTaskId: integer|Long expected";
                return null;
            };

            /**
             * Creates an UploadInfo message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {file.FileSyncStartUploadReplyBody.UploadInfo} UploadInfo
             */
            UploadInfo.fromObject = function fromObject(object, long) {
                if (object instanceof $root.file.FileSyncStartUploadReplyBody.UploadInfo)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".file.FileSyncStartUploadReplyBody.UploadInfo: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.file.FileSyncStartUploadReplyBody.UploadInfo();
                if (object.uploadVersion != null)
                    if ($util.Long)
                        message.uploadVersion = $util.Long.fromValue(object.uploadVersion, true);
                    else if (typeof object.uploadVersion === "string")
                        message.uploadVersion = parseInt(object.uploadVersion, 10);
                    else if (typeof object.uploadVersion === "number")
                        message.uploadVersion = object.uploadVersion;
                    else if (typeof object.uploadVersion === "object")
                        message.uploadVersion = new $util.LongBits(object.uploadVersion.low >>> 0, object.uploadVersion.high >>> 0).toNumber(true);
                if (object.uploadTaskId != null)
                    if ($util.Long)
                        message.uploadTaskId = $util.Long.fromValue(object.uploadTaskId, true);
                    else if (typeof object.uploadTaskId === "string")
                        message.uploadTaskId = parseInt(object.uploadTaskId, 10);
                    else if (typeof object.uploadTaskId === "number")
                        message.uploadTaskId = object.uploadTaskId;
                    else if (typeof object.uploadTaskId === "object")
                        message.uploadTaskId = new $util.LongBits(object.uploadTaskId.low >>> 0, object.uploadTaskId.high >>> 0).toNumber(true);
                return message;
            };

            /**
             * Creates a plain object from an UploadInfo message. Also converts values to other types if specified.
             * @function toObject
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {file.FileSyncStartUploadReplyBody.UploadInfo} message UploadInfo
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            UploadInfo.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults) {
                    if ($util.Long) {
                        var long = new $util.Long(0, 0, true);
                        object.uploadVersion = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                    } else
                        object.uploadVersion = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                    if ($util.Long) {
                        var long = new $util.Long(0, 0, true);
                        object.uploadTaskId = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                    } else
                        object.uploadTaskId = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                }
                if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                    if (typeof BigInt !== "undefined" && options.longs === BigInt)
                        object.uploadVersion = typeof message.uploadVersion === "number" ? BigInt(message.uploadVersion) : $util.Long.fromBits(message.uploadVersion.low >>> 0, message.uploadVersion.high >>> 0, true).toBigInt();
                    else if (typeof message.uploadVersion === "number")
                        object.uploadVersion = options.longs === String ? String(message.uploadVersion) : message.uploadVersion;
                    else
                        object.uploadVersion = options.longs === String ? $util.Long.prototype.toString.call(message.uploadVersion) : options.longs === Number ? new $util.LongBits(message.uploadVersion.low >>> 0, message.uploadVersion.high >>> 0).toNumber(true) : message.uploadVersion;
                if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                    if (typeof BigInt !== "undefined" && options.longs === BigInt)
                        object.uploadTaskId = typeof message.uploadTaskId === "number" ? BigInt(message.uploadTaskId) : $util.Long.fromBits(message.uploadTaskId.low >>> 0, message.uploadTaskId.high >>> 0, true).toBigInt();
                    else if (typeof message.uploadTaskId === "number")
                        object.uploadTaskId = options.longs === String ? String(message.uploadTaskId) : message.uploadTaskId;
                    else
                        object.uploadTaskId = options.longs === String ? $util.Long.prototype.toString.call(message.uploadTaskId) : options.longs === Number ? new $util.LongBits(message.uploadTaskId.low >>> 0, message.uploadTaskId.high >>> 0).toNumber(true) : message.uploadTaskId;
                return object;
            };

            /**
             * Converts this UploadInfo to JSON.
             * @function toJSON
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            UploadInfo.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for UploadInfo
             * @function getTypeUrl
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            UploadInfo.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/file.FileSyncStartUploadReplyBody.UploadInfo";
            };

            return UploadInfo;
        })();

        return FileSyncStartUploadReplyBody;
    })();

    file.OptionsToUploadLocal = (function() {

        /**
         * Properties of an OptionsToUploadLocal.
         * @memberof file
         * @interface IOptionsToUploadLocal
         * @property {common.IUInt64Value|null} [localVersion] OptionsToUploadLocal localVersion
         * @property {common.IUInt64Value|null} [uploadVersion] OptionsToUploadLocal uploadVersion
         */

        /**
         * Constructs a new OptionsToUploadLocal.
         * @memberof file
         * @classdesc Represents an OptionsToUploadLocal.
         * @implements IOptionsToUploadLocal
         * @constructor
         * @param {file.IOptionsToUploadLocal=} [properties] Properties to set
         */
        function OptionsToUploadLocal(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * OptionsToUploadLocal localVersion.
         * @member {common.IUInt64Value|null|undefined} localVersion
         * @memberof file.OptionsToUploadLocal
         * @instance
         */
        OptionsToUploadLocal.prototype.localVersion = null;

        /**
         * OptionsToUploadLocal uploadVersion.
         * @member {common.IUInt64Value|null|undefined} uploadVersion
         * @memberof file.OptionsToUploadLocal
         * @instance
         */
        OptionsToUploadLocal.prototype.uploadVersion = null;

        /**
         * Creates a new OptionsToUploadLocal instance using the specified properties.
         * @function create
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {file.IOptionsToUploadLocal=} [properties] Properties to set
         * @returns {file.OptionsToUploadLocal} OptionsToUploadLocal instance
         */
        OptionsToUploadLocal.create = function create(properties) {
            return new OptionsToUploadLocal(properties);
        };

        /**
         * Encodes the specified OptionsToUploadLocal message. Does not implicitly {@link file.OptionsToUploadLocal.verify|verify} messages.
         * @function encode
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {file.IOptionsToUploadLocal} message OptionsToUploadLocal message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        OptionsToUploadLocal.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                $root.common.UInt64Value.encode(message.localVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                $root.common.UInt64Value.encode(message.uploadVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified OptionsToUploadLocal message, length delimited. Does not implicitly {@link file.OptionsToUploadLocal.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {file.IOptionsToUploadLocal} message OptionsToUploadLocal message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        OptionsToUploadLocal.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an OptionsToUploadLocal message from the specified reader or buffer.
         * @function decode
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.OptionsToUploadLocal} OptionsToUploadLocal
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        OptionsToUploadLocal.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.OptionsToUploadLocal();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.localVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.uploadVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an OptionsToUploadLocal message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.OptionsToUploadLocal} OptionsToUploadLocal
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        OptionsToUploadLocal.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an OptionsToUploadLocal message.
         * @function verify
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        OptionsToUploadLocal.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion")) {
                var error = $root.common.UInt64Value.verify(message.localVersion, long + 1);
                if (error)
                    return "localVersion." + error;
            }
            if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion")) {
                var error = $root.common.UInt64Value.verify(message.uploadVersion, long + 1);
                if (error)
                    return "uploadVersion." + error;
            }
            return null;
        };

        /**
         * Creates an OptionsToUploadLocal message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.OptionsToUploadLocal} OptionsToUploadLocal
         */
        OptionsToUploadLocal.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.OptionsToUploadLocal)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.OptionsToUploadLocal: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.OptionsToUploadLocal();
            if (object.localVersion != null) {
                if (!$util.isObject(object.localVersion))
                    throw TypeError(".file.OptionsToUploadLocal.localVersion: object expected");
                message.localVersion = $root.common.UInt64Value.fromObject(object.localVersion, long + 1);
            }
            if (object.uploadVersion != null) {
                if (!$util.isObject(object.uploadVersion))
                    throw TypeError(".file.OptionsToUploadLocal.uploadVersion: object expected");
                message.uploadVersion = $root.common.UInt64Value.fromObject(object.uploadVersion, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an OptionsToUploadLocal message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {file.OptionsToUploadLocal} message OptionsToUploadLocal
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        OptionsToUploadLocal.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.localVersion = null;
                object.uploadVersion = null;
            }
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                object.localVersion = $root.common.UInt64Value.toObject(message.localVersion, options, q + 1);
            if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                object.uploadVersion = $root.common.UInt64Value.toObject(message.uploadVersion, options, q + 1);
            return object;
        };

        /**
         * Converts this OptionsToUploadLocal to JSON.
         * @function toJSON
         * @memberof file.OptionsToUploadLocal
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        OptionsToUploadLocal.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for OptionsToUploadLocal
         * @function getTypeUrl
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        OptionsToUploadLocal.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.OptionsToUploadLocal";
        };

        return OptionsToUploadLocal;
    })();

    file.WatchUploadRequestBody = (function() {

        /**
         * Properties of a WatchUploadRequestBody.
         * @memberof file
         * @interface IWatchUploadRequestBody
         * @property {number|Long|null} [uploadTaskId] WatchUploadRequestBody uploadTaskId
         */

        /**
         * Constructs a new WatchUploadRequestBody.
         * @memberof file
         * @classdesc Represents a WatchUploadRequestBody.
         * @implements IWatchUploadRequestBody
         * @constructor
         * @param {file.IWatchUploadRequestBody=} [properties] Properties to set
         */
        function WatchUploadRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * WatchUploadRequestBody uploadTaskId.
         * @member {number|Long} uploadTaskId
         * @memberof file.WatchUploadRequestBody
         * @instance
         */
        WatchUploadRequestBody.prototype.uploadTaskId = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new WatchUploadRequestBody instance using the specified properties.
         * @function create
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {file.IWatchUploadRequestBody=} [properties] Properties to set
         * @returns {file.WatchUploadRequestBody} WatchUploadRequestBody instance
         */
        WatchUploadRequestBody.create = function create(properties) {
            return new WatchUploadRequestBody(properties);
        };

        /**
         * Encodes the specified WatchUploadRequestBody message. Does not implicitly {@link file.WatchUploadRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {file.IWatchUploadRequestBody} message WatchUploadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WatchUploadRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.uploadTaskId);
            return writer;
        };

        /**
         * Encodes the specified WatchUploadRequestBody message, length delimited. Does not implicitly {@link file.WatchUploadRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {file.IWatchUploadRequestBody} message WatchUploadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WatchUploadRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a WatchUploadRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.WatchUploadRequestBody} WatchUploadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WatchUploadRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.WatchUploadRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.uploadTaskId = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a WatchUploadRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.WatchUploadRequestBody} WatchUploadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WatchUploadRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a WatchUploadRequestBody message.
         * @function verify
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        WatchUploadRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                if (!$util.isInteger(message.uploadTaskId) && !(message.uploadTaskId && $util.isInteger(message.uploadTaskId.low) && $util.isInteger(message.uploadTaskId.high)))
                    return "uploadTaskId: integer|Long expected";
            return null;
        };

        /**
         * Creates a WatchUploadRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.WatchUploadRequestBody} WatchUploadRequestBody
         */
        WatchUploadRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.WatchUploadRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.WatchUploadRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.WatchUploadRequestBody();
            if (object.uploadTaskId != null)
                if ($util.Long)
                    message.uploadTaskId = $util.Long.fromValue(object.uploadTaskId, true);
                else if (typeof object.uploadTaskId === "string")
                    message.uploadTaskId = parseInt(object.uploadTaskId, 10);
                else if (typeof object.uploadTaskId === "number")
                    message.uploadTaskId = object.uploadTaskId;
                else if (typeof object.uploadTaskId === "object")
                    message.uploadTaskId = new $util.LongBits(object.uploadTaskId.low >>> 0, object.uploadTaskId.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from a WatchUploadRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {file.WatchUploadRequestBody} message WatchUploadRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        WatchUploadRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.uploadTaskId = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.uploadTaskId = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.uploadTaskId = typeof message.uploadTaskId === "number" ? BigInt(message.uploadTaskId) : $util.Long.fromBits(message.uploadTaskId.low >>> 0, message.uploadTaskId.high >>> 0, true).toBigInt();
                else if (typeof message.uploadTaskId === "number")
                    object.uploadTaskId = options.longs === String ? String(message.uploadTaskId) : message.uploadTaskId;
                else
                    object.uploadTaskId = options.longs === String ? $util.Long.prototype.toString.call(message.uploadTaskId) : options.longs === Number ? new $util.LongBits(message.uploadTaskId.low >>> 0, message.uploadTaskId.high >>> 0).toNumber(true) : message.uploadTaskId;
            return object;
        };

        /**
         * Converts this WatchUploadRequestBody to JSON.
         * @function toJSON
         * @memberof file.WatchUploadRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        WatchUploadRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for WatchUploadRequestBody
         * @function getTypeUrl
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        WatchUploadRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.WatchUploadRequestBody";
        };

        return WatchUploadRequestBody;
    })();

    file.UploadEventMsg = (function() {

        /**
         * Properties of an UploadEventMsg.
         * @memberof file
         * @interface IUploadEventMsg
         * @property {string|null} [type] UploadEventMsg type
         * @property {number|Long|null} [uploadTaskId] UploadEventMsg uploadTaskId
         * @property {number|Long|null} [localVersion] UploadEventMsg localVersion
         * @property {number|Long|null} [uploadVersion] UploadEventMsg uploadVersion
         */

        /**
         * Constructs a new UploadEventMsg.
         * @memberof file
         * @classdesc Represents an UploadEventMsg.
         * @implements IUploadEventMsg
         * @constructor
         * @param {file.IUploadEventMsg=} [properties] Properties to set
         */
        function UploadEventMsg(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * UploadEventMsg type.
         * @member {string} type
         * @memberof file.UploadEventMsg
         * @instance
         */
        UploadEventMsg.prototype.type = "";

        /**
         * UploadEventMsg uploadTaskId.
         * @member {number|Long} uploadTaskId
         * @memberof file.UploadEventMsg
         * @instance
         */
        UploadEventMsg.prototype.uploadTaskId = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * UploadEventMsg localVersion.
         * @member {number|Long} localVersion
         * @memberof file.UploadEventMsg
         * @instance
         */
        UploadEventMsg.prototype.localVersion = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * UploadEventMsg uploadVersion.
         * @member {number|Long} uploadVersion
         * @memberof file.UploadEventMsg
         * @instance
         */
        UploadEventMsg.prototype.uploadVersion = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new UploadEventMsg instance using the specified properties.
         * @function create
         * @memberof file.UploadEventMsg
         * @static
         * @param {file.IUploadEventMsg=} [properties] Properties to set
         * @returns {file.UploadEventMsg} UploadEventMsg instance
         */
        UploadEventMsg.create = function create(properties) {
            return new UploadEventMsg(properties);
        };

        /**
         * Encodes the specified UploadEventMsg message. Does not implicitly {@link file.UploadEventMsg.verify|verify} messages.
         * @function encode
         * @memberof file.UploadEventMsg
         * @static
         * @param {file.IUploadEventMsg} message UploadEventMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UploadEventMsg.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.type);
            if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.uploadTaskId);
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.localVersion);
            if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                writer.uint32(/* id 4, wireType 0 =*/32).uint64(message.uploadVersion);
            return writer;
        };

        /**
         * Encodes the specified UploadEventMsg message, length delimited. Does not implicitly {@link file.UploadEventMsg.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.UploadEventMsg
         * @static
         * @param {file.IUploadEventMsg} message UploadEventMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UploadEventMsg.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an UploadEventMsg message from the specified reader or buffer.
         * @function decode
         * @memberof file.UploadEventMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.UploadEventMsg} UploadEventMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UploadEventMsg.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.UploadEventMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.type = reader.string();
                        break;
                    }
                case 2: {
                        message.uploadTaskId = reader.uint64();
                        break;
                    }
                case 3: {
                        message.localVersion = reader.uint64();
                        break;
                    }
                case 4: {
                        message.uploadVersion = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an UploadEventMsg message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.UploadEventMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.UploadEventMsg} UploadEventMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UploadEventMsg.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an UploadEventMsg message.
         * @function verify
         * @memberof file.UploadEventMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        UploadEventMsg.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                if (!$util.isInteger(message.uploadTaskId) && !(message.uploadTaskId && $util.isInteger(message.uploadTaskId.low) && $util.isInteger(message.uploadTaskId.high)))
                    return "uploadTaskId: integer|Long expected";
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                if (!$util.isInteger(message.localVersion) && !(message.localVersion && $util.isInteger(message.localVersion.low) && $util.isInteger(message.localVersion.high)))
                    return "localVersion: integer|Long expected";
            if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                if (!$util.isInteger(message.uploadVersion) && !(message.uploadVersion && $util.isInteger(message.uploadVersion.low) && $util.isInteger(message.uploadVersion.high)))
                    return "uploadVersion: integer|Long expected";
            return null;
        };

        /**
         * Creates an UploadEventMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.UploadEventMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.UploadEventMsg} UploadEventMsg
         */
        UploadEventMsg.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.UploadEventMsg)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.UploadEventMsg: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.UploadEventMsg();
            if (object.type != null)
                message.type = String(object.type);
            if (object.uploadTaskId != null)
                if ($util.Long)
                    message.uploadTaskId = $util.Long.fromValue(object.uploadTaskId, true);
                else if (typeof object.uploadTaskId === "string")
                    message.uploadTaskId = parseInt(object.uploadTaskId, 10);
                else if (typeof object.uploadTaskId === "number")
                    message.uploadTaskId = object.uploadTaskId;
                else if (typeof object.uploadTaskId === "object")
                    message.uploadTaskId = new $util.LongBits(object.uploadTaskId.low >>> 0, object.uploadTaskId.high >>> 0).toNumber(true);
            if (object.localVersion != null)
                if ($util.Long)
                    message.localVersion = $util.Long.fromValue(object.localVersion, true);
                else if (typeof object.localVersion === "string")
                    message.localVersion = parseInt(object.localVersion, 10);
                else if (typeof object.localVersion === "number")
                    message.localVersion = object.localVersion;
                else if (typeof object.localVersion === "object")
                    message.localVersion = new $util.LongBits(object.localVersion.low >>> 0, object.localVersion.high >>> 0).toNumber(true);
            if (object.uploadVersion != null)
                if ($util.Long)
                    message.uploadVersion = $util.Long.fromValue(object.uploadVersion, true);
                else if (typeof object.uploadVersion === "string")
                    message.uploadVersion = parseInt(object.uploadVersion, 10);
                else if (typeof object.uploadVersion === "number")
                    message.uploadVersion = object.uploadVersion;
                else if (typeof object.uploadVersion === "object")
                    message.uploadVersion = new $util.LongBits(object.uploadVersion.low >>> 0, object.uploadVersion.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from an UploadEventMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.UploadEventMsg
         * @static
         * @param {file.UploadEventMsg} message UploadEventMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        UploadEventMsg.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.type = "";
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.uploadTaskId = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.uploadTaskId = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.localVersion = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.localVersion = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.uploadVersion = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.uploadVersion = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            }
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                object.type = message.type;
            if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.uploadTaskId = typeof message.uploadTaskId === "number" ? BigInt(message.uploadTaskId) : $util.Long.fromBits(message.uploadTaskId.low >>> 0, message.uploadTaskId.high >>> 0, true).toBigInt();
                else if (typeof message.uploadTaskId === "number")
                    object.uploadTaskId = options.longs === String ? String(message.uploadTaskId) : message.uploadTaskId;
                else
                    object.uploadTaskId = options.longs === String ? $util.Long.prototype.toString.call(message.uploadTaskId) : options.longs === Number ? new $util.LongBits(message.uploadTaskId.low >>> 0, message.uploadTaskId.high >>> 0).toNumber(true) : message.uploadTaskId;
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.localVersion = typeof message.localVersion === "number" ? BigInt(message.localVersion) : $util.Long.fromBits(message.localVersion.low >>> 0, message.localVersion.high >>> 0, true).toBigInt();
                else if (typeof message.localVersion === "number")
                    object.localVersion = options.longs === String ? String(message.localVersion) : message.localVersion;
                else
                    object.localVersion = options.longs === String ? $util.Long.prototype.toString.call(message.localVersion) : options.longs === Number ? new $util.LongBits(message.localVersion.low >>> 0, message.localVersion.high >>> 0).toNumber(true) : message.localVersion;
            if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.uploadVersion = typeof message.uploadVersion === "number" ? BigInt(message.uploadVersion) : $util.Long.fromBits(message.uploadVersion.low >>> 0, message.uploadVersion.high >>> 0, true).toBigInt();
                else if (typeof message.uploadVersion === "number")
                    object.uploadVersion = options.longs === String ? String(message.uploadVersion) : message.uploadVersion;
                else
                    object.uploadVersion = options.longs === String ? $util.Long.prototype.toString.call(message.uploadVersion) : options.longs === Number ? new $util.LongBits(message.uploadVersion.low >>> 0, message.uploadVersion.high >>> 0).toNumber(true) : message.uploadVersion;
            return object;
        };

        /**
         * Converts this UploadEventMsg to JSON.
         * @function toJSON
         * @memberof file.UploadEventMsg
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        UploadEventMsg.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for UploadEventMsg
         * @function getTypeUrl
         * @memberof file.UploadEventMsg
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        UploadEventMsg.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.UploadEventMsg";
        };

        return UploadEventMsg;
    })();

    return file;
})();

$root.common = (function() {

    /**
     * Namespace common.
     * @exports common
     * @namespace
     */
    var common = {};

    common.ObjectReference = (function() {

        /**
         * Properties of an ObjectReference.
         * @memberof common
         * @interface IObjectReference
         * @property {string|null} [objType] ObjectReference objType
         * @property {Array.<string>|null} [path] ObjectReference path
         */

        /**
         * Constructs a new ObjectReference.
         * @memberof common
         * @classdesc Represents an ObjectReference.
         * @implements IObjectReference
         * @constructor
         * @param {common.IObjectReference=} [properties] Properties to set
         */
        function ObjectReference(properties) {
            this.path = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ObjectReference objType.
         * @member {string} objType
         * @memberof common.ObjectReference
         * @instance
         */
        ObjectReference.prototype.objType = "";

        /**
         * ObjectReference path.
         * @member {Array.<string>} path
         * @memberof common.ObjectReference
         * @instance
         */
        ObjectReference.prototype.path = $util.emptyArray;

        /**
         * Creates a new ObjectReference instance using the specified properties.
         * @function create
         * @memberof common.ObjectReference
         * @static
         * @param {common.IObjectReference=} [properties] Properties to set
         * @returns {common.ObjectReference} ObjectReference instance
         */
        ObjectReference.create = function create(properties) {
            return new ObjectReference(properties);
        };

        /**
         * Encodes the specified ObjectReference message. Does not implicitly {@link common.ObjectReference.verify|verify} messages.
         * @function encode
         * @memberof common.ObjectReference
         * @static
         * @param {common.IObjectReference} message ObjectReference message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ObjectReference.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.objType != null && Object.hasOwnProperty.call(message, "objType"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.objType);
            if (message.path != null && message.path.length)
                for (var i = 0; i < message.path.length; ++i)
                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.path[i]);
            return writer;
        };

        /**
         * Encodes the specified ObjectReference message, length delimited. Does not implicitly {@link common.ObjectReference.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.ObjectReference
         * @static
         * @param {common.IObjectReference} message ObjectReference message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ObjectReference.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an ObjectReference message from the specified reader or buffer.
         * @function decode
         * @memberof common.ObjectReference
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.ObjectReference} ObjectReference
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ObjectReference.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ObjectReference();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.objType = reader.string();
                        break;
                    }
                case 2: {
                        if (!(message.path && message.path.length))
                            message.path = [];
                        message.path.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an ObjectReference message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.ObjectReference
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.ObjectReference} ObjectReference
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ObjectReference.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an ObjectReference message.
         * @function verify
         * @memberof common.ObjectReference
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ObjectReference.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.objType != null && Object.hasOwnProperty.call(message, "objType"))
                if (!$util.isString(message.objType))
                    return "objType: string expected";
            if (message.path != null && Object.hasOwnProperty.call(message, "path")) {
                if (!Array.isArray(message.path))
                    return "path: array expected";
                for (var i = 0; i < message.path.length; ++i)
                    if (!$util.isString(message.path[i]))
                        return "path: string[] expected";
            }
            return null;
        };

        /**
         * Creates an ObjectReference message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.ObjectReference
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.ObjectReference} ObjectReference
         */
        ObjectReference.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.ObjectReference)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.ObjectReference: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.ObjectReference();
            if (object.objType != null)
                message.objType = String(object.objType);
            if (object.path) {
                if (!Array.isArray(object.path))
                    throw TypeError(".common.ObjectReference.path: array expected");
                message.path = [];
                for (var i = 0; i < object.path.length; ++i)
                    message.path[i] = String(object.path[i]);
            }
            return message;
        };

        /**
         * Creates a plain object from an ObjectReference message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.ObjectReference
         * @static
         * @param {common.ObjectReference} message ObjectReference
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ObjectReference.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.path = [];
            if (options.defaults)
                object.objType = "";
            if (message.objType != null && Object.hasOwnProperty.call(message, "objType"))
                object.objType = message.objType;
            if (message.path && message.path.length) {
                object.path = [];
                for (var j = 0; j < message.path.length; ++j)
                    object.path[j] = message.path[j];
            }
            return object;
        };

        /**
         * Converts this ObjectReference to JSON.
         * @function toJSON
         * @memberof common.ObjectReference
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ObjectReference.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ObjectReference
         * @function getTypeUrl
         * @memberof common.ObjectReference
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ObjectReference.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.ObjectReference";
        };

        return ObjectReference;
    })();

    common.BooleanValue = (function() {

        /**
         * Properties of a BooleanValue.
         * @memberof common
         * @interface IBooleanValue
         * @property {boolean|null} [value] BooleanValue value
         */

        /**
         * Constructs a new BooleanValue.
         * @memberof common
         * @classdesc Represents a BooleanValue.
         * @implements IBooleanValue
         * @constructor
         * @param {common.IBooleanValue=} [properties] Properties to set
         */
        function BooleanValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * BooleanValue value.
         * @member {boolean} value
         * @memberof common.BooleanValue
         * @instance
         */
        BooleanValue.prototype.value = false;

        /**
         * Creates a new BooleanValue instance using the specified properties.
         * @function create
         * @memberof common.BooleanValue
         * @static
         * @param {common.IBooleanValue=} [properties] Properties to set
         * @returns {common.BooleanValue} BooleanValue instance
         */
        BooleanValue.create = function create(properties) {
            return new BooleanValue(properties);
        };

        /**
         * Encodes the specified BooleanValue message. Does not implicitly {@link common.BooleanValue.verify|verify} messages.
         * @function encode
         * @memberof common.BooleanValue
         * @static
         * @param {common.IBooleanValue} message BooleanValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BooleanValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 0 =*/8).bool(message.value);
            return writer;
        };

        /**
         * Encodes the specified BooleanValue message, length delimited. Does not implicitly {@link common.BooleanValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.BooleanValue
         * @static
         * @param {common.IBooleanValue} message BooleanValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BooleanValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a BooleanValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.BooleanValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.BooleanValue} BooleanValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BooleanValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BooleanValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.bool();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a BooleanValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.BooleanValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.BooleanValue} BooleanValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BooleanValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a BooleanValue message.
         * @function verify
         * @memberof common.BooleanValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        BooleanValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (typeof message.value !== "boolean")
                    return "value: boolean expected";
            return null;
        };

        /**
         * Creates a BooleanValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.BooleanValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.BooleanValue} BooleanValue
         */
        BooleanValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.BooleanValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.BooleanValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.BooleanValue();
            if (object.value != null)
                message.value = Boolean(object.value);
            return message;
        };

        /**
         * Creates a plain object from a BooleanValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.BooleanValue
         * @static
         * @param {common.BooleanValue} message BooleanValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        BooleanValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.value = false;
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = message.value;
            return object;
        };

        /**
         * Converts this BooleanValue to JSON.
         * @function toJSON
         * @memberof common.BooleanValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        BooleanValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for BooleanValue
         * @function getTypeUrl
         * @memberof common.BooleanValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        BooleanValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.BooleanValue";
        };

        return BooleanValue;
    })();

    common.StringArrayValue = (function() {

        /**
         * Properties of a StringArrayValue.
         * @memberof common
         * @interface IStringArrayValue
         * @property {Array.<string>|null} [values] StringArrayValue values
         */

        /**
         * Constructs a new StringArrayValue.
         * @memberof common
         * @classdesc Represents a StringArrayValue.
         * @implements IStringArrayValue
         * @constructor
         * @param {common.IStringArrayValue=} [properties] Properties to set
         */
        function StringArrayValue(properties) {
            this.values = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * StringArrayValue values.
         * @member {Array.<string>} values
         * @memberof common.StringArrayValue
         * @instance
         */
        StringArrayValue.prototype.values = $util.emptyArray;

        /**
         * Creates a new StringArrayValue instance using the specified properties.
         * @function create
         * @memberof common.StringArrayValue
         * @static
         * @param {common.IStringArrayValue=} [properties] Properties to set
         * @returns {common.StringArrayValue} StringArrayValue instance
         */
        StringArrayValue.create = function create(properties) {
            return new StringArrayValue(properties);
        };

        /**
         * Encodes the specified StringArrayValue message. Does not implicitly {@link common.StringArrayValue.verify|verify} messages.
         * @function encode
         * @memberof common.StringArrayValue
         * @static
         * @param {common.IStringArrayValue} message StringArrayValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringArrayValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.values != null && message.values.length)
                for (var i = 0; i < message.values.length; ++i)
                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.values[i]);
            return writer;
        };

        /**
         * Encodes the specified StringArrayValue message, length delimited. Does not implicitly {@link common.StringArrayValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.StringArrayValue
         * @static
         * @param {common.IStringArrayValue} message StringArrayValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringArrayValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a StringArrayValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.StringArrayValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.StringArrayValue} StringArrayValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringArrayValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringArrayValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.values && message.values.length))
                            message.values = [];
                        message.values.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a StringArrayValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.StringArrayValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.StringArrayValue} StringArrayValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringArrayValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a StringArrayValue message.
         * @function verify
         * @memberof common.StringArrayValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        StringArrayValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.values != null && Object.hasOwnProperty.call(message, "values")) {
                if (!Array.isArray(message.values))
                    return "values: array expected";
                for (var i = 0; i < message.values.length; ++i)
                    if (!$util.isString(message.values[i]))
                        return "values: string[] expected";
            }
            return null;
        };

        /**
         * Creates a StringArrayValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.StringArrayValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.StringArrayValue} StringArrayValue
         */
        StringArrayValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.StringArrayValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.StringArrayValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.StringArrayValue();
            if (object.values) {
                if (!Array.isArray(object.values))
                    throw TypeError(".common.StringArrayValue.values: array expected");
                message.values = [];
                for (var i = 0; i < object.values.length; ++i)
                    message.values[i] = String(object.values[i]);
            }
            return message;
        };

        /**
         * Creates a plain object from a StringArrayValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.StringArrayValue
         * @static
         * @param {common.StringArrayValue} message StringArrayValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        StringArrayValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.values = [];
            if (message.values && message.values.length) {
                object.values = [];
                for (var j = 0; j < message.values.length; ++j)
                    object.values[j] = message.values[j];
            }
            return object;
        };

        /**
         * Converts this StringArrayValue to JSON.
         * @function toJSON
         * @memberof common.StringArrayValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        StringArrayValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for StringArrayValue
         * @function getTypeUrl
         * @memberof common.StringArrayValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        StringArrayValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.StringArrayValue";
        };

        return StringArrayValue;
    })();

    common.UInt64Value = (function() {

        /**
         * Properties of a UInt64Value.
         * @memberof common
         * @interface IUInt64Value
         * @property {number|Long|null} [value] UInt64Value value
         */

        /**
         * Constructs a new UInt64Value.
         * @memberof common
         * @classdesc Represents a UInt64Value.
         * @implements IUInt64Value
         * @constructor
         * @param {common.IUInt64Value=} [properties] Properties to set
         */
        function UInt64Value(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * UInt64Value value.
         * @member {number|Long} value
         * @memberof common.UInt64Value
         * @instance
         */
        UInt64Value.prototype.value = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new UInt64Value instance using the specified properties.
         * @function create
         * @memberof common.UInt64Value
         * @static
         * @param {common.IUInt64Value=} [properties] Properties to set
         * @returns {common.UInt64Value} UInt64Value instance
         */
        UInt64Value.create = function create(properties) {
            return new UInt64Value(properties);
        };

        /**
         * Encodes the specified UInt64Value message. Does not implicitly {@link common.UInt64Value.verify|verify} messages.
         * @function encode
         * @memberof common.UInt64Value
         * @static
         * @param {common.IUInt64Value} message UInt64Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt64Value.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.value);
            return writer;
        };

        /**
         * Encodes the specified UInt64Value message, length delimited. Does not implicitly {@link common.UInt64Value.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.UInt64Value
         * @static
         * @param {common.IUInt64Value} message UInt64Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt64Value.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a UInt64Value message from the specified reader or buffer.
         * @function decode
         * @memberof common.UInt64Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.UInt64Value} UInt64Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt64Value.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt64Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a UInt64Value message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.UInt64Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.UInt64Value} UInt64Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt64Value.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a UInt64Value message.
         * @function verify
         * @memberof common.UInt64Value
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        UInt64Value.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!$util.isInteger(message.value) && !(message.value && $util.isInteger(message.value.low) && $util.isInteger(message.value.high)))
                    return "value: integer|Long expected";
            return null;
        };

        /**
         * Creates a UInt64Value message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.UInt64Value
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.UInt64Value} UInt64Value
         */
        UInt64Value.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.UInt64Value)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.UInt64Value: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.UInt64Value();
            if (object.value != null)
                if ($util.Long)
                    message.value = $util.Long.fromValue(object.value, true);
                else if (typeof object.value === "string")
                    message.value = parseInt(object.value, 10);
                else if (typeof object.value === "number")
                    message.value = object.value;
                else if (typeof object.value === "object")
                    message.value = new $util.LongBits(object.value.low >>> 0, object.value.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from a UInt64Value message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.UInt64Value
         * @static
         * @param {common.UInt64Value} message UInt64Value
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        UInt64Value.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.value = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.value = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.value = typeof message.value === "number" ? BigInt(message.value) : $util.Long.fromBits(message.value.low >>> 0, message.value.high >>> 0, true).toBigInt();
                else if (typeof message.value === "number")
                    object.value = options.longs === String ? String(message.value) : message.value;
                else
                    object.value = options.longs === String ? $util.Long.prototype.toString.call(message.value) : options.longs === Number ? new $util.LongBits(message.value.low >>> 0, message.value.high >>> 0).toNumber(true) : message.value;
            return object;
        };

        /**
         * Converts this UInt64Value to JSON.
         * @function toJSON
         * @memberof common.UInt64Value
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        UInt64Value.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for UInt64Value
         * @function getTypeUrl
         * @memberof common.UInt64Value
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        UInt64Value.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.UInt64Value";
        };

        return UInt64Value;
    })();

    common.UInt32Value = (function() {

        /**
         * Properties of a UInt32Value.
         * @memberof common
         * @interface IUInt32Value
         * @property {number|null} [value] UInt32Value value
         */

        /**
         * Constructs a new UInt32Value.
         * @memberof common
         * @classdesc Represents a UInt32Value.
         * @implements IUInt32Value
         * @constructor
         * @param {common.IUInt32Value=} [properties] Properties to set
         */
        function UInt32Value(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * UInt32Value value.
         * @member {number} value
         * @memberof common.UInt32Value
         * @instance
         */
        UInt32Value.prototype.value = 0;

        /**
         * Creates a new UInt32Value instance using the specified properties.
         * @function create
         * @memberof common.UInt32Value
         * @static
         * @param {common.IUInt32Value=} [properties] Properties to set
         * @returns {common.UInt32Value} UInt32Value instance
         */
        UInt32Value.create = function create(properties) {
            return new UInt32Value(properties);
        };

        /**
         * Encodes the specified UInt32Value message. Does not implicitly {@link common.UInt32Value.verify|verify} messages.
         * @function encode
         * @memberof common.UInt32Value
         * @static
         * @param {common.IUInt32Value} message UInt32Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt32Value.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.value);
            return writer;
        };

        /**
         * Encodes the specified UInt32Value message, length delimited. Does not implicitly {@link common.UInt32Value.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.UInt32Value
         * @static
         * @param {common.IUInt32Value} message UInt32Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt32Value.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a UInt32Value message from the specified reader or buffer.
         * @function decode
         * @memberof common.UInt32Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.UInt32Value} UInt32Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt32Value.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt32Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.uint32();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a UInt32Value message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.UInt32Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.UInt32Value} UInt32Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt32Value.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a UInt32Value message.
         * @function verify
         * @memberof common.UInt32Value
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        UInt32Value.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!$util.isInteger(message.value))
                    return "value: integer expected";
            return null;
        };

        /**
         * Creates a UInt32Value message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.UInt32Value
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.UInt32Value} UInt32Value
         */
        UInt32Value.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.UInt32Value)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.UInt32Value: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.UInt32Value();
            if (object.value != null)
                message.value = object.value >>> 0;
            return message;
        };

        /**
         * Creates a plain object from a UInt32Value message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.UInt32Value
         * @static
         * @param {common.UInt32Value} message UInt32Value
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        UInt32Value.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.value = 0;
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = message.value;
            return object;
        };

        /**
         * Converts this UInt32Value to JSON.
         * @function toJSON
         * @memberof common.UInt32Value
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        UInt32Value.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for UInt32Value
         * @function getTypeUrl
         * @memberof common.UInt32Value
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        UInt32Value.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.UInt32Value";
        };

        return UInt32Value;
    })();

    common.StringValue = (function() {

        /**
         * Properties of a StringValue.
         * @memberof common
         * @interface IStringValue
         * @property {string|null} [value] StringValue value
         */

        /**
         * Constructs a new StringValue.
         * @memberof common
         * @classdesc Represents a StringValue.
         * @implements IStringValue
         * @constructor
         * @param {common.IStringValue=} [properties] Properties to set
         */
        function StringValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * StringValue value.
         * @member {string} value
         * @memberof common.StringValue
         * @instance
         */
        StringValue.prototype.value = "";

        /**
         * Creates a new StringValue instance using the specified properties.
         * @function create
         * @memberof common.StringValue
         * @static
         * @param {common.IStringValue=} [properties] Properties to set
         * @returns {common.StringValue} StringValue instance
         */
        StringValue.create = function create(properties) {
            return new StringValue(properties);
        };

        /**
         * Encodes the specified StringValue message. Does not implicitly {@link common.StringValue.verify|verify} messages.
         * @function encode
         * @memberof common.StringValue
         * @static
         * @param {common.IStringValue} message StringValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.value);
            return writer;
        };

        /**
         * Encodes the specified StringValue message, length delimited. Does not implicitly {@link common.StringValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.StringValue
         * @static
         * @param {common.IStringValue} message StringValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a StringValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.StringValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.StringValue} StringValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a StringValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.StringValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.StringValue} StringValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a StringValue message.
         * @function verify
         * @memberof common.StringValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        StringValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!$util.isString(message.value))
                    return "value: string expected";
            return null;
        };

        /**
         * Creates a StringValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.StringValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.StringValue} StringValue
         */
        StringValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.StringValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.StringValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.StringValue();
            if (object.value != null)
                message.value = String(object.value);
            return message;
        };

        /**
         * Creates a plain object from a StringValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.StringValue
         * @static
         * @param {common.StringValue} message StringValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        StringValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.value = "";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = message.value;
            return object;
        };

        /**
         * Converts this StringValue to JSON.
         * @function toJSON
         * @memberof common.StringValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        StringValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for StringValue
         * @function getTypeUrl
         * @memberof common.StringValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        StringValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.StringValue";
        };

        return StringValue;
    })();

    common.BytesValue = (function() {

        /**
         * Properties of a BytesValue.
         * @memberof common
         * @interface IBytesValue
         * @property {Uint8Array|null} [value] BytesValue value
         */

        /**
         * Constructs a new BytesValue.
         * @memberof common
         * @classdesc Represents a BytesValue.
         * @implements IBytesValue
         * @constructor
         * @param {common.IBytesValue=} [properties] Properties to set
         */
        function BytesValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * BytesValue value.
         * @member {Uint8Array} value
         * @memberof common.BytesValue
         * @instance
         */
        BytesValue.prototype.value = $util.newBuffer([]);

        /**
         * Creates a new BytesValue instance using the specified properties.
         * @function create
         * @memberof common.BytesValue
         * @static
         * @param {common.IBytesValue=} [properties] Properties to set
         * @returns {common.BytesValue} BytesValue instance
         */
        BytesValue.create = function create(properties) {
            return new BytesValue(properties);
        };

        /**
         * Encodes the specified BytesValue message. Does not implicitly {@link common.BytesValue.verify|verify} messages.
         * @function encode
         * @memberof common.BytesValue
         * @static
         * @param {common.IBytesValue} message BytesValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BytesValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.value);
            return writer;
        };

        /**
         * Encodes the specified BytesValue message, length delimited. Does not implicitly {@link common.BytesValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.BytesValue
         * @static
         * @param {common.IBytesValue} message BytesValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BytesValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a BytesValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.BytesValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.BytesValue} BytesValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BytesValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BytesValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.bytes();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a BytesValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.BytesValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.BytesValue} BytesValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BytesValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a BytesValue message.
         * @function verify
         * @memberof common.BytesValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        BytesValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!(message.value && typeof message.value.length === "number" || $util.isString(message.value)))
                    return "value: buffer expected";
            return null;
        };

        /**
         * Creates a BytesValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.BytesValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.BytesValue} BytesValue
         */
        BytesValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.BytesValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.BytesValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.BytesValue();
            if (object.value != null)
                if (typeof object.value === "string")
                    $util.base64.decode(object.value, message.value = $util.newBuffer($util.base64.length(object.value)), 0);
                else if (object.value.length >= 0)
                    message.value = object.value;
            return message;
        };

        /**
         * Creates a plain object from a BytesValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.BytesValue
         * @static
         * @param {common.BytesValue} message BytesValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        BytesValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if (options.bytes === String)
                    object.value = "";
                else {
                    object.value = [];
                    if (options.bytes !== Array)
                        object.value = $util.newBuffer(object.value);
                }
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = options.bytes === String ? $util.base64.encode(message.value, 0, message.value.length) : options.bytes === Array ? Array.prototype.slice.call(message.value) : message.value;
            return object;
        };

        /**
         * Converts this BytesValue to JSON.
         * @function toJSON
         * @memberof common.BytesValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        BytesValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for BytesValue
         * @function getTypeUrl
         * @memberof common.BytesValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        BytesValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.BytesValue";
        };

        return BytesValue;
    })();

    common.ErrorValue = (function() {

        /**
         * Properties of an ErrorValue.
         * @memberof common
         * @interface IErrorValue
         * @property {string|null} [runtimeExcJson] ErrorValue runtimeExcJson
         * @property {string|null} [err] ErrorValue err
         */

        /**
         * Constructs a new ErrorValue.
         * @memberof common
         * @classdesc Represents an ErrorValue.
         * @implements IErrorValue
         * @constructor
         * @param {common.IErrorValue=} [properties] Properties to set
         */
        function ErrorValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ErrorValue runtimeExcJson.
         * @member {string} runtimeExcJson
         * @memberof common.ErrorValue
         * @instance
         */
        ErrorValue.prototype.runtimeExcJson = "";

        /**
         * ErrorValue err.
         * @member {string} err
         * @memberof common.ErrorValue
         * @instance
         */
        ErrorValue.prototype.err = "";

        /**
         * Creates a new ErrorValue instance using the specified properties.
         * @function create
         * @memberof common.ErrorValue
         * @static
         * @param {common.IErrorValue=} [properties] Properties to set
         * @returns {common.ErrorValue} ErrorValue instance
         */
        ErrorValue.create = function create(properties) {
            return new ErrorValue(properties);
        };

        /**
         * Encodes the specified ErrorValue message. Does not implicitly {@link common.ErrorValue.verify|verify} messages.
         * @function encode
         * @memberof common.ErrorValue
         * @static
         * @param {common.IErrorValue} message ErrorValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ErrorValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.runtimeExcJson != null && Object.hasOwnProperty.call(message, "runtimeExcJson"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.runtimeExcJson);
            if (message.err != null && Object.hasOwnProperty.call(message, "err"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.err);
            return writer;
        };

        /**
         * Encodes the specified ErrorValue message, length delimited. Does not implicitly {@link common.ErrorValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.ErrorValue
         * @static
         * @param {common.IErrorValue} message ErrorValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ErrorValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an ErrorValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.ErrorValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.ErrorValue} ErrorValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ErrorValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ErrorValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.runtimeExcJson = reader.string();
                        break;
                    }
                case 2: {
                        message.err = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an ErrorValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.ErrorValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.ErrorValue} ErrorValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ErrorValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an ErrorValue message.
         * @function verify
         * @memberof common.ErrorValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ErrorValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.runtimeExcJson != null && Object.hasOwnProperty.call(message, "runtimeExcJson"))
                if (!$util.isString(message.runtimeExcJson))
                    return "runtimeExcJson: string expected";
            if (message.err != null && Object.hasOwnProperty.call(message, "err"))
                if (!$util.isString(message.err))
                    return "err: string expected";
            return null;
        };

        /**
         * Creates an ErrorValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.ErrorValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.ErrorValue} ErrorValue
         */
        ErrorValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.ErrorValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.ErrorValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.ErrorValue();
            if (object.runtimeExcJson != null)
                message.runtimeExcJson = String(object.runtimeExcJson);
            if (object.err != null)
                message.err = String(object.err);
            return message;
        };

        /**
         * Creates a plain object from an ErrorValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.ErrorValue
         * @static
         * @param {common.ErrorValue} message ErrorValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ErrorValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.runtimeExcJson = "";
                object.err = "";
            }
            if (message.runtimeExcJson != null && Object.hasOwnProperty.call(message, "runtimeExcJson"))
                object.runtimeExcJson = message.runtimeExcJson;
            if (message.err != null && Object.hasOwnProperty.call(message, "err"))
                object.err = message.err;
            return object;
        };

        /**
         * Converts this ErrorValue to JSON.
         * @function toJSON
         * @memberof common.ErrorValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ErrorValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ErrorValue
         * @function getTypeUrl
         * @memberof common.ErrorValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ErrorValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.ErrorValue";
        };

        return ErrorValue;
    })();

    common.AnyValue = (function() {

        /**
         * Properties of an AnyValue.
         * @memberof common
         * @interface IAnyValue
         * @property {string|null} [type] AnyValue type
         * @property {common.IStringValue|null} [json] AnyValue json
         * @property {common.IBytesValue|null} [bytes] AnyValue bytes
         */

        /**
         * Constructs a new AnyValue.
         * @memberof common
         * @classdesc Represents an AnyValue.
         * @implements IAnyValue
         * @constructor
         * @param {common.IAnyValue=} [properties] Properties to set
         */
        function AnyValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * AnyValue type.
         * @member {string} type
         * @memberof common.AnyValue
         * @instance
         */
        AnyValue.prototype.type = "";

        /**
         * AnyValue json.
         * @member {common.IStringValue|null|undefined} json
         * @memberof common.AnyValue
         * @instance
         */
        AnyValue.prototype.json = null;

        /**
         * AnyValue bytes.
         * @member {common.IBytesValue|null|undefined} bytes
         * @memberof common.AnyValue
         * @instance
         */
        AnyValue.prototype.bytes = null;

        /**
         * Creates a new AnyValue instance using the specified properties.
         * @function create
         * @memberof common.AnyValue
         * @static
         * @param {common.IAnyValue=} [properties] Properties to set
         * @returns {common.AnyValue} AnyValue instance
         */
        AnyValue.create = function create(properties) {
            return new AnyValue(properties);
        };

        /**
         * Encodes the specified AnyValue message. Does not implicitly {@link common.AnyValue.verify|verify} messages.
         * @function encode
         * @memberof common.AnyValue
         * @static
         * @param {common.IAnyValue} message AnyValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AnyValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.type);
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified AnyValue message, length delimited. Does not implicitly {@link common.AnyValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.AnyValue
         * @static
         * @param {common.IAnyValue} message AnyValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AnyValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an AnyValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.AnyValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.AnyValue} AnyValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AnyValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.AnyValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.type = reader.string();
                        break;
                    }
                case 2: {
                        message.json = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an AnyValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.AnyValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.AnyValue} AnyValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AnyValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an AnyValue message.
         * @function verify
         * @memberof common.AnyValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        AnyValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.json != null && Object.hasOwnProperty.call(message, "json")) {
                var error = $root.common.StringValue.verify(message.json, long + 1);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes, long + 1);
                if (error)
                    return "bytes." + error;
            }
            return null;
        };

        /**
         * Creates an AnyValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.AnyValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.AnyValue} AnyValue
         */
        AnyValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.AnyValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.AnyValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.AnyValue();
            if (object.type != null)
                message.type = String(object.type);
            if (object.json != null) {
                if (!$util.isObject(object.json))
                    throw TypeError(".common.AnyValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json, long + 1);
            }
            if (object.bytes != null) {
                if (!$util.isObject(object.bytes))
                    throw TypeError(".common.AnyValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an AnyValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.AnyValue
         * @static
         * @param {common.AnyValue} message AnyValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        AnyValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.json = null;
                object.bytes = null;
            }
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                object.type = message.type;
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = $root.common.StringValue.toObject(message.json, options, q + 1);
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options, q + 1);
            return object;
        };

        /**
         * Converts this AnyValue to JSON.
         * @function toJSON
         * @memberof common.AnyValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        AnyValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for AnyValue
         * @function getTypeUrl
         * @memberof common.AnyValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        AnyValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.AnyValue";
        };

        return AnyValue;
    })();

    return common;
})();

module.exports = $root;

},{"protobufjs/minimal":84}],29:[function(require,module,exports){
/*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.fs = (function() {

    /**
     * Namespace fs.
     * @exports fs
     * @namespace
     */
    var fs = {};

    fs.FS = (function() {

        /**
         * Properties of a FS.
         * @memberof fs
         * @interface IFS
         * @property {string|null} [type] FS type
         * @property {boolean|null} [isVersioned] FS isVersioned
         * @property {boolean|null} [writable] FS writable
         * @property {string|null} [name] FS name
         * @property {common.IObjectReference|null} [impl] FS impl
         * @property {boolean|null} [isSynced] FS isSynced
         */

        /**
         * Constructs a new FS.
         * @memberof fs
         * @classdesc Represents a FS.
         * @implements IFS
         * @constructor
         * @param {fs.IFS=} [properties] Properties to set
         */
        function FS(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FS type.
         * @member {string} type
         * @memberof fs.FS
         * @instance
         */
        FS.prototype.type = "";

        /**
         * FS isVersioned.
         * @member {boolean} isVersioned
         * @memberof fs.FS
         * @instance
         */
        FS.prototype.isVersioned = false;

        /**
         * FS writable.
         * @member {boolean} writable
         * @memberof fs.FS
         * @instance
         */
        FS.prototype.writable = false;

        /**
         * FS name.
         * @member {string} name
         * @memberof fs.FS
         * @instance
         */
        FS.prototype.name = "";

        /**
         * FS impl.
         * @member {common.IObjectReference|null|undefined} impl
         * @memberof fs.FS
         * @instance
         */
        FS.prototype.impl = null;

        /**
         * FS isSynced.
         * @member {boolean} isSynced
         * @memberof fs.FS
         * @instance
         */
        FS.prototype.isSynced = false;

        /**
         * Creates a new FS instance using the specified properties.
         * @function create
         * @memberof fs.FS
         * @static
         * @param {fs.IFS=} [properties] Properties to set
         * @returns {fs.FS} FS instance
         */
        FS.create = function create(properties) {
            return new FS(properties);
        };

        /**
         * Encodes the specified FS message. Does not implicitly {@link fs.FS.verify|verify} messages.
         * @function encode
         * @memberof fs.FS
         * @static
         * @param {fs.IFS} message FS message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FS.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.type);
            if (message.isVersioned != null && Object.hasOwnProperty.call(message, "isVersioned"))
                writer.uint32(/* id 2, wireType 0 =*/16).bool(message.isVersioned);
            if (message.writable != null && Object.hasOwnProperty.call(message, "writable"))
                writer.uint32(/* id 3, wireType 0 =*/24).bool(message.writable);
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                writer.uint32(/* id 4, wireType 2 =*/34).string(message.name);
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl"))
                $root.common.ObjectReference.encode(message.impl, writer.uint32(/* id 5, wireType 2 =*/42).fork(), q + 1).ldelim();
            if (message.isSynced != null && Object.hasOwnProperty.call(message, "isSynced"))
                writer.uint32(/* id 6, wireType 0 =*/48).bool(message.isSynced);
            return writer;
        };

        /**
         * Encodes the specified FS message, length delimited. Does not implicitly {@link fs.FS.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FS
         * @static
         * @param {fs.IFS} message FS message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FS.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FS message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FS
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FS} FS
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FS.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FS();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.type = reader.string();
                        break;
                    }
                case 2: {
                        message.isVersioned = reader.bool();
                        break;
                    }
                case 3: {
                        message.writable = reader.bool();
                        break;
                    }
                case 4: {
                        message.name = reader.string();
                        break;
                    }
                case 5: {
                        message.impl = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 6: {
                        message.isSynced = reader.bool();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FS message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FS
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FS} FS
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FS.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FS message.
         * @function verify
         * @memberof fs.FS
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FS.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.isVersioned != null && Object.hasOwnProperty.call(message, "isVersioned"))
                if (typeof message.isVersioned !== "boolean")
                    return "isVersioned: boolean expected";
            if (message.writable != null && Object.hasOwnProperty.call(message, "writable"))
                if (typeof message.writable !== "boolean")
                    return "writable: boolean expected";
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl")) {
                var error = $root.common.ObjectReference.verify(message.impl, long + 1);
                if (error)
                    return "impl." + error;
            }
            if (message.isSynced != null && Object.hasOwnProperty.call(message, "isSynced"))
                if (typeof message.isSynced !== "boolean")
                    return "isSynced: boolean expected";
            return null;
        };

        /**
         * Creates a FS message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FS
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FS} FS
         */
        FS.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FS)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FS: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FS();
            if (object.type != null)
                message.type = String(object.type);
            if (object.isVersioned != null)
                message.isVersioned = Boolean(object.isVersioned);
            if (object.writable != null)
                message.writable = Boolean(object.writable);
            if (object.name != null)
                message.name = String(object.name);
            if (object.impl != null) {
                if (!$util.isObject(object.impl))
                    throw TypeError(".fs.FS.impl: object expected");
                message.impl = $root.common.ObjectReference.fromObject(object.impl, long + 1);
            }
            if (object.isSynced != null)
                message.isSynced = Boolean(object.isSynced);
            return message;
        };

        /**
         * Creates a plain object from a FS message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FS
         * @static
         * @param {fs.FS} message FS
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FS.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.isVersioned = false;
                object.writable = false;
                object.name = "";
                object.impl = null;
                object.isSynced = false;
            }
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                object.type = message.type;
            if (message.isVersioned != null && Object.hasOwnProperty.call(message, "isVersioned"))
                object.isVersioned = message.isVersioned;
            if (message.writable != null && Object.hasOwnProperty.call(message, "writable"))
                object.writable = message.writable;
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                object.name = message.name;
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl"))
                object.impl = $root.common.ObjectReference.toObject(message.impl, options, q + 1);
            if (message.isSynced != null && Object.hasOwnProperty.call(message, "isSynced"))
                object.isSynced = message.isSynced;
            return object;
        };

        /**
         * Converts this FS to JSON.
         * @function toJSON
         * @memberof fs.FS
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FS.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FS
         * @function getTypeUrl
         * @memberof fs.FS
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FS.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FS";
        };

        return FS;
    })();

    fs.CheckPresenceRequestBody = (function() {

        /**
         * Properties of a CheckPresenceRequestBody.
         * @memberof fs
         * @interface ICheckPresenceRequestBody
         * @property {string|null} [path] CheckPresenceRequestBody path
         * @property {common.IBooleanValue|null} [throwIfMissing] CheckPresenceRequestBody throwIfMissing
         */

        /**
         * Constructs a new CheckPresenceRequestBody.
         * @memberof fs
         * @classdesc Represents a CheckPresenceRequestBody.
         * @implements ICheckPresenceRequestBody
         * @constructor
         * @param {fs.ICheckPresenceRequestBody=} [properties] Properties to set
         */
        function CheckPresenceRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * CheckPresenceRequestBody path.
         * @member {string} path
         * @memberof fs.CheckPresenceRequestBody
         * @instance
         */
        CheckPresenceRequestBody.prototype.path = "";

        /**
         * CheckPresenceRequestBody throwIfMissing.
         * @member {common.IBooleanValue|null|undefined} throwIfMissing
         * @memberof fs.CheckPresenceRequestBody
         * @instance
         */
        CheckPresenceRequestBody.prototype.throwIfMissing = null;

        /**
         * Creates a new CheckPresenceRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.CheckPresenceRequestBody
         * @static
         * @param {fs.ICheckPresenceRequestBody=} [properties] Properties to set
         * @returns {fs.CheckPresenceRequestBody} CheckPresenceRequestBody instance
         */
        CheckPresenceRequestBody.create = function create(properties) {
            return new CheckPresenceRequestBody(properties);
        };

        /**
         * Encodes the specified CheckPresenceRequestBody message. Does not implicitly {@link fs.CheckPresenceRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.CheckPresenceRequestBody
         * @static
         * @param {fs.ICheckPresenceRequestBody} message CheckPresenceRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CheckPresenceRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.throwIfMissing != null && Object.hasOwnProperty.call(message, "throwIfMissing"))
                $root.common.BooleanValue.encode(message.throwIfMissing, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified CheckPresenceRequestBody message, length delimited. Does not implicitly {@link fs.CheckPresenceRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.CheckPresenceRequestBody
         * @static
         * @param {fs.ICheckPresenceRequestBody} message CheckPresenceRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CheckPresenceRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a CheckPresenceRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.CheckPresenceRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.CheckPresenceRequestBody} CheckPresenceRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CheckPresenceRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.CheckPresenceRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.throwIfMissing = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a CheckPresenceRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.CheckPresenceRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.CheckPresenceRequestBody} CheckPresenceRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CheckPresenceRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a CheckPresenceRequestBody message.
         * @function verify
         * @memberof fs.CheckPresenceRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        CheckPresenceRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.throwIfMissing != null && Object.hasOwnProperty.call(message, "throwIfMissing")) {
                var error = $root.common.BooleanValue.verify(message.throwIfMissing, long + 1);
                if (error)
                    return "throwIfMissing." + error;
            }
            return null;
        };

        /**
         * Creates a CheckPresenceRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.CheckPresenceRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.CheckPresenceRequestBody} CheckPresenceRequestBody
         */
        CheckPresenceRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.CheckPresenceRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.CheckPresenceRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.CheckPresenceRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.throwIfMissing != null) {
                if (!$util.isObject(object.throwIfMissing))
                    throw TypeError(".fs.CheckPresenceRequestBody.throwIfMissing: object expected");
                message.throwIfMissing = $root.common.BooleanValue.fromObject(object.throwIfMissing, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a CheckPresenceRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.CheckPresenceRequestBody
         * @static
         * @param {fs.CheckPresenceRequestBody} message CheckPresenceRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        CheckPresenceRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.throwIfMissing = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.throwIfMissing != null && Object.hasOwnProperty.call(message, "throwIfMissing"))
                object.throwIfMissing = $root.common.BooleanValue.toObject(message.throwIfMissing, options, q + 1);
            return object;
        };

        /**
         * Converts this CheckPresenceRequestBody to JSON.
         * @function toJSON
         * @memberof fs.CheckPresenceRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        CheckPresenceRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for CheckPresenceRequestBody
         * @function getTypeUrl
         * @memberof fs.CheckPresenceRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        CheckPresenceRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.CheckPresenceRequestBody";
        };

        return CheckPresenceRequestBody;
    })();

    fs.PathOnlyRequestBody = (function() {

        /**
         * Properties of a PathOnlyRequestBody.
         * @memberof fs
         * @interface IPathOnlyRequestBody
         * @property {string|null} [path] PathOnlyRequestBody path
         */

        /**
         * Constructs a new PathOnlyRequestBody.
         * @memberof fs
         * @classdesc Represents a PathOnlyRequestBody.
         * @implements IPathOnlyRequestBody
         * @constructor
         * @param {fs.IPathOnlyRequestBody=} [properties] Properties to set
         */
        function PathOnlyRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * PathOnlyRequestBody path.
         * @member {string} path
         * @memberof fs.PathOnlyRequestBody
         * @instance
         */
        PathOnlyRequestBody.prototype.path = "";

        /**
         * Creates a new PathOnlyRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.PathOnlyRequestBody
         * @static
         * @param {fs.IPathOnlyRequestBody=} [properties] Properties to set
         * @returns {fs.PathOnlyRequestBody} PathOnlyRequestBody instance
         */
        PathOnlyRequestBody.create = function create(properties) {
            return new PathOnlyRequestBody(properties);
        };

        /**
         * Encodes the specified PathOnlyRequestBody message. Does not implicitly {@link fs.PathOnlyRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.PathOnlyRequestBody
         * @static
         * @param {fs.IPathOnlyRequestBody} message PathOnlyRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        PathOnlyRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            return writer;
        };

        /**
         * Encodes the specified PathOnlyRequestBody message, length delimited. Does not implicitly {@link fs.PathOnlyRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.PathOnlyRequestBody
         * @static
         * @param {fs.IPathOnlyRequestBody} message PathOnlyRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        PathOnlyRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a PathOnlyRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.PathOnlyRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.PathOnlyRequestBody} PathOnlyRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        PathOnlyRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.PathOnlyRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a PathOnlyRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.PathOnlyRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.PathOnlyRequestBody} PathOnlyRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        PathOnlyRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a PathOnlyRequestBody message.
         * @function verify
         * @memberof fs.PathOnlyRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        PathOnlyRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            return null;
        };

        /**
         * Creates a PathOnlyRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.PathOnlyRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.PathOnlyRequestBody} PathOnlyRequestBody
         */
        PathOnlyRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.PathOnlyRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.PathOnlyRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.PathOnlyRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            return message;
        };

        /**
         * Creates a plain object from a PathOnlyRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.PathOnlyRequestBody
         * @static
         * @param {fs.PathOnlyRequestBody} message PathOnlyRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        PathOnlyRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.path = "";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            return object;
        };

        /**
         * Converts this PathOnlyRequestBody to JSON.
         * @function toJSON
         * @memberof fs.PathOnlyRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        PathOnlyRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for PathOnlyRequestBody
         * @function getTypeUrl
         * @memberof fs.PathOnlyRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        PathOnlyRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.PathOnlyRequestBody";
        };

        return PathOnlyRequestBody;
    })();

    fs.GetXAttrRequestBody = (function() {

        /**
         * Properties of a GetXAttrRequestBody.
         * @memberof fs
         * @interface IGetXAttrRequestBody
         * @property {string|null} [path] GetXAttrRequestBody path
         * @property {string|null} [xaName] GetXAttrRequestBody xaName
         */

        /**
         * Constructs a new GetXAttrRequestBody.
         * @memberof fs
         * @classdesc Represents a GetXAttrRequestBody.
         * @implements IGetXAttrRequestBody
         * @constructor
         * @param {fs.IGetXAttrRequestBody=} [properties] Properties to set
         */
        function GetXAttrRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * GetXAttrRequestBody path.
         * @member {string} path
         * @memberof fs.GetXAttrRequestBody
         * @instance
         */
        GetXAttrRequestBody.prototype.path = "";

        /**
         * GetXAttrRequestBody xaName.
         * @member {string} xaName
         * @memberof fs.GetXAttrRequestBody
         * @instance
         */
        GetXAttrRequestBody.prototype.xaName = "";

        /**
         * Creates a new GetXAttrRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.GetXAttrRequestBody
         * @static
         * @param {fs.IGetXAttrRequestBody=} [properties] Properties to set
         * @returns {fs.GetXAttrRequestBody} GetXAttrRequestBody instance
         */
        GetXAttrRequestBody.create = function create(properties) {
            return new GetXAttrRequestBody(properties);
        };

        /**
         * Encodes the specified GetXAttrRequestBody message. Does not implicitly {@link fs.GetXAttrRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.GetXAttrRequestBody
         * @static
         * @param {fs.IGetXAttrRequestBody} message GetXAttrRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        GetXAttrRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.xaName);
            return writer;
        };

        /**
         * Encodes the specified GetXAttrRequestBody message, length delimited. Does not implicitly {@link fs.GetXAttrRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.GetXAttrRequestBody
         * @static
         * @param {fs.IGetXAttrRequestBody} message GetXAttrRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        GetXAttrRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a GetXAttrRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.GetXAttrRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.GetXAttrRequestBody} GetXAttrRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        GetXAttrRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.GetXAttrRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.xaName = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a GetXAttrRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.GetXAttrRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.GetXAttrRequestBody} GetXAttrRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        GetXAttrRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a GetXAttrRequestBody message.
         * @function verify
         * @memberof fs.GetXAttrRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        GetXAttrRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                if (!$util.isString(message.xaName))
                    return "xaName: string expected";
            return null;
        };

        /**
         * Creates a GetXAttrRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.GetXAttrRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.GetXAttrRequestBody} GetXAttrRequestBody
         */
        GetXAttrRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.GetXAttrRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.GetXAttrRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.GetXAttrRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.xaName != null)
                message.xaName = String(object.xaName);
            return message;
        };

        /**
         * Creates a plain object from a GetXAttrRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.GetXAttrRequestBody
         * @static
         * @param {fs.GetXAttrRequestBody} message GetXAttrRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        GetXAttrRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.xaName = "";
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                object.xaName = message.xaName;
            return object;
        };

        /**
         * Converts this GetXAttrRequestBody to JSON.
         * @function toJSON
         * @memberof fs.GetXAttrRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        GetXAttrRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for GetXAttrRequestBody
         * @function getTypeUrl
         * @memberof fs.GetXAttrRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        GetXAttrRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.GetXAttrRequestBody";
        };

        return GetXAttrRequestBody;
    })();

    fs.SymLink = (function() {

        /**
         * Properties of a SymLink.
         * @memberof fs
         * @interface ISymLink
         * @property {boolean|null} [readonly] SymLink readonly
         * @property {common.IBooleanValue|null} [isFile] SymLink isFile
         * @property {common.IBooleanValue|null} [isFolder] SymLink isFolder
         * @property {common.IObjectReference|null} [impl] SymLink impl
         */

        /**
         * Constructs a new SymLink.
         * @memberof fs
         * @classdesc Represents a SymLink.
         * @implements ISymLink
         * @constructor
         * @param {fs.ISymLink=} [properties] Properties to set
         */
        function SymLink(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * SymLink readonly.
         * @member {boolean} readonly
         * @memberof fs.SymLink
         * @instance
         */
        SymLink.prototype.readonly = false;

        /**
         * SymLink isFile.
         * @member {common.IBooleanValue|null|undefined} isFile
         * @memberof fs.SymLink
         * @instance
         */
        SymLink.prototype.isFile = null;

        /**
         * SymLink isFolder.
         * @member {common.IBooleanValue|null|undefined} isFolder
         * @memberof fs.SymLink
         * @instance
         */
        SymLink.prototype.isFolder = null;

        /**
         * SymLink impl.
         * @member {common.IObjectReference|null|undefined} impl
         * @memberof fs.SymLink
         * @instance
         */
        SymLink.prototype.impl = null;

        /**
         * Creates a new SymLink instance using the specified properties.
         * @function create
         * @memberof fs.SymLink
         * @static
         * @param {fs.ISymLink=} [properties] Properties to set
         * @returns {fs.SymLink} SymLink instance
         */
        SymLink.create = function create(properties) {
            return new SymLink(properties);
        };

        /**
         * Encodes the specified SymLink message. Does not implicitly {@link fs.SymLink.verify|verify} messages.
         * @function encode
         * @memberof fs.SymLink
         * @static
         * @param {fs.ISymLink} message SymLink message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SymLink.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.readonly != null && Object.hasOwnProperty.call(message, "readonly"))
                writer.uint32(/* id 1, wireType 0 =*/8).bool(message.readonly);
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                $root.common.BooleanValue.encode(message.isFile, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                $root.common.BooleanValue.encode(message.isFolder, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl"))
                $root.common.ObjectReference.encode(message.impl, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified SymLink message, length delimited. Does not implicitly {@link fs.SymLink.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.SymLink
         * @static
         * @param {fs.ISymLink} message SymLink message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SymLink.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a SymLink message from the specified reader or buffer.
         * @function decode
         * @memberof fs.SymLink
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.SymLink} SymLink
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SymLink.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SymLink();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.readonly = reader.bool();
                        break;
                    }
                case 2: {
                        message.isFile = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.isFolder = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.impl = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a SymLink message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.SymLink
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.SymLink} SymLink
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SymLink.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a SymLink message.
         * @function verify
         * @memberof fs.SymLink
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        SymLink.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.readonly != null && Object.hasOwnProperty.call(message, "readonly"))
                if (typeof message.readonly !== "boolean")
                    return "readonly: boolean expected";
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile")) {
                var error = $root.common.BooleanValue.verify(message.isFile, long + 1);
                if (error)
                    return "isFile." + error;
            }
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder")) {
                var error = $root.common.BooleanValue.verify(message.isFolder, long + 1);
                if (error)
                    return "isFolder." + error;
            }
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl")) {
                var error = $root.common.ObjectReference.verify(message.impl, long + 1);
                if (error)
                    return "impl." + error;
            }
            return null;
        };

        /**
         * Creates a SymLink message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.SymLink
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.SymLink} SymLink
         */
        SymLink.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.SymLink)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.SymLink: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.SymLink();
            if (object.readonly != null)
                message.readonly = Boolean(object.readonly);
            if (object.isFile != null) {
                if (!$util.isObject(object.isFile))
                    throw TypeError(".fs.SymLink.isFile: object expected");
                message.isFile = $root.common.BooleanValue.fromObject(object.isFile, long + 1);
            }
            if (object.isFolder != null) {
                if (!$util.isObject(object.isFolder))
                    throw TypeError(".fs.SymLink.isFolder: object expected");
                message.isFolder = $root.common.BooleanValue.fromObject(object.isFolder, long + 1);
            }
            if (object.impl != null) {
                if (!$util.isObject(object.impl))
                    throw TypeError(".fs.SymLink.impl: object expected");
                message.impl = $root.common.ObjectReference.fromObject(object.impl, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a SymLink message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.SymLink
         * @static
         * @param {fs.SymLink} message SymLink
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        SymLink.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.readonly = false;
                object.isFile = null;
                object.isFolder = null;
                object.impl = null;
            }
            if (message.readonly != null && Object.hasOwnProperty.call(message, "readonly"))
                object.readonly = message.readonly;
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                object.isFile = $root.common.BooleanValue.toObject(message.isFile, options, q + 1);
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                object.isFolder = $root.common.BooleanValue.toObject(message.isFolder, options, q + 1);
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl"))
                object.impl = $root.common.ObjectReference.toObject(message.impl, options, q + 1);
            return object;
        };

        /**
         * Converts this SymLink to JSON.
         * @function toJSON
         * @memberof fs.SymLink
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        SymLink.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for SymLink
         * @function getTypeUrl
         * @memberof fs.SymLink
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        SymLink.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.SymLink";
        };

        return SymLink;
    })();

    fs.SymLinkTargetReplyBody = (function() {

        /**
         * Properties of a SymLinkTargetReplyBody.
         * @memberof fs
         * @interface ISymLinkTargetReplyBody
         * @property {fs.IFS|null} [fs] SymLinkTargetReplyBody fs
         * @property {file.IFile|null} [file] SymLinkTargetReplyBody file
         */

        /**
         * Constructs a new SymLinkTargetReplyBody.
         * @memberof fs
         * @classdesc Represents a SymLinkTargetReplyBody.
         * @implements ISymLinkTargetReplyBody
         * @constructor
         * @param {fs.ISymLinkTargetReplyBody=} [properties] Properties to set
         */
        function SymLinkTargetReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * SymLinkTargetReplyBody fs.
         * @member {fs.IFS|null|undefined} fs
         * @memberof fs.SymLinkTargetReplyBody
         * @instance
         */
        SymLinkTargetReplyBody.prototype.fs = null;

        /**
         * SymLinkTargetReplyBody file.
         * @member {file.IFile|null|undefined} file
         * @memberof fs.SymLinkTargetReplyBody
         * @instance
         */
        SymLinkTargetReplyBody.prototype.file = null;

        /**
         * Creates a new SymLinkTargetReplyBody instance using the specified properties.
         * @function create
         * @memberof fs.SymLinkTargetReplyBody
         * @static
         * @param {fs.ISymLinkTargetReplyBody=} [properties] Properties to set
         * @returns {fs.SymLinkTargetReplyBody} SymLinkTargetReplyBody instance
         */
        SymLinkTargetReplyBody.create = function create(properties) {
            return new SymLinkTargetReplyBody(properties);
        };

        /**
         * Encodes the specified SymLinkTargetReplyBody message. Does not implicitly {@link fs.SymLinkTargetReplyBody.verify|verify} messages.
         * @function encode
         * @memberof fs.SymLinkTargetReplyBody
         * @static
         * @param {fs.ISymLinkTargetReplyBody} message SymLinkTargetReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SymLinkTargetReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.fs != null && Object.hasOwnProperty.call(message, "fs"))
                $root.fs.FS.encode(message.fs, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                $root.file.File.encode(message.file, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified SymLinkTargetReplyBody message, length delimited. Does not implicitly {@link fs.SymLinkTargetReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.SymLinkTargetReplyBody
         * @static
         * @param {fs.ISymLinkTargetReplyBody} message SymLinkTargetReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SymLinkTargetReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a SymLinkTargetReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.SymLinkTargetReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.SymLinkTargetReplyBody} SymLinkTargetReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SymLinkTargetReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SymLinkTargetReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.fs = $root.fs.FS.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.file = $root.file.File.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a SymLinkTargetReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.SymLinkTargetReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.SymLinkTargetReplyBody} SymLinkTargetReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SymLinkTargetReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a SymLinkTargetReplyBody message.
         * @function verify
         * @memberof fs.SymLinkTargetReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        SymLinkTargetReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.fs != null && Object.hasOwnProperty.call(message, "fs")) {
                var error = $root.fs.FS.verify(message.fs, long + 1);
                if (error)
                    return "fs." + error;
            }
            if (message.file != null && Object.hasOwnProperty.call(message, "file")) {
                var error = $root.file.File.verify(message.file, long + 1);
                if (error)
                    return "file." + error;
            }
            return null;
        };

        /**
         * Creates a SymLinkTargetReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.SymLinkTargetReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.SymLinkTargetReplyBody} SymLinkTargetReplyBody
         */
        SymLinkTargetReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.SymLinkTargetReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.SymLinkTargetReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.SymLinkTargetReplyBody();
            if (object.fs != null) {
                if (!$util.isObject(object.fs))
                    throw TypeError(".fs.SymLinkTargetReplyBody.fs: object expected");
                message.fs = $root.fs.FS.fromObject(object.fs, long + 1);
            }
            if (object.file != null) {
                if (!$util.isObject(object.file))
                    throw TypeError(".fs.SymLinkTargetReplyBody.file: object expected");
                message.file = $root.file.File.fromObject(object.file, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a SymLinkTargetReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.SymLinkTargetReplyBody
         * @static
         * @param {fs.SymLinkTargetReplyBody} message SymLinkTargetReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        SymLinkTargetReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.fs = null;
                object.file = null;
            }
            if (message.fs != null && Object.hasOwnProperty.call(message, "fs"))
                object.fs = $root.fs.FS.toObject(message.fs, options, q + 1);
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                object.file = $root.file.File.toObject(message.file, options, q + 1);
            return object;
        };

        /**
         * Converts this SymLinkTargetReplyBody to JSON.
         * @function toJSON
         * @memberof fs.SymLinkTargetReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        SymLinkTargetReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for SymLinkTargetReplyBody
         * @function getTypeUrl
         * @memberof fs.SymLinkTargetReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        SymLinkTargetReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.SymLinkTargetReplyBody";
        };

        return SymLinkTargetReplyBody;
    })();

    fs.WatchTreeRequestBody = (function() {

        /**
         * Properties of a WatchTreeRequestBody.
         * @memberof fs
         * @interface IWatchTreeRequestBody
         * @property {string|null} [path] WatchTreeRequestBody path
         * @property {common.IUInt32Value|null} [depth] WatchTreeRequestBody depth
         */

        /**
         * Constructs a new WatchTreeRequestBody.
         * @memberof fs
         * @classdesc Represents a WatchTreeRequestBody.
         * @implements IWatchTreeRequestBody
         * @constructor
         * @param {fs.IWatchTreeRequestBody=} [properties] Properties to set
         */
        function WatchTreeRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * WatchTreeRequestBody path.
         * @member {string} path
         * @memberof fs.WatchTreeRequestBody
         * @instance
         */
        WatchTreeRequestBody.prototype.path = "";

        /**
         * WatchTreeRequestBody depth.
         * @member {common.IUInt32Value|null|undefined} depth
         * @memberof fs.WatchTreeRequestBody
         * @instance
         */
        WatchTreeRequestBody.prototype.depth = null;

        /**
         * Creates a new WatchTreeRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.WatchTreeRequestBody
         * @static
         * @param {fs.IWatchTreeRequestBody=} [properties] Properties to set
         * @returns {fs.WatchTreeRequestBody} WatchTreeRequestBody instance
         */
        WatchTreeRequestBody.create = function create(properties) {
            return new WatchTreeRequestBody(properties);
        };

        /**
         * Encodes the specified WatchTreeRequestBody message. Does not implicitly {@link fs.WatchTreeRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.WatchTreeRequestBody
         * @static
         * @param {fs.IWatchTreeRequestBody} message WatchTreeRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WatchTreeRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.depth != null && Object.hasOwnProperty.call(message, "depth"))
                $root.common.UInt32Value.encode(message.depth, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified WatchTreeRequestBody message, length delimited. Does not implicitly {@link fs.WatchTreeRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.WatchTreeRequestBody
         * @static
         * @param {fs.IWatchTreeRequestBody} message WatchTreeRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WatchTreeRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a WatchTreeRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.WatchTreeRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.WatchTreeRequestBody} WatchTreeRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WatchTreeRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.WatchTreeRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.depth = $root.common.UInt32Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a WatchTreeRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.WatchTreeRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.WatchTreeRequestBody} WatchTreeRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WatchTreeRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a WatchTreeRequestBody message.
         * @function verify
         * @memberof fs.WatchTreeRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        WatchTreeRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.depth != null && Object.hasOwnProperty.call(message, "depth")) {
                var error = $root.common.UInt32Value.verify(message.depth, long + 1);
                if (error)
                    return "depth." + error;
            }
            return null;
        };

        /**
         * Creates a WatchTreeRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.WatchTreeRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.WatchTreeRequestBody} WatchTreeRequestBody
         */
        WatchTreeRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.WatchTreeRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.WatchTreeRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.WatchTreeRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.depth != null) {
                if (!$util.isObject(object.depth))
                    throw TypeError(".fs.WatchTreeRequestBody.depth: object expected");
                message.depth = $root.common.UInt32Value.fromObject(object.depth, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a WatchTreeRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.WatchTreeRequestBody
         * @static
         * @param {fs.WatchTreeRequestBody} message WatchTreeRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        WatchTreeRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.depth = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.depth != null && Object.hasOwnProperty.call(message, "depth"))
                object.depth = $root.common.UInt32Value.toObject(message.depth, options, q + 1);
            return object;
        };

        /**
         * Converts this WatchTreeRequestBody to JSON.
         * @function toJSON
         * @memberof fs.WatchTreeRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        WatchTreeRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for WatchTreeRequestBody
         * @function getTypeUrl
         * @memberof fs.WatchTreeRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        WatchTreeRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.WatchTreeRequestBody";
        };

        return WatchTreeRequestBody;
    })();

    fs.ListFolderReplyBody = (function() {

        /**
         * Properties of a ListFolderReplyBody.
         * @memberof fs
         * @interface IListFolderReplyBody
         * @property {Array.<fs.IListingEntryMsg>|null} [entries] ListFolderReplyBody entries
         */

        /**
         * Constructs a new ListFolderReplyBody.
         * @memberof fs
         * @classdesc Represents a ListFolderReplyBody.
         * @implements IListFolderReplyBody
         * @constructor
         * @param {fs.IListFolderReplyBody=} [properties] Properties to set
         */
        function ListFolderReplyBody(properties) {
            this.entries = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ListFolderReplyBody entries.
         * @member {Array.<fs.IListingEntryMsg>} entries
         * @memberof fs.ListFolderReplyBody
         * @instance
         */
        ListFolderReplyBody.prototype.entries = $util.emptyArray;

        /**
         * Creates a new ListFolderReplyBody instance using the specified properties.
         * @function create
         * @memberof fs.ListFolderReplyBody
         * @static
         * @param {fs.IListFolderReplyBody=} [properties] Properties to set
         * @returns {fs.ListFolderReplyBody} ListFolderReplyBody instance
         */
        ListFolderReplyBody.create = function create(properties) {
            return new ListFolderReplyBody(properties);
        };

        /**
         * Encodes the specified ListFolderReplyBody message. Does not implicitly {@link fs.ListFolderReplyBody.verify|verify} messages.
         * @function encode
         * @memberof fs.ListFolderReplyBody
         * @static
         * @param {fs.IListFolderReplyBody} message ListFolderReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ListFolderReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.entries != null && message.entries.length)
                for (var i = 0; i < message.entries.length; ++i)
                    $root.fs.ListingEntryMsg.encode(message.entries[i], writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified ListFolderReplyBody message, length delimited. Does not implicitly {@link fs.ListFolderReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.ListFolderReplyBody
         * @static
         * @param {fs.IListFolderReplyBody} message ListFolderReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ListFolderReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a ListFolderReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.ListFolderReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.ListFolderReplyBody} ListFolderReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ListFolderReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.ListFolderReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.entries && message.entries.length))
                            message.entries = [];
                        message.entries.push($root.fs.ListingEntryMsg.decode(reader, reader.uint32(), undefined, long + 1));
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a ListFolderReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.ListFolderReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.ListFolderReplyBody} ListFolderReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ListFolderReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a ListFolderReplyBody message.
         * @function verify
         * @memberof fs.ListFolderReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ListFolderReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.entries != null && Object.hasOwnProperty.call(message, "entries")) {
                if (!Array.isArray(message.entries))
                    return "entries: array expected";
                for (var i = 0; i < message.entries.length; ++i) {
                    var error = $root.fs.ListingEntryMsg.verify(message.entries[i], long + 1);
                    if (error)
                        return "entries." + error;
                }
            }
            return null;
        };

        /**
         * Creates a ListFolderReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.ListFolderReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.ListFolderReplyBody} ListFolderReplyBody
         */
        ListFolderReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.ListFolderReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.ListFolderReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.ListFolderReplyBody();
            if (object.entries) {
                if (!Array.isArray(object.entries))
                    throw TypeError(".fs.ListFolderReplyBody.entries: array expected");
                message.entries = [];
                for (var i = 0; i < object.entries.length; ++i) {
                    if (!$util.isObject(object.entries[i]))
                        throw TypeError(".fs.ListFolderReplyBody.entries: object expected");
                    message.entries[i] = $root.fs.ListingEntryMsg.fromObject(object.entries[i], long + 1);
                }
            }
            return message;
        };

        /**
         * Creates a plain object from a ListFolderReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.ListFolderReplyBody
         * @static
         * @param {fs.ListFolderReplyBody} message ListFolderReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ListFolderReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.entries = [];
            if (message.entries && message.entries.length) {
                object.entries = [];
                for (var j = 0; j < message.entries.length; ++j)
                    object.entries[j] = $root.fs.ListingEntryMsg.toObject(message.entries[j], options, q + 1);
            }
            return object;
        };

        /**
         * Converts this ListFolderReplyBody to JSON.
         * @function toJSON
         * @memberof fs.ListFolderReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ListFolderReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ListFolderReplyBody
         * @function getTypeUrl
         * @memberof fs.ListFolderReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ListFolderReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.ListFolderReplyBody";
        };

        return ListFolderReplyBody;
    })();

    fs.ListingEntryMsg = (function() {

        /**
         * Properties of a ListingEntryMsg.
         * @memberof fs
         * @interface IListingEntryMsg
         * @property {string|null} [name] ListingEntryMsg name
         * @property {common.IBooleanValue|null} [isFile] ListingEntryMsg isFile
         * @property {common.IBooleanValue|null} [isFolder] ListingEntryMsg isFolder
         * @property {common.IBooleanValue|null} [isLink] ListingEntryMsg isLink
         */

        /**
         * Constructs a new ListingEntryMsg.
         * @memberof fs
         * @classdesc Represents a ListingEntryMsg.
         * @implements IListingEntryMsg
         * @constructor
         * @param {fs.IListingEntryMsg=} [properties] Properties to set
         */
        function ListingEntryMsg(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ListingEntryMsg name.
         * @member {string} name
         * @memberof fs.ListingEntryMsg
         * @instance
         */
        ListingEntryMsg.prototype.name = "";

        /**
         * ListingEntryMsg isFile.
         * @member {common.IBooleanValue|null|undefined} isFile
         * @memberof fs.ListingEntryMsg
         * @instance
         */
        ListingEntryMsg.prototype.isFile = null;

        /**
         * ListingEntryMsg isFolder.
         * @member {common.IBooleanValue|null|undefined} isFolder
         * @memberof fs.ListingEntryMsg
         * @instance
         */
        ListingEntryMsg.prototype.isFolder = null;

        /**
         * ListingEntryMsg isLink.
         * @member {common.IBooleanValue|null|undefined} isLink
         * @memberof fs.ListingEntryMsg
         * @instance
         */
        ListingEntryMsg.prototype.isLink = null;

        /**
         * Creates a new ListingEntryMsg instance using the specified properties.
         * @function create
         * @memberof fs.ListingEntryMsg
         * @static
         * @param {fs.IListingEntryMsg=} [properties] Properties to set
         * @returns {fs.ListingEntryMsg} ListingEntryMsg instance
         */
        ListingEntryMsg.create = function create(properties) {
            return new ListingEntryMsg(properties);
        };

        /**
         * Encodes the specified ListingEntryMsg message. Does not implicitly {@link fs.ListingEntryMsg.verify|verify} messages.
         * @function encode
         * @memberof fs.ListingEntryMsg
         * @static
         * @param {fs.IListingEntryMsg} message ListingEntryMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ListingEntryMsg.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                $root.common.BooleanValue.encode(message.isFile, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                $root.common.BooleanValue.encode(message.isFolder, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink"))
                $root.common.BooleanValue.encode(message.isLink, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified ListingEntryMsg message, length delimited. Does not implicitly {@link fs.ListingEntryMsg.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.ListingEntryMsg
         * @static
         * @param {fs.IListingEntryMsg} message ListingEntryMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ListingEntryMsg.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a ListingEntryMsg message from the specified reader or buffer.
         * @function decode
         * @memberof fs.ListingEntryMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.ListingEntryMsg} ListingEntryMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ListingEntryMsg.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.ListingEntryMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.name = reader.string();
                        break;
                    }
                case 2: {
                        message.isFile = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.isFolder = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.isLink = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a ListingEntryMsg message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.ListingEntryMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.ListingEntryMsg} ListingEntryMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ListingEntryMsg.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a ListingEntryMsg message.
         * @function verify
         * @memberof fs.ListingEntryMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ListingEntryMsg.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile")) {
                var error = $root.common.BooleanValue.verify(message.isFile, long + 1);
                if (error)
                    return "isFile." + error;
            }
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder")) {
                var error = $root.common.BooleanValue.verify(message.isFolder, long + 1);
                if (error)
                    return "isFolder." + error;
            }
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink")) {
                var error = $root.common.BooleanValue.verify(message.isLink, long + 1);
                if (error)
                    return "isLink." + error;
            }
            return null;
        };

        /**
         * Creates a ListingEntryMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.ListingEntryMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.ListingEntryMsg} ListingEntryMsg
         */
        ListingEntryMsg.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.ListingEntryMsg)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.ListingEntryMsg: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.ListingEntryMsg();
            if (object.name != null)
                message.name = String(object.name);
            if (object.isFile != null) {
                if (!$util.isObject(object.isFile))
                    throw TypeError(".fs.ListingEntryMsg.isFile: object expected");
                message.isFile = $root.common.BooleanValue.fromObject(object.isFile, long + 1);
            }
            if (object.isFolder != null) {
                if (!$util.isObject(object.isFolder))
                    throw TypeError(".fs.ListingEntryMsg.isFolder: object expected");
                message.isFolder = $root.common.BooleanValue.fromObject(object.isFolder, long + 1);
            }
            if (object.isLink != null) {
                if (!$util.isObject(object.isLink))
                    throw TypeError(".fs.ListingEntryMsg.isLink: object expected");
                message.isLink = $root.common.BooleanValue.fromObject(object.isLink, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a ListingEntryMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.ListingEntryMsg
         * @static
         * @param {fs.ListingEntryMsg} message ListingEntryMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ListingEntryMsg.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.name = "";
                object.isFile = null;
                object.isFolder = null;
                object.isLink = null;
            }
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                object.name = message.name;
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                object.isFile = $root.common.BooleanValue.toObject(message.isFile, options, q + 1);
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                object.isFolder = $root.common.BooleanValue.toObject(message.isFolder, options, q + 1);
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink"))
                object.isLink = $root.common.BooleanValue.toObject(message.isLink, options, q + 1);
            return object;
        };

        /**
         * Converts this ListingEntryMsg to JSON.
         * @function toJSON
         * @memberof fs.ListingEntryMsg
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ListingEntryMsg.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ListingEntryMsg
         * @function getTypeUrl
         * @memberof fs.ListingEntryMsg
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ListingEntryMsg.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.ListingEntryMsg";
        };

        return ListingEntryMsg;
    })();

    fs.ReadBytesRequestBody = (function() {

        /**
         * Properties of a ReadBytesRequestBody.
         * @memberof fs
         * @interface IReadBytesRequestBody
         * @property {string|null} [path] ReadBytesRequestBody path
         * @property {common.IUInt64Value|null} [start] ReadBytesRequestBody start
         * @property {common.IUInt64Value|null} [end] ReadBytesRequestBody end
         */

        /**
         * Constructs a new ReadBytesRequestBody.
         * @memberof fs
         * @classdesc Represents a ReadBytesRequestBody.
         * @implements IReadBytesRequestBody
         * @constructor
         * @param {fs.IReadBytesRequestBody=} [properties] Properties to set
         */
        function ReadBytesRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ReadBytesRequestBody path.
         * @member {string} path
         * @memberof fs.ReadBytesRequestBody
         * @instance
         */
        ReadBytesRequestBody.prototype.path = "";

        /**
         * ReadBytesRequestBody start.
         * @member {common.IUInt64Value|null|undefined} start
         * @memberof fs.ReadBytesRequestBody
         * @instance
         */
        ReadBytesRequestBody.prototype.start = null;

        /**
         * ReadBytesRequestBody end.
         * @member {common.IUInt64Value|null|undefined} end
         * @memberof fs.ReadBytesRequestBody
         * @instance
         */
        ReadBytesRequestBody.prototype.end = null;

        /**
         * Creates a new ReadBytesRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.ReadBytesRequestBody
         * @static
         * @param {fs.IReadBytesRequestBody=} [properties] Properties to set
         * @returns {fs.ReadBytesRequestBody} ReadBytesRequestBody instance
         */
        ReadBytesRequestBody.create = function create(properties) {
            return new ReadBytesRequestBody(properties);
        };

        /**
         * Encodes the specified ReadBytesRequestBody message. Does not implicitly {@link fs.ReadBytesRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.ReadBytesRequestBody
         * @static
         * @param {fs.IReadBytesRequestBody} message ReadBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ReadBytesRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                $root.common.UInt64Value.encode(message.start, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                $root.common.UInt64Value.encode(message.end, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified ReadBytesRequestBody message, length delimited. Does not implicitly {@link fs.ReadBytesRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.ReadBytesRequestBody
         * @static
         * @param {fs.IReadBytesRequestBody} message ReadBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ReadBytesRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a ReadBytesRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.ReadBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.ReadBytesRequestBody} ReadBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ReadBytesRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.ReadBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.start = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.end = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a ReadBytesRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.ReadBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.ReadBytesRequestBody} ReadBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ReadBytesRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a ReadBytesRequestBody message.
         * @function verify
         * @memberof fs.ReadBytesRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ReadBytesRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.start != null && Object.hasOwnProperty.call(message, "start")) {
                var error = $root.common.UInt64Value.verify(message.start, long + 1);
                if (error)
                    return "start." + error;
            }
            if (message.end != null && Object.hasOwnProperty.call(message, "end")) {
                var error = $root.common.UInt64Value.verify(message.end, long + 1);
                if (error)
                    return "end." + error;
            }
            return null;
        };

        /**
         * Creates a ReadBytesRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.ReadBytesRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.ReadBytesRequestBody} ReadBytesRequestBody
         */
        ReadBytesRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.ReadBytesRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.ReadBytesRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.ReadBytesRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.start != null) {
                if (!$util.isObject(object.start))
                    throw TypeError(".fs.ReadBytesRequestBody.start: object expected");
                message.start = $root.common.UInt64Value.fromObject(object.start, long + 1);
            }
            if (object.end != null) {
                if (!$util.isObject(object.end))
                    throw TypeError(".fs.ReadBytesRequestBody.end: object expected");
                message.end = $root.common.UInt64Value.fromObject(object.end, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a ReadBytesRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.ReadBytesRequestBody
         * @static
         * @param {fs.ReadBytesRequestBody} message ReadBytesRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ReadBytesRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.start = null;
                object.end = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                object.start = $root.common.UInt64Value.toObject(message.start, options, q + 1);
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                object.end = $root.common.UInt64Value.toObject(message.end, options, q + 1);
            return object;
        };

        /**
         * Converts this ReadBytesRequestBody to JSON.
         * @function toJSON
         * @memberof fs.ReadBytesRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ReadBytesRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ReadBytesRequestBody
         * @function getTypeUrl
         * @memberof fs.ReadBytesRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ReadBytesRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.ReadBytesRequestBody";
        };

        return ReadBytesRequestBody;
    })();

    fs.SelectRequestBody = (function() {

        /**
         * Properties of a SelectRequestBody.
         * @memberof fs
         * @interface ISelectRequestBody
         * @property {string|null} [path] SelectRequestBody path
         * @property {fs.SelectRequestBody.ISelectCriteria|null} [criteria] SelectRequestBody criteria
         */

        /**
         * Constructs a new SelectRequestBody.
         * @memberof fs
         * @classdesc Represents a SelectRequestBody.
         * @implements ISelectRequestBody
         * @constructor
         * @param {fs.ISelectRequestBody=} [properties] Properties to set
         */
        function SelectRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * SelectRequestBody path.
         * @member {string} path
         * @memberof fs.SelectRequestBody
         * @instance
         */
        SelectRequestBody.prototype.path = "";

        /**
         * SelectRequestBody criteria.
         * @member {fs.SelectRequestBody.ISelectCriteria|null|undefined} criteria
         * @memberof fs.SelectRequestBody
         * @instance
         */
        SelectRequestBody.prototype.criteria = null;

        /**
         * Creates a new SelectRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.SelectRequestBody
         * @static
         * @param {fs.ISelectRequestBody=} [properties] Properties to set
         * @returns {fs.SelectRequestBody} SelectRequestBody instance
         */
        SelectRequestBody.create = function create(properties) {
            return new SelectRequestBody(properties);
        };

        /**
         * Encodes the specified SelectRequestBody message. Does not implicitly {@link fs.SelectRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.SelectRequestBody
         * @static
         * @param {fs.ISelectRequestBody} message SelectRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SelectRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.criteria != null && Object.hasOwnProperty.call(message, "criteria"))
                $root.fs.SelectRequestBody.SelectCriteria.encode(message.criteria, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified SelectRequestBody message, length delimited. Does not implicitly {@link fs.SelectRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.SelectRequestBody
         * @static
         * @param {fs.ISelectRequestBody} message SelectRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SelectRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a SelectRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.SelectRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.SelectRequestBody} SelectRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SelectRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SelectRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.criteria = $root.fs.SelectRequestBody.SelectCriteria.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a SelectRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.SelectRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.SelectRequestBody} SelectRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SelectRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a SelectRequestBody message.
         * @function verify
         * @memberof fs.SelectRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        SelectRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.criteria != null && Object.hasOwnProperty.call(message, "criteria")) {
                var error = $root.fs.SelectRequestBody.SelectCriteria.verify(message.criteria, long + 1);
                if (error)
                    return "criteria." + error;
            }
            return null;
        };

        /**
         * Creates a SelectRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.SelectRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.SelectRequestBody} SelectRequestBody
         */
        SelectRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.SelectRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.SelectRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.SelectRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.criteria != null) {
                if (!$util.isObject(object.criteria))
                    throw TypeError(".fs.SelectRequestBody.criteria: object expected");
                message.criteria = $root.fs.SelectRequestBody.SelectCriteria.fromObject(object.criteria, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a SelectRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.SelectRequestBody
         * @static
         * @param {fs.SelectRequestBody} message SelectRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        SelectRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.criteria = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.criteria != null && Object.hasOwnProperty.call(message, "criteria"))
                object.criteria = $root.fs.SelectRequestBody.SelectCriteria.toObject(message.criteria, options, q + 1);
            return object;
        };

        /**
         * Converts this SelectRequestBody to JSON.
         * @function toJSON
         * @memberof fs.SelectRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        SelectRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for SelectRequestBody
         * @function getTypeUrl
         * @memberof fs.SelectRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        SelectRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.SelectRequestBody";
        };

        SelectRequestBody.SelectCriteria = (function() {

            /**
             * Properties of a SelectCriteria.
             * @memberof fs.SelectRequestBody
             * @interface ISelectCriteria
             * @property {common.IStringValue|null} [exactName] SelectCriteria exactName
             * @property {common.IStringValue|null} [pattern] SelectCriteria pattern
             * @property {common.IStringValue|null} [regexp] SelectCriteria regexp
             * @property {common.IUInt32Value|null} [depth] SelectCriteria depth
             * @property {Array.<string>|null} [type] SelectCriteria type
             * @property {string|null} [action] SelectCriteria action
             */

            /**
             * Constructs a new SelectCriteria.
             * @memberof fs.SelectRequestBody
             * @classdesc Represents a SelectCriteria.
             * @implements ISelectCriteria
             * @constructor
             * @param {fs.SelectRequestBody.ISelectCriteria=} [properties] Properties to set
             */
            function SelectCriteria(properties) {
                this.type = [];
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * SelectCriteria exactName.
             * @member {common.IStringValue|null|undefined} exactName
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @instance
             */
            SelectCriteria.prototype.exactName = null;

            /**
             * SelectCriteria pattern.
             * @member {common.IStringValue|null|undefined} pattern
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @instance
             */
            SelectCriteria.prototype.pattern = null;

            /**
             * SelectCriteria regexp.
             * @member {common.IStringValue|null|undefined} regexp
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @instance
             */
            SelectCriteria.prototype.regexp = null;

            /**
             * SelectCriteria depth.
             * @member {common.IUInt32Value|null|undefined} depth
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @instance
             */
            SelectCriteria.prototype.depth = null;

            /**
             * SelectCriteria type.
             * @member {Array.<string>} type
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @instance
             */
            SelectCriteria.prototype.type = $util.emptyArray;

            /**
             * SelectCriteria action.
             * @member {string} action
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @instance
             */
            SelectCriteria.prototype.action = "";

            /**
             * Creates a new SelectCriteria instance using the specified properties.
             * @function create
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @static
             * @param {fs.SelectRequestBody.ISelectCriteria=} [properties] Properties to set
             * @returns {fs.SelectRequestBody.SelectCriteria} SelectCriteria instance
             */
            SelectCriteria.create = function create(properties) {
                return new SelectCriteria(properties);
            };

            /**
             * Encodes the specified SelectCriteria message. Does not implicitly {@link fs.SelectRequestBody.SelectCriteria.verify|verify} messages.
             * @function encode
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @static
             * @param {fs.SelectRequestBody.ISelectCriteria} message SelectCriteria message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            SelectCriteria.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.exactName != null && Object.hasOwnProperty.call(message, "exactName"))
                    $root.common.StringValue.encode(message.exactName, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
                if (message.pattern != null && Object.hasOwnProperty.call(message, "pattern"))
                    $root.common.StringValue.encode(message.pattern, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
                if (message.regexp != null && Object.hasOwnProperty.call(message, "regexp"))
                    $root.common.StringValue.encode(message.regexp, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
                if (message.depth != null && Object.hasOwnProperty.call(message, "depth"))
                    $root.common.UInt32Value.encode(message.depth, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
                if (message.type != null && message.type.length)
                    for (var i = 0; i < message.type.length; ++i)
                        writer.uint32(/* id 5, wireType 2 =*/42).string(message.type[i]);
                if (message.action != null && Object.hasOwnProperty.call(message, "action"))
                    writer.uint32(/* id 6, wireType 2 =*/50).string(message.action);
                return writer;
            };

            /**
             * Encodes the specified SelectCriteria message, length delimited. Does not implicitly {@link fs.SelectRequestBody.SelectCriteria.verify|verify} messages.
             * @function encodeDelimited
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @static
             * @param {fs.SelectRequestBody.ISelectCriteria} message SelectCriteria message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            SelectCriteria.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes a SelectCriteria message from the specified reader or buffer.
             * @function decode
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {fs.SelectRequestBody.SelectCriteria} SelectCriteria
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            SelectCriteria.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SelectRequestBody.SelectCriteria();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.exactName = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 2: {
                            message.pattern = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 3: {
                            message.regexp = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 4: {
                            message.depth = $root.common.UInt32Value.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 5: {
                            if (!(message.type && message.type.length))
                                message.type = [];
                            message.type.push(reader.string());
                            break;
                        }
                    case 6: {
                            message.action = reader.string();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a SelectCriteria message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {fs.SelectRequestBody.SelectCriteria} SelectCriteria
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            SelectCriteria.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a SelectCriteria message.
             * @function verify
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            SelectCriteria.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.exactName != null && Object.hasOwnProperty.call(message, "exactName")) {
                    var error = $root.common.StringValue.verify(message.exactName, long + 1);
                    if (error)
                        return "exactName." + error;
                }
                if (message.pattern != null && Object.hasOwnProperty.call(message, "pattern")) {
                    var error = $root.common.StringValue.verify(message.pattern, long + 1);
                    if (error)
                        return "pattern." + error;
                }
                if (message.regexp != null && Object.hasOwnProperty.call(message, "regexp")) {
                    var error = $root.common.StringValue.verify(message.regexp, long + 1);
                    if (error)
                        return "regexp." + error;
                }
                if (message.depth != null && Object.hasOwnProperty.call(message, "depth")) {
                    var error = $root.common.UInt32Value.verify(message.depth, long + 1);
                    if (error)
                        return "depth." + error;
                }
                if (message.type != null && Object.hasOwnProperty.call(message, "type")) {
                    if (!Array.isArray(message.type))
                        return "type: array expected";
                    for (var i = 0; i < message.type.length; ++i)
                        if (!$util.isString(message.type[i]))
                            return "type: string[] expected";
                }
                if (message.action != null && Object.hasOwnProperty.call(message, "action"))
                    if (!$util.isString(message.action))
                        return "action: string expected";
                return null;
            };

            /**
             * Creates a SelectCriteria message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {fs.SelectRequestBody.SelectCriteria} SelectCriteria
             */
            SelectCriteria.fromObject = function fromObject(object, long) {
                if (object instanceof $root.fs.SelectRequestBody.SelectCriteria)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".fs.SelectRequestBody.SelectCriteria: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.fs.SelectRequestBody.SelectCriteria();
                if (object.exactName != null) {
                    if (!$util.isObject(object.exactName))
                        throw TypeError(".fs.SelectRequestBody.SelectCriteria.exactName: object expected");
                    message.exactName = $root.common.StringValue.fromObject(object.exactName, long + 1);
                }
                if (object.pattern != null) {
                    if (!$util.isObject(object.pattern))
                        throw TypeError(".fs.SelectRequestBody.SelectCriteria.pattern: object expected");
                    message.pattern = $root.common.StringValue.fromObject(object.pattern, long + 1);
                }
                if (object.regexp != null) {
                    if (!$util.isObject(object.regexp))
                        throw TypeError(".fs.SelectRequestBody.SelectCriteria.regexp: object expected");
                    message.regexp = $root.common.StringValue.fromObject(object.regexp, long + 1);
                }
                if (object.depth != null) {
                    if (!$util.isObject(object.depth))
                        throw TypeError(".fs.SelectRequestBody.SelectCriteria.depth: object expected");
                    message.depth = $root.common.UInt32Value.fromObject(object.depth, long + 1);
                }
                if (object.type) {
                    if (!Array.isArray(object.type))
                        throw TypeError(".fs.SelectRequestBody.SelectCriteria.type: array expected");
                    message.type = [];
                    for (var i = 0; i < object.type.length; ++i)
                        message.type[i] = String(object.type[i]);
                }
                if (object.action != null)
                    message.action = String(object.action);
                return message;
            };

            /**
             * Creates a plain object from a SelectCriteria message. Also converts values to other types if specified.
             * @function toObject
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @static
             * @param {fs.SelectRequestBody.SelectCriteria} message SelectCriteria
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            SelectCriteria.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.arrays || options.defaults)
                    object.type = [];
                if (options.defaults) {
                    object.exactName = null;
                    object.pattern = null;
                    object.regexp = null;
                    object.depth = null;
                    object.action = "";
                }
                if (message.exactName != null && Object.hasOwnProperty.call(message, "exactName"))
                    object.exactName = $root.common.StringValue.toObject(message.exactName, options, q + 1);
                if (message.pattern != null && Object.hasOwnProperty.call(message, "pattern"))
                    object.pattern = $root.common.StringValue.toObject(message.pattern, options, q + 1);
                if (message.regexp != null && Object.hasOwnProperty.call(message, "regexp"))
                    object.regexp = $root.common.StringValue.toObject(message.regexp, options, q + 1);
                if (message.depth != null && Object.hasOwnProperty.call(message, "depth"))
                    object.depth = $root.common.UInt32Value.toObject(message.depth, options, q + 1);
                if (message.type && message.type.length) {
                    object.type = [];
                    for (var j = 0; j < message.type.length; ++j)
                        object.type[j] = message.type[j];
                }
                if (message.action != null && Object.hasOwnProperty.call(message, "action"))
                    object.action = message.action;
                return object;
            };

            /**
             * Converts this SelectCriteria to JSON.
             * @function toJSON
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            SelectCriteria.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for SelectCriteria
             * @function getTypeUrl
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            SelectCriteria.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/fs.SelectRequestBody.SelectCriteria";
            };

            return SelectCriteria;
        })();

        return SelectRequestBody;
    })();

    fs.FSCGetRequestBody = (function() {

        /**
         * Properties of a FSCGetRequestBody.
         * @memberof fs
         * @interface IFSCGetRequestBody
         * @property {string|null} [name] FSCGetRequestBody name
         */

        /**
         * Constructs a new FSCGetRequestBody.
         * @memberof fs
         * @classdesc Represents a FSCGetRequestBody.
         * @implements IFSCGetRequestBody
         * @constructor
         * @param {fs.IFSCGetRequestBody=} [properties] Properties to set
         */
        function FSCGetRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FSCGetRequestBody name.
         * @member {string} name
         * @memberof fs.FSCGetRequestBody
         * @instance
         */
        FSCGetRequestBody.prototype.name = "";

        /**
         * Creates a new FSCGetRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.FSCGetRequestBody
         * @static
         * @param {fs.IFSCGetRequestBody=} [properties] Properties to set
         * @returns {fs.FSCGetRequestBody} FSCGetRequestBody instance
         */
        FSCGetRequestBody.create = function create(properties) {
            return new FSCGetRequestBody(properties);
        };

        /**
         * Encodes the specified FSCGetRequestBody message. Does not implicitly {@link fs.FSCGetRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.FSCGetRequestBody
         * @static
         * @param {fs.IFSCGetRequestBody} message FSCGetRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSCGetRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
            return writer;
        };

        /**
         * Encodes the specified FSCGetRequestBody message, length delimited. Does not implicitly {@link fs.FSCGetRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FSCGetRequestBody
         * @static
         * @param {fs.IFSCGetRequestBody} message FSCGetRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSCGetRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FSCGetRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FSCGetRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FSCGetRequestBody} FSCGetRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSCGetRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSCGetRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.name = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FSCGetRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FSCGetRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FSCGetRequestBody} FSCGetRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSCGetRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FSCGetRequestBody message.
         * @function verify
         * @memberof fs.FSCGetRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSCGetRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            return null;
        };

        /**
         * Creates a FSCGetRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSCGetRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSCGetRequestBody} FSCGetRequestBody
         */
        FSCGetRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FSCGetRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FSCGetRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FSCGetRequestBody();
            if (object.name != null)
                message.name = String(object.name);
            return message;
        };

        /**
         * Creates a plain object from a FSCGetRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSCGetRequestBody
         * @static
         * @param {fs.FSCGetRequestBody} message FSCGetRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSCGetRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.name = "";
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                object.name = message.name;
            return object;
        };

        /**
         * Converts this FSCGetRequestBody to JSON.
         * @function toJSON
         * @memberof fs.FSCGetRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FSCGetRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FSCGetRequestBody
         * @function getTypeUrl
         * @memberof fs.FSCGetRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FSCGetRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FSCGetRequestBody";
        };

        return FSCGetRequestBody;
    })();

    fs.FSCGetReplyBody = (function() {

        /**
         * Properties of a FSCGetReplyBody.
         * @memberof fs
         * @interface IFSCGetReplyBody
         * @property {fs.IFSItem|null} [item] FSCGetReplyBody item
         */

        /**
         * Constructs a new FSCGetReplyBody.
         * @memberof fs
         * @classdesc Represents a FSCGetReplyBody.
         * @implements IFSCGetReplyBody
         * @constructor
         * @param {fs.IFSCGetReplyBody=} [properties] Properties to set
         */
        function FSCGetReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FSCGetReplyBody item.
         * @member {fs.IFSItem|null|undefined} item
         * @memberof fs.FSCGetReplyBody
         * @instance
         */
        FSCGetReplyBody.prototype.item = null;

        /**
         * Creates a new FSCGetReplyBody instance using the specified properties.
         * @function create
         * @memberof fs.FSCGetReplyBody
         * @static
         * @param {fs.IFSCGetReplyBody=} [properties] Properties to set
         * @returns {fs.FSCGetReplyBody} FSCGetReplyBody instance
         */
        FSCGetReplyBody.create = function create(properties) {
            return new FSCGetReplyBody(properties);
        };

        /**
         * Encodes the specified FSCGetReplyBody message. Does not implicitly {@link fs.FSCGetReplyBody.verify|verify} messages.
         * @function encode
         * @memberof fs.FSCGetReplyBody
         * @static
         * @param {fs.IFSCGetReplyBody} message FSCGetReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSCGetReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                $root.fs.FSItem.encode(message.item, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FSCGetReplyBody message, length delimited. Does not implicitly {@link fs.FSCGetReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FSCGetReplyBody
         * @static
         * @param {fs.IFSCGetReplyBody} message FSCGetReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSCGetReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FSCGetReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FSCGetReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FSCGetReplyBody} FSCGetReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSCGetReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSCGetReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.item = $root.fs.FSItem.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FSCGetReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FSCGetReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FSCGetReplyBody} FSCGetReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSCGetReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FSCGetReplyBody message.
         * @function verify
         * @memberof fs.FSCGetReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSCGetReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.item != null && Object.hasOwnProperty.call(message, "item")) {
                var error = $root.fs.FSItem.verify(message.item, long + 1);
                if (error)
                    return "item." + error;
            }
            return null;
        };

        /**
         * Creates a FSCGetReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSCGetReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSCGetReplyBody} FSCGetReplyBody
         */
        FSCGetReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FSCGetReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FSCGetReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FSCGetReplyBody();
            if (object.item != null) {
                if (!$util.isObject(object.item))
                    throw TypeError(".fs.FSCGetReplyBody.item: object expected");
                message.item = $root.fs.FSItem.fromObject(object.item, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a FSCGetReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSCGetReplyBody
         * @static
         * @param {fs.FSCGetReplyBody} message FSCGetReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSCGetReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.item = null;
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                object.item = $root.fs.FSItem.toObject(message.item, options, q + 1);
            return object;
        };

        /**
         * Converts this FSCGetReplyBody to JSON.
         * @function toJSON
         * @memberof fs.FSCGetReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FSCGetReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FSCGetReplyBody
         * @function getTypeUrl
         * @memberof fs.FSCGetReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FSCGetReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FSCGetReplyBody";
        };

        return FSCGetReplyBody;
    })();

    fs.FSItem = (function() {

        /**
         * Properties of a FSItem.
         * @memberof fs
         * @interface IFSItem
         * @property {common.IBooleanValue|null} [isFile] FSItem isFile
         * @property {common.IBooleanValue|null} [isFolder] FSItem isFolder
         * @property {common.IBooleanValue|null} [isLink] FSItem isLink
         * @property {common.IBooleanValue|null} [isCollection] FSItem isCollection
         * @property {fs.FSItem.IItem|null} [item] FSItem item
         * @property {fs.FSItem.ILocation|null} [location] FSItem location
         */

        /**
         * Constructs a new FSItem.
         * @memberof fs
         * @classdesc Represents a FSItem.
         * @implements IFSItem
         * @constructor
         * @param {fs.IFSItem=} [properties] Properties to set
         */
        function FSItem(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FSItem isFile.
         * @member {common.IBooleanValue|null|undefined} isFile
         * @memberof fs.FSItem
         * @instance
         */
        FSItem.prototype.isFile = null;

        /**
         * FSItem isFolder.
         * @member {common.IBooleanValue|null|undefined} isFolder
         * @memberof fs.FSItem
         * @instance
         */
        FSItem.prototype.isFolder = null;

        /**
         * FSItem isLink.
         * @member {common.IBooleanValue|null|undefined} isLink
         * @memberof fs.FSItem
         * @instance
         */
        FSItem.prototype.isLink = null;

        /**
         * FSItem isCollection.
         * @member {common.IBooleanValue|null|undefined} isCollection
         * @memberof fs.FSItem
         * @instance
         */
        FSItem.prototype.isCollection = null;

        /**
         * FSItem item.
         * @member {fs.FSItem.IItem|null|undefined} item
         * @memberof fs.FSItem
         * @instance
         */
        FSItem.prototype.item = null;

        /**
         * FSItem location.
         * @member {fs.FSItem.ILocation|null|undefined} location
         * @memberof fs.FSItem
         * @instance
         */
        FSItem.prototype.location = null;

        /**
         * Creates a new FSItem instance using the specified properties.
         * @function create
         * @memberof fs.FSItem
         * @static
         * @param {fs.IFSItem=} [properties] Properties to set
         * @returns {fs.FSItem} FSItem instance
         */
        FSItem.create = function create(properties) {
            return new FSItem(properties);
        };

        /**
         * Encodes the specified FSItem message. Does not implicitly {@link fs.FSItem.verify|verify} messages.
         * @function encode
         * @memberof fs.FSItem
         * @static
         * @param {fs.IFSItem} message FSItem message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSItem.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                $root.common.BooleanValue.encode(message.isFile, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                $root.common.BooleanValue.encode(message.isFolder, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink"))
                $root.common.BooleanValue.encode(message.isLink, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.isCollection != null && Object.hasOwnProperty.call(message, "isCollection"))
                $root.common.BooleanValue.encode(message.isCollection, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                $root.fs.FSItem.Item.encode(message.item, writer.uint32(/* id 5, wireType 2 =*/42).fork(), q + 1).ldelim();
            if (message.location != null && Object.hasOwnProperty.call(message, "location"))
                $root.fs.FSItem.Location.encode(message.location, writer.uint32(/* id 6, wireType 2 =*/50).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FSItem message, length delimited. Does not implicitly {@link fs.FSItem.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FSItem
         * @static
         * @param {fs.IFSItem} message FSItem message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSItem.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FSItem message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FSItem
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FSItem} FSItem
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSItem.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSItem();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.isFile = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.isFolder = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.isLink = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.isCollection = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 5: {
                        message.item = $root.fs.FSItem.Item.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 6: {
                        message.location = $root.fs.FSItem.Location.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FSItem message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FSItem
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FSItem} FSItem
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSItem.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FSItem message.
         * @function verify
         * @memberof fs.FSItem
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSItem.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile")) {
                var error = $root.common.BooleanValue.verify(message.isFile, long + 1);
                if (error)
                    return "isFile." + error;
            }
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder")) {
                var error = $root.common.BooleanValue.verify(message.isFolder, long + 1);
                if (error)
                    return "isFolder." + error;
            }
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink")) {
                var error = $root.common.BooleanValue.verify(message.isLink, long + 1);
                if (error)
                    return "isLink." + error;
            }
            if (message.isCollection != null && Object.hasOwnProperty.call(message, "isCollection")) {
                var error = $root.common.BooleanValue.verify(message.isCollection, long + 1);
                if (error)
                    return "isCollection." + error;
            }
            if (message.item != null && Object.hasOwnProperty.call(message, "item")) {
                var error = $root.fs.FSItem.Item.verify(message.item, long + 1);
                if (error)
                    return "item." + error;
            }
            if (message.location != null && Object.hasOwnProperty.call(message, "location")) {
                var error = $root.fs.FSItem.Location.verify(message.location, long + 1);
                if (error)
                    return "location." + error;
            }
            return null;
        };

        /**
         * Creates a FSItem message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSItem
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSItem} FSItem
         */
        FSItem.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FSItem)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FSItem: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FSItem();
            if (object.isFile != null) {
                if (!$util.isObject(object.isFile))
                    throw TypeError(".fs.FSItem.isFile: object expected");
                message.isFile = $root.common.BooleanValue.fromObject(object.isFile, long + 1);
            }
            if (object.isFolder != null) {
                if (!$util.isObject(object.isFolder))
                    throw TypeError(".fs.FSItem.isFolder: object expected");
                message.isFolder = $root.common.BooleanValue.fromObject(object.isFolder, long + 1);
            }
            if (object.isLink != null) {
                if (!$util.isObject(object.isLink))
                    throw TypeError(".fs.FSItem.isLink: object expected");
                message.isLink = $root.common.BooleanValue.fromObject(object.isLink, long + 1);
            }
            if (object.isCollection != null) {
                if (!$util.isObject(object.isCollection))
                    throw TypeError(".fs.FSItem.isCollection: object expected");
                message.isCollection = $root.common.BooleanValue.fromObject(object.isCollection, long + 1);
            }
            if (object.item != null) {
                if (!$util.isObject(object.item))
                    throw TypeError(".fs.FSItem.item: object expected");
                message.item = $root.fs.FSItem.Item.fromObject(object.item, long + 1);
            }
            if (object.location != null) {
                if (!$util.isObject(object.location))
                    throw TypeError(".fs.FSItem.location: object expected");
                message.location = $root.fs.FSItem.Location.fromObject(object.location, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a FSItem message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSItem
         * @static
         * @param {fs.FSItem} message FSItem
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSItem.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.isFile = null;
                object.isFolder = null;
                object.isLink = null;
                object.isCollection = null;
                object.item = null;
                object.location = null;
            }
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                object.isFile = $root.common.BooleanValue.toObject(message.isFile, options, q + 1);
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                object.isFolder = $root.common.BooleanValue.toObject(message.isFolder, options, q + 1);
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink"))
                object.isLink = $root.common.BooleanValue.toObject(message.isLink, options, q + 1);
            if (message.isCollection != null && Object.hasOwnProperty.call(message, "isCollection"))
                object.isCollection = $root.common.BooleanValue.toObject(message.isCollection, options, q + 1);
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                object.item = $root.fs.FSItem.Item.toObject(message.item, options, q + 1);
            if (message.location != null && Object.hasOwnProperty.call(message, "location"))
                object.location = $root.fs.FSItem.Location.toObject(message.location, options, q + 1);
            return object;
        };

        /**
         * Converts this FSItem to JSON.
         * @function toJSON
         * @memberof fs.FSItem
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FSItem.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FSItem
         * @function getTypeUrl
         * @memberof fs.FSItem
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FSItem.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FSItem";
        };

        FSItem.Location = (function() {

            /**
             * Properties of a Location.
             * @memberof fs.FSItem
             * @interface ILocation
             * @property {fs.IFS|null} [fs] Location fs
             * @property {string|null} [path] Location path
             * @property {string|null} [storageUse] Location storageUse
             * @property {string|null} [storageType] Location storageType
             */

            /**
             * Constructs a new Location.
             * @memberof fs.FSItem
             * @classdesc Represents a Location.
             * @implements ILocation
             * @constructor
             * @param {fs.FSItem.ILocation=} [properties] Properties to set
             */
            function Location(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * Location fs.
             * @member {fs.IFS|null|undefined} fs
             * @memberof fs.FSItem.Location
             * @instance
             */
            Location.prototype.fs = null;

            /**
             * Location path.
             * @member {string} path
             * @memberof fs.FSItem.Location
             * @instance
             */
            Location.prototype.path = "";

            /**
             * Location storageUse.
             * @member {string} storageUse
             * @memberof fs.FSItem.Location
             * @instance
             */
            Location.prototype.storageUse = "";

            /**
             * Location storageType.
             * @member {string} storageType
             * @memberof fs.FSItem.Location
             * @instance
             */
            Location.prototype.storageType = "";

            /**
             * Creates a new Location instance using the specified properties.
             * @function create
             * @memberof fs.FSItem.Location
             * @static
             * @param {fs.FSItem.ILocation=} [properties] Properties to set
             * @returns {fs.FSItem.Location} Location instance
             */
            Location.create = function create(properties) {
                return new Location(properties);
            };

            /**
             * Encodes the specified Location message. Does not implicitly {@link fs.FSItem.Location.verify|verify} messages.
             * @function encode
             * @memberof fs.FSItem.Location
             * @static
             * @param {fs.FSItem.ILocation} message Location message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Location.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.fs != null && Object.hasOwnProperty.call(message, "fs"))
                    $root.fs.FS.encode(message.fs, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
                if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.path);
                if (message.storageUse != null && Object.hasOwnProperty.call(message, "storageUse"))
                    writer.uint32(/* id 3, wireType 2 =*/26).string(message.storageUse);
                if (message.storageType != null && Object.hasOwnProperty.call(message, "storageType"))
                    writer.uint32(/* id 4, wireType 2 =*/34).string(message.storageType);
                return writer;
            };

            /**
             * Encodes the specified Location message, length delimited. Does not implicitly {@link fs.FSItem.Location.verify|verify} messages.
             * @function encodeDelimited
             * @memberof fs.FSItem.Location
             * @static
             * @param {fs.FSItem.ILocation} message Location message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Location.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes a Location message from the specified reader or buffer.
             * @function decode
             * @memberof fs.FSItem.Location
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {fs.FSItem.Location} Location
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Location.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSItem.Location();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.fs = $root.fs.FS.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 2: {
                            message.path = reader.string();
                            break;
                        }
                    case 3: {
                            message.storageUse = reader.string();
                            break;
                        }
                    case 4: {
                            message.storageType = reader.string();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a Location message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof fs.FSItem.Location
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {fs.FSItem.Location} Location
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Location.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a Location message.
             * @function verify
             * @memberof fs.FSItem.Location
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            Location.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.fs != null && Object.hasOwnProperty.call(message, "fs")) {
                    var error = $root.fs.FS.verify(message.fs, long + 1);
                    if (error)
                        return "fs." + error;
                }
                if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                    if (!$util.isString(message.path))
                        return "path: string expected";
                if (message.storageUse != null && Object.hasOwnProperty.call(message, "storageUse"))
                    if (!$util.isString(message.storageUse))
                        return "storageUse: string expected";
                if (message.storageType != null && Object.hasOwnProperty.call(message, "storageType"))
                    if (!$util.isString(message.storageType))
                        return "storageType: string expected";
                return null;
            };

            /**
             * Creates a Location message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof fs.FSItem.Location
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {fs.FSItem.Location} Location
             */
            Location.fromObject = function fromObject(object, long) {
                if (object instanceof $root.fs.FSItem.Location)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".fs.FSItem.Location: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.fs.FSItem.Location();
                if (object.fs != null) {
                    if (!$util.isObject(object.fs))
                        throw TypeError(".fs.FSItem.Location.fs: object expected");
                    message.fs = $root.fs.FS.fromObject(object.fs, long + 1);
                }
                if (object.path != null)
                    message.path = String(object.path);
                if (object.storageUse != null)
                    message.storageUse = String(object.storageUse);
                if (object.storageType != null)
                    message.storageType = String(object.storageType);
                return message;
            };

            /**
             * Creates a plain object from a Location message. Also converts values to other types if specified.
             * @function toObject
             * @memberof fs.FSItem.Location
             * @static
             * @param {fs.FSItem.Location} message Location
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            Location.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults) {
                    object.fs = null;
                    object.path = "";
                    object.storageUse = "";
                    object.storageType = "";
                }
                if (message.fs != null && Object.hasOwnProperty.call(message, "fs"))
                    object.fs = $root.fs.FS.toObject(message.fs, options, q + 1);
                if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                    object.path = message.path;
                if (message.storageUse != null && Object.hasOwnProperty.call(message, "storageUse"))
                    object.storageUse = message.storageUse;
                if (message.storageType != null && Object.hasOwnProperty.call(message, "storageType"))
                    object.storageType = message.storageType;
                return object;
            };

            /**
             * Converts this Location to JSON.
             * @function toJSON
             * @memberof fs.FSItem.Location
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            Location.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for Location
             * @function getTypeUrl
             * @memberof fs.FSItem.Location
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            Location.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/fs.FSItem.Location";
            };

            return Location;
        })();

        FSItem.Item = (function() {

            /**
             * Properties of an Item.
             * @memberof fs.FSItem
             * @interface IItem
             * @property {fs.IFS|null} [fs] Item fs
             * @property {file.IFile|null} [file] Item file
             * @property {common.IObjectReference|null} [collection] Item collection
             */

            /**
             * Constructs a new Item.
             * @memberof fs.FSItem
             * @classdesc Represents an Item.
             * @implements IItem
             * @constructor
             * @param {fs.FSItem.IItem=} [properties] Properties to set
             */
            function Item(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * Item fs.
             * @member {fs.IFS|null|undefined} fs
             * @memberof fs.FSItem.Item
             * @instance
             */
            Item.prototype.fs = null;

            /**
             * Item file.
             * @member {file.IFile|null|undefined} file
             * @memberof fs.FSItem.Item
             * @instance
             */
            Item.prototype.file = null;

            /**
             * Item collection.
             * @member {common.IObjectReference|null|undefined} collection
             * @memberof fs.FSItem.Item
             * @instance
             */
            Item.prototype.collection = null;

            /**
             * Creates a new Item instance using the specified properties.
             * @function create
             * @memberof fs.FSItem.Item
             * @static
             * @param {fs.FSItem.IItem=} [properties] Properties to set
             * @returns {fs.FSItem.Item} Item instance
             */
            Item.create = function create(properties) {
                return new Item(properties);
            };

            /**
             * Encodes the specified Item message. Does not implicitly {@link fs.FSItem.Item.verify|verify} messages.
             * @function encode
             * @memberof fs.FSItem.Item
             * @static
             * @param {fs.FSItem.IItem} message Item message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Item.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.fs != null && Object.hasOwnProperty.call(message, "fs"))
                    $root.fs.FS.encode(message.fs, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
                if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                    $root.file.File.encode(message.file, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
                if (message.collection != null && Object.hasOwnProperty.call(message, "collection"))
                    $root.common.ObjectReference.encode(message.collection, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
                return writer;
            };

            /**
             * Encodes the specified Item message, length delimited. Does not implicitly {@link fs.FSItem.Item.verify|verify} messages.
             * @function encodeDelimited
             * @memberof fs.FSItem.Item
             * @static
             * @param {fs.FSItem.IItem} message Item message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Item.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes an Item message from the specified reader or buffer.
             * @function decode
             * @memberof fs.FSItem.Item
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {fs.FSItem.Item} Item
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Item.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSItem.Item();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.fs = $root.fs.FS.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 2: {
                            message.file = $root.file.File.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 3: {
                            message.collection = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes an Item message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof fs.FSItem.Item
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {fs.FSItem.Item} Item
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Item.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies an Item message.
             * @function verify
             * @memberof fs.FSItem.Item
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            Item.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.fs != null && Object.hasOwnProperty.call(message, "fs")) {
                    var error = $root.fs.FS.verify(message.fs, long + 1);
                    if (error)
                        return "fs." + error;
                }
                if (message.file != null && Object.hasOwnProperty.call(message, "file")) {
                    var error = $root.file.File.verify(message.file, long + 1);
                    if (error)
                        return "file." + error;
                }
                if (message.collection != null && Object.hasOwnProperty.call(message, "collection")) {
                    var error = $root.common.ObjectReference.verify(message.collection, long + 1);
                    if (error)
                        return "collection." + error;
                }
                return null;
            };

            /**
             * Creates an Item message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof fs.FSItem.Item
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {fs.FSItem.Item} Item
             */
            Item.fromObject = function fromObject(object, long) {
                if (object instanceof $root.fs.FSItem.Item)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".fs.FSItem.Item: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.fs.FSItem.Item();
                if (object.fs != null) {
                    if (!$util.isObject(object.fs))
                        throw TypeError(".fs.FSItem.Item.fs: object expected");
                    message.fs = $root.fs.FS.fromObject(object.fs, long + 1);
                }
                if (object.file != null) {
                    if (!$util.isObject(object.file))
                        throw TypeError(".fs.FSItem.Item.file: object expected");
                    message.file = $root.file.File.fromObject(object.file, long + 1);
                }
                if (object.collection != null) {
                    if (!$util.isObject(object.collection))
                        throw TypeError(".fs.FSItem.Item.collection: object expected");
                    message.collection = $root.common.ObjectReference.fromObject(object.collection, long + 1);
                }
                return message;
            };

            /**
             * Creates a plain object from an Item message. Also converts values to other types if specified.
             * @function toObject
             * @memberof fs.FSItem.Item
             * @static
             * @param {fs.FSItem.Item} message Item
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            Item.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults) {
                    object.fs = null;
                    object.file = null;
                    object.collection = null;
                }
                if (message.fs != null && Object.hasOwnProperty.call(message, "fs"))
                    object.fs = $root.fs.FS.toObject(message.fs, options, q + 1);
                if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                    object.file = $root.file.File.toObject(message.file, options, q + 1);
                if (message.collection != null && Object.hasOwnProperty.call(message, "collection"))
                    object.collection = $root.common.ObjectReference.toObject(message.collection, options, q + 1);
                return object;
            };

            /**
             * Converts this Item to JSON.
             * @function toJSON
             * @memberof fs.FSItem.Item
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            Item.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for Item
             * @function getTypeUrl
             * @memberof fs.FSItem.Item
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            Item.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/fs.FSItem.Item";
            };

            return Item;
        })();

        return FSItem;
    })();

    fs.FSCGetAllReplyBody = (function() {

        /**
         * Properties of a FSCGetAllReplyBody.
         * @memberof fs
         * @interface IFSCGetAllReplyBody
         * @property {Array.<fs.INameAndItem>|null} [items] FSCGetAllReplyBody items
         */

        /**
         * Constructs a new FSCGetAllReplyBody.
         * @memberof fs
         * @classdesc Represents a FSCGetAllReplyBody.
         * @implements IFSCGetAllReplyBody
         * @constructor
         * @param {fs.IFSCGetAllReplyBody=} [properties] Properties to set
         */
        function FSCGetAllReplyBody(properties) {
            this.items = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FSCGetAllReplyBody items.
         * @member {Array.<fs.INameAndItem>} items
         * @memberof fs.FSCGetAllReplyBody
         * @instance
         */
        FSCGetAllReplyBody.prototype.items = $util.emptyArray;

        /**
         * Creates a new FSCGetAllReplyBody instance using the specified properties.
         * @function create
         * @memberof fs.FSCGetAllReplyBody
         * @static
         * @param {fs.IFSCGetAllReplyBody=} [properties] Properties to set
         * @returns {fs.FSCGetAllReplyBody} FSCGetAllReplyBody instance
         */
        FSCGetAllReplyBody.create = function create(properties) {
            return new FSCGetAllReplyBody(properties);
        };

        /**
         * Encodes the specified FSCGetAllReplyBody message. Does not implicitly {@link fs.FSCGetAllReplyBody.verify|verify} messages.
         * @function encode
         * @memberof fs.FSCGetAllReplyBody
         * @static
         * @param {fs.IFSCGetAllReplyBody} message FSCGetAllReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSCGetAllReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.items != null && message.items.length)
                for (var i = 0; i < message.items.length; ++i)
                    $root.fs.NameAndItem.encode(message.items[i], writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FSCGetAllReplyBody message, length delimited. Does not implicitly {@link fs.FSCGetAllReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FSCGetAllReplyBody
         * @static
         * @param {fs.IFSCGetAllReplyBody} message FSCGetAllReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSCGetAllReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FSCGetAllReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FSCGetAllReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FSCGetAllReplyBody} FSCGetAllReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSCGetAllReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSCGetAllReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.items && message.items.length))
                            message.items = [];
                        message.items.push($root.fs.NameAndItem.decode(reader, reader.uint32(), undefined, long + 1));
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FSCGetAllReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FSCGetAllReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FSCGetAllReplyBody} FSCGetAllReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSCGetAllReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FSCGetAllReplyBody message.
         * @function verify
         * @memberof fs.FSCGetAllReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSCGetAllReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.items != null && Object.hasOwnProperty.call(message, "items")) {
                if (!Array.isArray(message.items))
                    return "items: array expected";
                for (var i = 0; i < message.items.length; ++i) {
                    var error = $root.fs.NameAndItem.verify(message.items[i], long + 1);
                    if (error)
                        return "items." + error;
                }
            }
            return null;
        };

        /**
         * Creates a FSCGetAllReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSCGetAllReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSCGetAllReplyBody} FSCGetAllReplyBody
         */
        FSCGetAllReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FSCGetAllReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FSCGetAllReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FSCGetAllReplyBody();
            if (object.items) {
                if (!Array.isArray(object.items))
                    throw TypeError(".fs.FSCGetAllReplyBody.items: array expected");
                message.items = [];
                for (var i = 0; i < object.items.length; ++i) {
                    if (!$util.isObject(object.items[i]))
                        throw TypeError(".fs.FSCGetAllReplyBody.items: object expected");
                    message.items[i] = $root.fs.NameAndItem.fromObject(object.items[i], long + 1);
                }
            }
            return message;
        };

        /**
         * Creates a plain object from a FSCGetAllReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSCGetAllReplyBody
         * @static
         * @param {fs.FSCGetAllReplyBody} message FSCGetAllReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSCGetAllReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.items = [];
            if (message.items && message.items.length) {
                object.items = [];
                for (var j = 0; j < message.items.length; ++j)
                    object.items[j] = $root.fs.NameAndItem.toObject(message.items[j], options, q + 1);
            }
            return object;
        };

        /**
         * Converts this FSCGetAllReplyBody to JSON.
         * @function toJSON
         * @memberof fs.FSCGetAllReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FSCGetAllReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FSCGetAllReplyBody
         * @function getTypeUrl
         * @memberof fs.FSCGetAllReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FSCGetAllReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FSCGetAllReplyBody";
        };

        return FSCGetAllReplyBody;
    })();

    fs.NameAndItem = (function() {

        /**
         * Properties of a NameAndItem.
         * @memberof fs
         * @interface INameAndItem
         * @property {string|null} [name] NameAndItem name
         * @property {fs.IFSItem|null} [item] NameAndItem item
         */

        /**
         * Constructs a new NameAndItem.
         * @memberof fs
         * @classdesc Represents a NameAndItem.
         * @implements INameAndItem
         * @constructor
         * @param {fs.INameAndItem=} [properties] Properties to set
         */
        function NameAndItem(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * NameAndItem name.
         * @member {string} name
         * @memberof fs.NameAndItem
         * @instance
         */
        NameAndItem.prototype.name = "";

        /**
         * NameAndItem item.
         * @member {fs.IFSItem|null|undefined} item
         * @memberof fs.NameAndItem
         * @instance
         */
        NameAndItem.prototype.item = null;

        /**
         * Creates a new NameAndItem instance using the specified properties.
         * @function create
         * @memberof fs.NameAndItem
         * @static
         * @param {fs.INameAndItem=} [properties] Properties to set
         * @returns {fs.NameAndItem} NameAndItem instance
         */
        NameAndItem.create = function create(properties) {
            return new NameAndItem(properties);
        };

        /**
         * Encodes the specified NameAndItem message. Does not implicitly {@link fs.NameAndItem.verify|verify} messages.
         * @function encode
         * @memberof fs.NameAndItem
         * @static
         * @param {fs.INameAndItem} message NameAndItem message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        NameAndItem.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                $root.fs.FSItem.encode(message.item, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified NameAndItem message, length delimited. Does not implicitly {@link fs.NameAndItem.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.NameAndItem
         * @static
         * @param {fs.INameAndItem} message NameAndItem message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        NameAndItem.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a NameAndItem message from the specified reader or buffer.
         * @function decode
         * @memberof fs.NameAndItem
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.NameAndItem} NameAndItem
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        NameAndItem.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.NameAndItem();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.name = reader.string();
                        break;
                    }
                case 2: {
                        message.item = $root.fs.FSItem.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a NameAndItem message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.NameAndItem
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.NameAndItem} NameAndItem
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        NameAndItem.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a NameAndItem message.
         * @function verify
         * @memberof fs.NameAndItem
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        NameAndItem.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.item != null && Object.hasOwnProperty.call(message, "item")) {
                var error = $root.fs.FSItem.verify(message.item, long + 1);
                if (error)
                    return "item." + error;
            }
            return null;
        };

        /**
         * Creates a NameAndItem message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.NameAndItem
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.NameAndItem} NameAndItem
         */
        NameAndItem.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.NameAndItem)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.NameAndItem: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.NameAndItem();
            if (object.name != null)
                message.name = String(object.name);
            if (object.item != null) {
                if (!$util.isObject(object.item))
                    throw TypeError(".fs.NameAndItem.item: object expected");
                message.item = $root.fs.FSItem.fromObject(object.item, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a NameAndItem message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.NameAndItem
         * @static
         * @param {fs.NameAndItem} message NameAndItem
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        NameAndItem.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.name = "";
                object.item = null;
            }
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                object.name = message.name;
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                object.item = $root.fs.FSItem.toObject(message.item, options, q + 1);
            return object;
        };

        /**
         * Converts this NameAndItem to JSON.
         * @function toJSON
         * @memberof fs.NameAndItem
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        NameAndItem.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for NameAndItem
         * @function getTypeUrl
         * @memberof fs.NameAndItem
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        NameAndItem.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.NameAndItem";
        };

        return NameAndItem;
    })();

    fs.IterResMsg = (function() {

        /**
         * Properties of an IterResMsg.
         * @memberof fs
         * @interface IIterResMsg
         * @property {common.IBooleanValue|null} [done] IterResMsg done
         * @property {fs.INameAndItem|null} [value] IterResMsg value
         */

        /**
         * Constructs a new IterResMsg.
         * @memberof fs
         * @classdesc Represents an IterResMsg.
         * @implements IIterResMsg
         * @constructor
         * @param {fs.IIterResMsg=} [properties] Properties to set
         */
        function IterResMsg(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * IterResMsg done.
         * @member {common.IBooleanValue|null|undefined} done
         * @memberof fs.IterResMsg
         * @instance
         */
        IterResMsg.prototype.done = null;

        /**
         * IterResMsg value.
         * @member {fs.INameAndItem|null|undefined} value
         * @memberof fs.IterResMsg
         * @instance
         */
        IterResMsg.prototype.value = null;

        /**
         * Creates a new IterResMsg instance using the specified properties.
         * @function create
         * @memberof fs.IterResMsg
         * @static
         * @param {fs.IIterResMsg=} [properties] Properties to set
         * @returns {fs.IterResMsg} IterResMsg instance
         */
        IterResMsg.create = function create(properties) {
            return new IterResMsg(properties);
        };

        /**
         * Encodes the specified IterResMsg message. Does not implicitly {@link fs.IterResMsg.verify|verify} messages.
         * @function encode
         * @memberof fs.IterResMsg
         * @static
         * @param {fs.IIterResMsg} message IterResMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        IterResMsg.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.done != null && Object.hasOwnProperty.call(message, "done"))
                $root.common.BooleanValue.encode(message.done, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                $root.fs.NameAndItem.encode(message.value, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified IterResMsg message, length delimited. Does not implicitly {@link fs.IterResMsg.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.IterResMsg
         * @static
         * @param {fs.IIterResMsg} message IterResMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        IterResMsg.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an IterResMsg message from the specified reader or buffer.
         * @function decode
         * @memberof fs.IterResMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.IterResMsg} IterResMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        IterResMsg.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.IterResMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.done = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.value = $root.fs.NameAndItem.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an IterResMsg message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.IterResMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.IterResMsg} IterResMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        IterResMsg.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an IterResMsg message.
         * @function verify
         * @memberof fs.IterResMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        IterResMsg.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.done != null && Object.hasOwnProperty.call(message, "done")) {
                var error = $root.common.BooleanValue.verify(message.done, long + 1);
                if (error)
                    return "done." + error;
            }
            if (message.value != null && Object.hasOwnProperty.call(message, "value")) {
                var error = $root.fs.NameAndItem.verify(message.value, long + 1);
                if (error)
                    return "value." + error;
            }
            return null;
        };

        /**
         * Creates an IterResMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.IterResMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.IterResMsg} IterResMsg
         */
        IterResMsg.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.IterResMsg)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.IterResMsg: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.IterResMsg();
            if (object.done != null) {
                if (!$util.isObject(object.done))
                    throw TypeError(".fs.IterResMsg.done: object expected");
                message.done = $root.common.BooleanValue.fromObject(object.done, long + 1);
            }
            if (object.value != null) {
                if (!$util.isObject(object.value))
                    throw TypeError(".fs.IterResMsg.value: object expected");
                message.value = $root.fs.NameAndItem.fromObject(object.value, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an IterResMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.IterResMsg
         * @static
         * @param {fs.IterResMsg} message IterResMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        IterResMsg.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.done = null;
                object.value = null;
            }
            if (message.done != null && Object.hasOwnProperty.call(message, "done"))
                object.done = $root.common.BooleanValue.toObject(message.done, options, q + 1);
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = $root.fs.NameAndItem.toObject(message.value, options, q + 1);
            return object;
        };

        /**
         * Converts this IterResMsg to JSON.
         * @function toJSON
         * @memberof fs.IterResMsg
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        IterResMsg.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for IterResMsg
         * @function getTypeUrl
         * @memberof fs.IterResMsg
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        IterResMsg.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.IterResMsg";
        };

        return IterResMsg;
    })();

    fs.CollectionEvent = (function() {

        /**
         * Properties of a CollectionEvent.
         * @memberof fs
         * @interface ICollectionEvent
         * @property {string|null} [type] CollectionEvent type
         * @property {common.IStringValue|null} [path] CollectionEvent path
         * @property {fs.IFSItem|null} [item] CollectionEvent item
         */

        /**
         * Constructs a new CollectionEvent.
         * @memberof fs
         * @classdesc Represents a CollectionEvent.
         * @implements ICollectionEvent
         * @constructor
         * @param {fs.ICollectionEvent=} [properties] Properties to set
         */
        function CollectionEvent(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * CollectionEvent type.
         * @member {string} type
         * @memberof fs.CollectionEvent
         * @instance
         */
        CollectionEvent.prototype.type = "";

        /**
         * CollectionEvent path.
         * @member {common.IStringValue|null|undefined} path
         * @memberof fs.CollectionEvent
         * @instance
         */
        CollectionEvent.prototype.path = null;

        /**
         * CollectionEvent item.
         * @member {fs.IFSItem|null|undefined} item
         * @memberof fs.CollectionEvent
         * @instance
         */
        CollectionEvent.prototype.item = null;

        /**
         * Creates a new CollectionEvent instance using the specified properties.
         * @function create
         * @memberof fs.CollectionEvent
         * @static
         * @param {fs.ICollectionEvent=} [properties] Properties to set
         * @returns {fs.CollectionEvent} CollectionEvent instance
         */
        CollectionEvent.create = function create(properties) {
            return new CollectionEvent(properties);
        };

        /**
         * Encodes the specified CollectionEvent message. Does not implicitly {@link fs.CollectionEvent.verify|verify} messages.
         * @function encode
         * @memberof fs.CollectionEvent
         * @static
         * @param {fs.ICollectionEvent} message CollectionEvent message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CollectionEvent.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.type);
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                $root.common.StringValue.encode(message.path, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                $root.fs.FSItem.encode(message.item, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified CollectionEvent message, length delimited. Does not implicitly {@link fs.CollectionEvent.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.CollectionEvent
         * @static
         * @param {fs.ICollectionEvent} message CollectionEvent message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CollectionEvent.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a CollectionEvent message from the specified reader or buffer.
         * @function decode
         * @memberof fs.CollectionEvent
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.CollectionEvent} CollectionEvent
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CollectionEvent.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.CollectionEvent();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.type = reader.string();
                        break;
                    }
                case 2: {
                        message.path = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.item = $root.fs.FSItem.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a CollectionEvent message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.CollectionEvent
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.CollectionEvent} CollectionEvent
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CollectionEvent.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a CollectionEvent message.
         * @function verify
         * @memberof fs.CollectionEvent
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        CollectionEvent.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.path != null && Object.hasOwnProperty.call(message, "path")) {
                var error = $root.common.StringValue.verify(message.path, long + 1);
                if (error)
                    return "path." + error;
            }
            if (message.item != null && Object.hasOwnProperty.call(message, "item")) {
                var error = $root.fs.FSItem.verify(message.item, long + 1);
                if (error)
                    return "item." + error;
            }
            return null;
        };

        /**
         * Creates a CollectionEvent message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.CollectionEvent
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.CollectionEvent} CollectionEvent
         */
        CollectionEvent.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.CollectionEvent)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.CollectionEvent: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.CollectionEvent();
            if (object.type != null)
                message.type = String(object.type);
            if (object.path != null) {
                if (!$util.isObject(object.path))
                    throw TypeError(".fs.CollectionEvent.path: object expected");
                message.path = $root.common.StringValue.fromObject(object.path, long + 1);
            }
            if (object.item != null) {
                if (!$util.isObject(object.item))
                    throw TypeError(".fs.CollectionEvent.item: object expected");
                message.item = $root.fs.FSItem.fromObject(object.item, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a CollectionEvent message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.CollectionEvent
         * @static
         * @param {fs.CollectionEvent} message CollectionEvent
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        CollectionEvent.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.path = null;
                object.item = null;
            }
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                object.type = message.type;
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = $root.common.StringValue.toObject(message.path, options, q + 1);
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                object.item = $root.fs.FSItem.toObject(message.item, options, q + 1);
            return object;
        };

        /**
         * Converts this CollectionEvent to JSON.
         * @function toJSON
         * @memberof fs.CollectionEvent
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        CollectionEvent.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for CollectionEvent
         * @function getTypeUrl
         * @memberof fs.CollectionEvent
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        CollectionEvent.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.CollectionEvent";
        };

        return CollectionEvent;
    })();

    fs.VersionedGetXAttrRequestBody = (function() {

        /**
         * Properties of a VersionedGetXAttrRequestBody.
         * @memberof fs
         * @interface IVersionedGetXAttrRequestBody
         * @property {string|null} [path] VersionedGetXAttrRequestBody path
         * @property {string|null} [xaName] VersionedGetXAttrRequestBody xaName
         * @property {file.IVersionedReadFlags|null} [flags] VersionedGetXAttrRequestBody flags
         */

        /**
         * Constructs a new VersionedGetXAttrRequestBody.
         * @memberof fs
         * @classdesc Represents a VersionedGetXAttrRequestBody.
         * @implements IVersionedGetXAttrRequestBody
         * @constructor
         * @param {fs.IVersionedGetXAttrRequestBody=} [properties] Properties to set
         */
        function VersionedGetXAttrRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedGetXAttrRequestBody path.
         * @member {string} path
         * @memberof fs.VersionedGetXAttrRequestBody
         * @instance
         */
        VersionedGetXAttrRequestBody.prototype.path = "";

        /**
         * VersionedGetXAttrRequestBody xaName.
         * @member {string} xaName
         * @memberof fs.VersionedGetXAttrRequestBody
         * @instance
         */
        VersionedGetXAttrRequestBody.prototype.xaName = "";

        /**
         * VersionedGetXAttrRequestBody flags.
         * @member {file.IVersionedReadFlags|null|undefined} flags
         * @memberof fs.VersionedGetXAttrRequestBody
         * @instance
         */
        VersionedGetXAttrRequestBody.prototype.flags = null;

        /**
         * Creates a new VersionedGetXAttrRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.VersionedGetXAttrRequestBody
         * @static
         * @param {fs.IVersionedGetXAttrRequestBody=} [properties] Properties to set
         * @returns {fs.VersionedGetXAttrRequestBody} VersionedGetXAttrRequestBody instance
         */
        VersionedGetXAttrRequestBody.create = function create(properties) {
            return new VersionedGetXAttrRequestBody(properties);
        };

        /**
         * Encodes the specified VersionedGetXAttrRequestBody message. Does not implicitly {@link fs.VersionedGetXAttrRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.VersionedGetXAttrRequestBody
         * @static
         * @param {fs.IVersionedGetXAttrRequestBody} message VersionedGetXAttrRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetXAttrRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.xaName);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 10, wireType 2 =*/82).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedGetXAttrRequestBody message, length delimited. Does not implicitly {@link fs.VersionedGetXAttrRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.VersionedGetXAttrRequestBody
         * @static
         * @param {fs.IVersionedGetXAttrRequestBody} message VersionedGetXAttrRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetXAttrRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedGetXAttrRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.VersionedGetXAttrRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.VersionedGetXAttrRequestBody} VersionedGetXAttrRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetXAttrRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedGetXAttrRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.xaName = reader.string();
                        break;
                    }
                case 10: {
                        message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedGetXAttrRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.VersionedGetXAttrRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.VersionedGetXAttrRequestBody} VersionedGetXAttrRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetXAttrRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedGetXAttrRequestBody message.
         * @function verify
         * @memberof fs.VersionedGetXAttrRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedGetXAttrRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                if (!$util.isString(message.xaName))
                    return "xaName: string expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedGetXAttrRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.VersionedGetXAttrRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.VersionedGetXAttrRequestBody} VersionedGetXAttrRequestBody
         */
        VersionedGetXAttrRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.VersionedGetXAttrRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.VersionedGetXAttrRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.VersionedGetXAttrRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.xaName != null)
                message.xaName = String(object.xaName);
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.VersionedGetXAttrRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedGetXAttrRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.VersionedGetXAttrRequestBody
         * @static
         * @param {fs.VersionedGetXAttrRequestBody} message VersionedGetXAttrRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedGetXAttrRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.xaName = "";
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                object.xaName = message.xaName;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedGetXAttrRequestBody to JSON.
         * @function toJSON
         * @memberof fs.VersionedGetXAttrRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedGetXAttrRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedGetXAttrRequestBody
         * @function getTypeUrl
         * @memberof fs.VersionedGetXAttrRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedGetXAttrRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.VersionedGetXAttrRequestBody";
        };

        return VersionedGetXAttrRequestBody;
    })();

    fs.PathAndFlagsRequestBody = (function() {

        /**
         * Properties of a PathAndFlagsRequestBody.
         * @memberof fs
         * @interface IPathAndFlagsRequestBody
         * @property {string|null} [path] PathAndFlagsRequestBody path
         * @property {file.IVersionedReadFlags|null} [flags] PathAndFlagsRequestBody flags
         */

        /**
         * Constructs a new PathAndFlagsRequestBody.
         * @memberof fs
         * @classdesc Represents a PathAndFlagsRequestBody.
         * @implements IPathAndFlagsRequestBody
         * @constructor
         * @param {fs.IPathAndFlagsRequestBody=} [properties] Properties to set
         */
        function PathAndFlagsRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * PathAndFlagsRequestBody path.
         * @member {string} path
         * @memberof fs.PathAndFlagsRequestBody
         * @instance
         */
        PathAndFlagsRequestBody.prototype.path = "";

        /**
         * PathAndFlagsRequestBody flags.
         * @member {file.IVersionedReadFlags|null|undefined} flags
         * @memberof fs.PathAndFlagsRequestBody
         * @instance
         */
        PathAndFlagsRequestBody.prototype.flags = null;

        /**
         * Creates a new PathAndFlagsRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.PathAndFlagsRequestBody
         * @static
         * @param {fs.IPathAndFlagsRequestBody=} [properties] Properties to set
         * @returns {fs.PathAndFlagsRequestBody} PathAndFlagsRequestBody instance
         */
        PathAndFlagsRequestBody.create = function create(properties) {
            return new PathAndFlagsRequestBody(properties);
        };

        /**
         * Encodes the specified PathAndFlagsRequestBody message. Does not implicitly {@link fs.PathAndFlagsRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.PathAndFlagsRequestBody
         * @static
         * @param {fs.IPathAndFlagsRequestBody} message PathAndFlagsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        PathAndFlagsRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified PathAndFlagsRequestBody message, length delimited. Does not implicitly {@link fs.PathAndFlagsRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.PathAndFlagsRequestBody
         * @static
         * @param {fs.IPathAndFlagsRequestBody} message PathAndFlagsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        PathAndFlagsRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a PathAndFlagsRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.PathAndFlagsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.PathAndFlagsRequestBody} PathAndFlagsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        PathAndFlagsRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.PathAndFlagsRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a PathAndFlagsRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.PathAndFlagsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.PathAndFlagsRequestBody} PathAndFlagsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        PathAndFlagsRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a PathAndFlagsRequestBody message.
         * @function verify
         * @memberof fs.PathAndFlagsRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        PathAndFlagsRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a PathAndFlagsRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.PathAndFlagsRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.PathAndFlagsRequestBody} PathAndFlagsRequestBody
         */
        PathAndFlagsRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.PathAndFlagsRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.PathAndFlagsRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.PathAndFlagsRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.PathAndFlagsRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a PathAndFlagsRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.PathAndFlagsRequestBody
         * @static
         * @param {fs.PathAndFlagsRequestBody} message PathAndFlagsRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        PathAndFlagsRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this PathAndFlagsRequestBody to JSON.
         * @function toJSON
         * @memberof fs.PathAndFlagsRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        PathAndFlagsRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for PathAndFlagsRequestBody
         * @function getTypeUrl
         * @memberof fs.PathAndFlagsRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        PathAndFlagsRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.PathAndFlagsRequestBody";
        };

        return PathAndFlagsRequestBody;
    })();

    fs.VersionedListFolderReplyBody = (function() {

        /**
         * Properties of a VersionedListFolderReplyBody.
         * @memberof fs
         * @interface IVersionedListFolderReplyBody
         * @property {number|Long|null} [version] VersionedListFolderReplyBody version
         * @property {Array.<fs.IListingEntryMsg>|null} [entries] VersionedListFolderReplyBody entries
         */

        /**
         * Constructs a new VersionedListFolderReplyBody.
         * @memberof fs
         * @classdesc Represents a VersionedListFolderReplyBody.
         * @implements IVersionedListFolderReplyBody
         * @constructor
         * @param {fs.IVersionedListFolderReplyBody=} [properties] Properties to set
         */
        function VersionedListFolderReplyBody(properties) {
            this.entries = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedListFolderReplyBody version.
         * @member {number|Long} version
         * @memberof fs.VersionedListFolderReplyBody
         * @instance
         */
        VersionedListFolderReplyBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * VersionedListFolderReplyBody entries.
         * @member {Array.<fs.IListingEntryMsg>} entries
         * @memberof fs.VersionedListFolderReplyBody
         * @instance
         */
        VersionedListFolderReplyBody.prototype.entries = $util.emptyArray;

        /**
         * Creates a new VersionedListFolderReplyBody instance using the specified properties.
         * @function create
         * @memberof fs.VersionedListFolderReplyBody
         * @static
         * @param {fs.IVersionedListFolderReplyBody=} [properties] Properties to set
         * @returns {fs.VersionedListFolderReplyBody} VersionedListFolderReplyBody instance
         */
        VersionedListFolderReplyBody.create = function create(properties) {
            return new VersionedListFolderReplyBody(properties);
        };

        /**
         * Encodes the specified VersionedListFolderReplyBody message. Does not implicitly {@link fs.VersionedListFolderReplyBody.verify|verify} messages.
         * @function encode
         * @memberof fs.VersionedListFolderReplyBody
         * @static
         * @param {fs.IVersionedListFolderReplyBody} message VersionedListFolderReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedListFolderReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            if (message.entries != null && message.entries.length)
                for (var i = 0; i < message.entries.length; ++i)
                    $root.fs.ListingEntryMsg.encode(message.entries[i], writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedListFolderReplyBody message, length delimited. Does not implicitly {@link fs.VersionedListFolderReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.VersionedListFolderReplyBody
         * @static
         * @param {fs.IVersionedListFolderReplyBody} message VersionedListFolderReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedListFolderReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedListFolderReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.VersionedListFolderReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.VersionedListFolderReplyBody} VersionedListFolderReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedListFolderReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedListFolderReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        if (!(message.entries && message.entries.length))
                            message.entries = [];
                        message.entries.push($root.fs.ListingEntryMsg.decode(reader, reader.uint32(), undefined, long + 1));
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedListFolderReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.VersionedListFolderReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.VersionedListFolderReplyBody} VersionedListFolderReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedListFolderReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedListFolderReplyBody message.
         * @function verify
         * @memberof fs.VersionedListFolderReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedListFolderReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            if (message.entries != null && Object.hasOwnProperty.call(message, "entries")) {
                if (!Array.isArray(message.entries))
                    return "entries: array expected";
                for (var i = 0; i < message.entries.length; ++i) {
                    var error = $root.fs.ListingEntryMsg.verify(message.entries[i], long + 1);
                    if (error)
                        return "entries." + error;
                }
            }
            return null;
        };

        /**
         * Creates a VersionedListFolderReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.VersionedListFolderReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.VersionedListFolderReplyBody} VersionedListFolderReplyBody
         */
        VersionedListFolderReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.VersionedListFolderReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.VersionedListFolderReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.VersionedListFolderReplyBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            if (object.entries) {
                if (!Array.isArray(object.entries))
                    throw TypeError(".fs.VersionedListFolderReplyBody.entries: array expected");
                message.entries = [];
                for (var i = 0; i < object.entries.length; ++i) {
                    if (!$util.isObject(object.entries[i]))
                        throw TypeError(".fs.VersionedListFolderReplyBody.entries: object expected");
                    message.entries[i] = $root.fs.ListingEntryMsg.fromObject(object.entries[i], long + 1);
                }
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedListFolderReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.VersionedListFolderReplyBody
         * @static
         * @param {fs.VersionedListFolderReplyBody} message VersionedListFolderReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedListFolderReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.entries = [];
            if (options.defaults)
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            if (message.entries && message.entries.length) {
                object.entries = [];
                for (var j = 0; j < message.entries.length; ++j)
                    object.entries[j] = $root.fs.ListingEntryMsg.toObject(message.entries[j], options, q + 1);
            }
            return object;
        };

        /**
         * Converts this VersionedListFolderReplyBody to JSON.
         * @function toJSON
         * @memberof fs.VersionedListFolderReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedListFolderReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedListFolderReplyBody
         * @function getTypeUrl
         * @memberof fs.VersionedListFolderReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedListFolderReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.VersionedListFolderReplyBody";
        };

        return VersionedListFolderReplyBody;
    })();

    fs.VersionedReadBytesRequestBody = (function() {

        /**
         * Properties of a VersionedReadBytesRequestBody.
         * @memberof fs
         * @interface IVersionedReadBytesRequestBody
         * @property {string|null} [path] VersionedReadBytesRequestBody path
         * @property {common.IUInt64Value|null} [start] VersionedReadBytesRequestBody start
         * @property {common.IUInt64Value|null} [end] VersionedReadBytesRequestBody end
         * @property {file.IVersionedReadFlags|null} [flags] VersionedReadBytesRequestBody flags
         */

        /**
         * Constructs a new VersionedReadBytesRequestBody.
         * @memberof fs
         * @classdesc Represents a VersionedReadBytesRequestBody.
         * @implements IVersionedReadBytesRequestBody
         * @constructor
         * @param {fs.IVersionedReadBytesRequestBody=} [properties] Properties to set
         */
        function VersionedReadBytesRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedReadBytesRequestBody path.
         * @member {string} path
         * @memberof fs.VersionedReadBytesRequestBody
         * @instance
         */
        VersionedReadBytesRequestBody.prototype.path = "";

        /**
         * VersionedReadBytesRequestBody start.
         * @member {common.IUInt64Value|null|undefined} start
         * @memberof fs.VersionedReadBytesRequestBody
         * @instance
         */
        VersionedReadBytesRequestBody.prototype.start = null;

        /**
         * VersionedReadBytesRequestBody end.
         * @member {common.IUInt64Value|null|undefined} end
         * @memberof fs.VersionedReadBytesRequestBody
         * @instance
         */
        VersionedReadBytesRequestBody.prototype.end = null;

        /**
         * VersionedReadBytesRequestBody flags.
         * @member {file.IVersionedReadFlags|null|undefined} flags
         * @memberof fs.VersionedReadBytesRequestBody
         * @instance
         */
        VersionedReadBytesRequestBody.prototype.flags = null;

        /**
         * Creates a new VersionedReadBytesRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.VersionedReadBytesRequestBody
         * @static
         * @param {fs.IVersionedReadBytesRequestBody=} [properties] Properties to set
         * @returns {fs.VersionedReadBytesRequestBody} VersionedReadBytesRequestBody instance
         */
        VersionedReadBytesRequestBody.create = function create(properties) {
            return new VersionedReadBytesRequestBody(properties);
        };

        /**
         * Encodes the specified VersionedReadBytesRequestBody message. Does not implicitly {@link fs.VersionedReadBytesRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.VersionedReadBytesRequestBody
         * @static
         * @param {fs.IVersionedReadBytesRequestBody} message VersionedReadBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadBytesRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                $root.common.UInt64Value.encode(message.start, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                $root.common.UInt64Value.encode(message.end, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 10, wireType 2 =*/82).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedReadBytesRequestBody message, length delimited. Does not implicitly {@link fs.VersionedReadBytesRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.VersionedReadBytesRequestBody
         * @static
         * @param {fs.IVersionedReadBytesRequestBody} message VersionedReadBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadBytesRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedReadBytesRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.VersionedReadBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.VersionedReadBytesRequestBody} VersionedReadBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadBytesRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedReadBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.start = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.end = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 10: {
                        message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedReadBytesRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.VersionedReadBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.VersionedReadBytesRequestBody} VersionedReadBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadBytesRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedReadBytesRequestBody message.
         * @function verify
         * @memberof fs.VersionedReadBytesRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedReadBytesRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.start != null && Object.hasOwnProperty.call(message, "start")) {
                var error = $root.common.UInt64Value.verify(message.start, long + 1);
                if (error)
                    return "start." + error;
            }
            if (message.end != null && Object.hasOwnProperty.call(message, "end")) {
                var error = $root.common.UInt64Value.verify(message.end, long + 1);
                if (error)
                    return "end." + error;
            }
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedReadBytesRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.VersionedReadBytesRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.VersionedReadBytesRequestBody} VersionedReadBytesRequestBody
         */
        VersionedReadBytesRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.VersionedReadBytesRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.VersionedReadBytesRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.VersionedReadBytesRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.start != null) {
                if (!$util.isObject(object.start))
                    throw TypeError(".fs.VersionedReadBytesRequestBody.start: object expected");
                message.start = $root.common.UInt64Value.fromObject(object.start, long + 1);
            }
            if (object.end != null) {
                if (!$util.isObject(object.end))
                    throw TypeError(".fs.VersionedReadBytesRequestBody.end: object expected");
                message.end = $root.common.UInt64Value.fromObject(object.end, long + 1);
            }
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.VersionedReadBytesRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedReadBytesRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.VersionedReadBytesRequestBody
         * @static
         * @param {fs.VersionedReadBytesRequestBody} message VersionedReadBytesRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedReadBytesRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.start = null;
                object.end = null;
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                object.start = $root.common.UInt64Value.toObject(message.start, options, q + 1);
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                object.end = $root.common.UInt64Value.toObject(message.end, options, q + 1);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedReadBytesRequestBody to JSON.
         * @function toJSON
         * @memberof fs.VersionedReadBytesRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedReadBytesRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedReadBytesRequestBody
         * @function getTypeUrl
         * @memberof fs.VersionedReadBytesRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedReadBytesRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.VersionedReadBytesRequestBody";
        };

        return VersionedReadBytesRequestBody;
    })();

    fs.UpdateXAttrsRequestBody = (function() {

        /**
         * Properties of an UpdateXAttrsRequestBody.
         * @memberof fs
         * @interface IUpdateXAttrsRequestBody
         * @property {string|null} [path] UpdateXAttrsRequestBody path
         * @property {file.IXAttrsChanges|null} [changes] UpdateXAttrsRequestBody changes
         */

        /**
         * Constructs a new UpdateXAttrsRequestBody.
         * @memberof fs
         * @classdesc Represents an UpdateXAttrsRequestBody.
         * @implements IUpdateXAttrsRequestBody
         * @constructor
         * @param {fs.IUpdateXAttrsRequestBody=} [properties] Properties to set
         */
        function UpdateXAttrsRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * UpdateXAttrsRequestBody path.
         * @member {string} path
         * @memberof fs.UpdateXAttrsRequestBody
         * @instance
         */
        UpdateXAttrsRequestBody.prototype.path = "";

        /**
         * UpdateXAttrsRequestBody changes.
         * @member {file.IXAttrsChanges|null|undefined} changes
         * @memberof fs.UpdateXAttrsRequestBody
         * @instance
         */
        UpdateXAttrsRequestBody.prototype.changes = null;

        /**
         * Creates a new UpdateXAttrsRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.UpdateXAttrsRequestBody
         * @static
         * @param {fs.IUpdateXAttrsRequestBody=} [properties] Properties to set
         * @returns {fs.UpdateXAttrsRequestBody} UpdateXAttrsRequestBody instance
         */
        UpdateXAttrsRequestBody.create = function create(properties) {
            return new UpdateXAttrsRequestBody(properties);
        };

        /**
         * Encodes the specified UpdateXAttrsRequestBody message. Does not implicitly {@link fs.UpdateXAttrsRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.UpdateXAttrsRequestBody
         * @static
         * @param {fs.IUpdateXAttrsRequestBody} message UpdateXAttrsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UpdateXAttrsRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.changes != null && Object.hasOwnProperty.call(message, "changes"))
                $root.file.XAttrsChanges.encode(message.changes, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified UpdateXAttrsRequestBody message, length delimited. Does not implicitly {@link fs.UpdateXAttrsRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.UpdateXAttrsRequestBody
         * @static
         * @param {fs.IUpdateXAttrsRequestBody} message UpdateXAttrsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UpdateXAttrsRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an UpdateXAttrsRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.UpdateXAttrsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.UpdateXAttrsRequestBody} UpdateXAttrsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UpdateXAttrsRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.UpdateXAttrsRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.changes = $root.file.XAttrsChanges.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an UpdateXAttrsRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.UpdateXAttrsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.UpdateXAttrsRequestBody} UpdateXAttrsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UpdateXAttrsRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an UpdateXAttrsRequestBody message.
         * @function verify
         * @memberof fs.UpdateXAttrsRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        UpdateXAttrsRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.changes != null && Object.hasOwnProperty.call(message, "changes")) {
                var error = $root.file.XAttrsChanges.verify(message.changes, long + 1);
                if (error)
                    return "changes." + error;
            }
            return null;
        };

        /**
         * Creates an UpdateXAttrsRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.UpdateXAttrsRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.UpdateXAttrsRequestBody} UpdateXAttrsRequestBody
         */
        UpdateXAttrsRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.UpdateXAttrsRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.UpdateXAttrsRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.UpdateXAttrsRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.changes != null) {
                if (!$util.isObject(object.changes))
                    throw TypeError(".fs.UpdateXAttrsRequestBody.changes: object expected");
                message.changes = $root.file.XAttrsChanges.fromObject(object.changes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an UpdateXAttrsRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.UpdateXAttrsRequestBody
         * @static
         * @param {fs.UpdateXAttrsRequestBody} message UpdateXAttrsRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        UpdateXAttrsRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.changes = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.changes != null && Object.hasOwnProperty.call(message, "changes"))
                object.changes = $root.file.XAttrsChanges.toObject(message.changes, options, q + 1);
            return object;
        };

        /**
         * Converts this UpdateXAttrsRequestBody to JSON.
         * @function toJSON
         * @memberof fs.UpdateXAttrsRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        UpdateXAttrsRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for UpdateXAttrsRequestBody
         * @function getTypeUrl
         * @memberof fs.UpdateXAttrsRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        UpdateXAttrsRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.UpdateXAttrsRequestBody";
        };

        return UpdateXAttrsRequestBody;
    })();

    fs.MakeFolderRequestBody = (function() {

        /**
         * Properties of a MakeFolderRequestBody.
         * @memberof fs
         * @interface IMakeFolderRequestBody
         * @property {string|null} [path] MakeFolderRequestBody path
         * @property {common.IBooleanValue|null} [exclusive] MakeFolderRequestBody exclusive
         */

        /**
         * Constructs a new MakeFolderRequestBody.
         * @memberof fs
         * @classdesc Represents a MakeFolderRequestBody.
         * @implements IMakeFolderRequestBody
         * @constructor
         * @param {fs.IMakeFolderRequestBody=} [properties] Properties to set
         */
        function MakeFolderRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * MakeFolderRequestBody path.
         * @member {string} path
         * @memberof fs.MakeFolderRequestBody
         * @instance
         */
        MakeFolderRequestBody.prototype.path = "";

        /**
         * MakeFolderRequestBody exclusive.
         * @member {common.IBooleanValue|null|undefined} exclusive
         * @memberof fs.MakeFolderRequestBody
         * @instance
         */
        MakeFolderRequestBody.prototype.exclusive = null;

        /**
         * Creates a new MakeFolderRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.MakeFolderRequestBody
         * @static
         * @param {fs.IMakeFolderRequestBody=} [properties] Properties to set
         * @returns {fs.MakeFolderRequestBody} MakeFolderRequestBody instance
         */
        MakeFolderRequestBody.create = function create(properties) {
            return new MakeFolderRequestBody(properties);
        };

        /**
         * Encodes the specified MakeFolderRequestBody message. Does not implicitly {@link fs.MakeFolderRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.MakeFolderRequestBody
         * @static
         * @param {fs.IMakeFolderRequestBody} message MakeFolderRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        MakeFolderRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive"))
                $root.common.BooleanValue.encode(message.exclusive, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified MakeFolderRequestBody message, length delimited. Does not implicitly {@link fs.MakeFolderRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.MakeFolderRequestBody
         * @static
         * @param {fs.IMakeFolderRequestBody} message MakeFolderRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        MakeFolderRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a MakeFolderRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.MakeFolderRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.MakeFolderRequestBody} MakeFolderRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        MakeFolderRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.MakeFolderRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.exclusive = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a MakeFolderRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.MakeFolderRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.MakeFolderRequestBody} MakeFolderRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        MakeFolderRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a MakeFolderRequestBody message.
         * @function verify
         * @memberof fs.MakeFolderRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        MakeFolderRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive")) {
                var error = $root.common.BooleanValue.verify(message.exclusive, long + 1);
                if (error)
                    return "exclusive." + error;
            }
            return null;
        };

        /**
         * Creates a MakeFolderRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.MakeFolderRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.MakeFolderRequestBody} MakeFolderRequestBody
         */
        MakeFolderRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.MakeFolderRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.MakeFolderRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.MakeFolderRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.exclusive != null) {
                if (!$util.isObject(object.exclusive))
                    throw TypeError(".fs.MakeFolderRequestBody.exclusive: object expected");
                message.exclusive = $root.common.BooleanValue.fromObject(object.exclusive, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a MakeFolderRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.MakeFolderRequestBody
         * @static
         * @param {fs.MakeFolderRequestBody} message MakeFolderRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        MakeFolderRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.exclusive = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive"))
                object.exclusive = $root.common.BooleanValue.toObject(message.exclusive, options, q + 1);
            return object;
        };

        /**
         * Converts this MakeFolderRequestBody to JSON.
         * @function toJSON
         * @memberof fs.MakeFolderRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        MakeFolderRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for MakeFolderRequestBody
         * @function getTypeUrl
         * @memberof fs.MakeFolderRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        MakeFolderRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.MakeFolderRequestBody";
        };

        return MakeFolderRequestBody;
    })();

    fs.DeleteFolderRequestBody = (function() {

        /**
         * Properties of a DeleteFolderRequestBody.
         * @memberof fs
         * @interface IDeleteFolderRequestBody
         * @property {string|null} [path] DeleteFolderRequestBody path
         * @property {common.IBooleanValue|null} [removeContent] DeleteFolderRequestBody removeContent
         */

        /**
         * Constructs a new DeleteFolderRequestBody.
         * @memberof fs
         * @classdesc Represents a DeleteFolderRequestBody.
         * @implements IDeleteFolderRequestBody
         * @constructor
         * @param {fs.IDeleteFolderRequestBody=} [properties] Properties to set
         */
        function DeleteFolderRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * DeleteFolderRequestBody path.
         * @member {string} path
         * @memberof fs.DeleteFolderRequestBody
         * @instance
         */
        DeleteFolderRequestBody.prototype.path = "";

        /**
         * DeleteFolderRequestBody removeContent.
         * @member {common.IBooleanValue|null|undefined} removeContent
         * @memberof fs.DeleteFolderRequestBody
         * @instance
         */
        DeleteFolderRequestBody.prototype.removeContent = null;

        /**
         * Creates a new DeleteFolderRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.DeleteFolderRequestBody
         * @static
         * @param {fs.IDeleteFolderRequestBody=} [properties] Properties to set
         * @returns {fs.DeleteFolderRequestBody} DeleteFolderRequestBody instance
         */
        DeleteFolderRequestBody.create = function create(properties) {
            return new DeleteFolderRequestBody(properties);
        };

        /**
         * Encodes the specified DeleteFolderRequestBody message. Does not implicitly {@link fs.DeleteFolderRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.DeleteFolderRequestBody
         * @static
         * @param {fs.IDeleteFolderRequestBody} message DeleteFolderRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DeleteFolderRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.removeContent != null && Object.hasOwnProperty.call(message, "removeContent"))
                $root.common.BooleanValue.encode(message.removeContent, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified DeleteFolderRequestBody message, length delimited. Does not implicitly {@link fs.DeleteFolderRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.DeleteFolderRequestBody
         * @static
         * @param {fs.IDeleteFolderRequestBody} message DeleteFolderRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DeleteFolderRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a DeleteFolderRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.DeleteFolderRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.DeleteFolderRequestBody} DeleteFolderRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DeleteFolderRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.DeleteFolderRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.removeContent = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a DeleteFolderRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.DeleteFolderRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.DeleteFolderRequestBody} DeleteFolderRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DeleteFolderRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a DeleteFolderRequestBody message.
         * @function verify
         * @memberof fs.DeleteFolderRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        DeleteFolderRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.removeContent != null && Object.hasOwnProperty.call(message, "removeContent")) {
                var error = $root.common.BooleanValue.verify(message.removeContent, long + 1);
                if (error)
                    return "removeContent." + error;
            }
            return null;
        };

        /**
         * Creates a DeleteFolderRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.DeleteFolderRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.DeleteFolderRequestBody} DeleteFolderRequestBody
         */
        DeleteFolderRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.DeleteFolderRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.DeleteFolderRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.DeleteFolderRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.removeContent != null) {
                if (!$util.isObject(object.removeContent))
                    throw TypeError(".fs.DeleteFolderRequestBody.removeContent: object expected");
                message.removeContent = $root.common.BooleanValue.fromObject(object.removeContent, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a DeleteFolderRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.DeleteFolderRequestBody
         * @static
         * @param {fs.DeleteFolderRequestBody} message DeleteFolderRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        DeleteFolderRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.removeContent = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.removeContent != null && Object.hasOwnProperty.call(message, "removeContent"))
                object.removeContent = $root.common.BooleanValue.toObject(message.removeContent, options, q + 1);
            return object;
        };

        /**
         * Converts this DeleteFolderRequestBody to JSON.
         * @function toJSON
         * @memberof fs.DeleteFolderRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        DeleteFolderRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for DeleteFolderRequestBody
         * @function getTypeUrl
         * @memberof fs.DeleteFolderRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        DeleteFolderRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.DeleteFolderRequestBody";
        };

        return DeleteFolderRequestBody;
    })();

    fs.MoveRequestBody = (function() {

        /**
         * Properties of a MoveRequestBody.
         * @memberof fs
         * @interface IMoveRequestBody
         * @property {string|null} [src] MoveRequestBody src
         * @property {string|null} [dst] MoveRequestBody dst
         */

        /**
         * Constructs a new MoveRequestBody.
         * @memberof fs
         * @classdesc Represents a MoveRequestBody.
         * @implements IMoveRequestBody
         * @constructor
         * @param {fs.IMoveRequestBody=} [properties] Properties to set
         */
        function MoveRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * MoveRequestBody src.
         * @member {string} src
         * @memberof fs.MoveRequestBody
         * @instance
         */
        MoveRequestBody.prototype.src = "";

        /**
         * MoveRequestBody dst.
         * @member {string} dst
         * @memberof fs.MoveRequestBody
         * @instance
         */
        MoveRequestBody.prototype.dst = "";

        /**
         * Creates a new MoveRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.MoveRequestBody
         * @static
         * @param {fs.IMoveRequestBody=} [properties] Properties to set
         * @returns {fs.MoveRequestBody} MoveRequestBody instance
         */
        MoveRequestBody.create = function create(properties) {
            return new MoveRequestBody(properties);
        };

        /**
         * Encodes the specified MoveRequestBody message. Does not implicitly {@link fs.MoveRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.MoveRequestBody
         * @static
         * @param {fs.IMoveRequestBody} message MoveRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        MoveRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.src);
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.dst);
            return writer;
        };

        /**
         * Encodes the specified MoveRequestBody message, length delimited. Does not implicitly {@link fs.MoveRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.MoveRequestBody
         * @static
         * @param {fs.IMoveRequestBody} message MoveRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        MoveRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a MoveRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.MoveRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.MoveRequestBody} MoveRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        MoveRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.MoveRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.src = reader.string();
                        break;
                    }
                case 2: {
                        message.dst = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a MoveRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.MoveRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.MoveRequestBody} MoveRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        MoveRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a MoveRequestBody message.
         * @function verify
         * @memberof fs.MoveRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        MoveRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                if (!$util.isString(message.src))
                    return "src: string expected";
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                if (!$util.isString(message.dst))
                    return "dst: string expected";
            return null;
        };

        /**
         * Creates a MoveRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.MoveRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.MoveRequestBody} MoveRequestBody
         */
        MoveRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.MoveRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.MoveRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.MoveRequestBody();
            if (object.src != null)
                message.src = String(object.src);
            if (object.dst != null)
                message.dst = String(object.dst);
            return message;
        };

        /**
         * Creates a plain object from a MoveRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.MoveRequestBody
         * @static
         * @param {fs.MoveRequestBody} message MoveRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        MoveRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.src = "";
                object.dst = "";
            }
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                object.src = message.src;
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                object.dst = message.dst;
            return object;
        };

        /**
         * Converts this MoveRequestBody to JSON.
         * @function toJSON
         * @memberof fs.MoveRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        MoveRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for MoveRequestBody
         * @function getTypeUrl
         * @memberof fs.MoveRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        MoveRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.MoveRequestBody";
        };

        return MoveRequestBody;
    })();

    fs.CopyFileRequestBody = (function() {

        /**
         * Properties of a CopyFileRequestBody.
         * @memberof fs
         * @interface ICopyFileRequestBody
         * @property {string|null} [src] CopyFileRequestBody src
         * @property {string|null} [dst] CopyFileRequestBody dst
         * @property {common.IBooleanValue|null} [overwrite] CopyFileRequestBody overwrite
         */

        /**
         * Constructs a new CopyFileRequestBody.
         * @memberof fs
         * @classdesc Represents a CopyFileRequestBody.
         * @implements ICopyFileRequestBody
         * @constructor
         * @param {fs.ICopyFileRequestBody=} [properties] Properties to set
         */
        function CopyFileRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * CopyFileRequestBody src.
         * @member {string} src
         * @memberof fs.CopyFileRequestBody
         * @instance
         */
        CopyFileRequestBody.prototype.src = "";

        /**
         * CopyFileRequestBody dst.
         * @member {string} dst
         * @memberof fs.CopyFileRequestBody
         * @instance
         */
        CopyFileRequestBody.prototype.dst = "";

        /**
         * CopyFileRequestBody overwrite.
         * @member {common.IBooleanValue|null|undefined} overwrite
         * @memberof fs.CopyFileRequestBody
         * @instance
         */
        CopyFileRequestBody.prototype.overwrite = null;

        /**
         * Creates a new CopyFileRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.CopyFileRequestBody
         * @static
         * @param {fs.ICopyFileRequestBody=} [properties] Properties to set
         * @returns {fs.CopyFileRequestBody} CopyFileRequestBody instance
         */
        CopyFileRequestBody.create = function create(properties) {
            return new CopyFileRequestBody(properties);
        };

        /**
         * Encodes the specified CopyFileRequestBody message. Does not implicitly {@link fs.CopyFileRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.CopyFileRequestBody
         * @static
         * @param {fs.ICopyFileRequestBody} message CopyFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CopyFileRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.src);
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.dst);
            if (message.overwrite != null && Object.hasOwnProperty.call(message, "overwrite"))
                $root.common.BooleanValue.encode(message.overwrite, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified CopyFileRequestBody message, length delimited. Does not implicitly {@link fs.CopyFileRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.CopyFileRequestBody
         * @static
         * @param {fs.ICopyFileRequestBody} message CopyFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CopyFileRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a CopyFileRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.CopyFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.CopyFileRequestBody} CopyFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CopyFileRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.CopyFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.src = reader.string();
                        break;
                    }
                case 2: {
                        message.dst = reader.string();
                        break;
                    }
                case 3: {
                        message.overwrite = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a CopyFileRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.CopyFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.CopyFileRequestBody} CopyFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CopyFileRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a CopyFileRequestBody message.
         * @function verify
         * @memberof fs.CopyFileRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        CopyFileRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                if (!$util.isString(message.src))
                    return "src: string expected";
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                if (!$util.isString(message.dst))
                    return "dst: string expected";
            if (message.overwrite != null && Object.hasOwnProperty.call(message, "overwrite")) {
                var error = $root.common.BooleanValue.verify(message.overwrite, long + 1);
                if (error)
                    return "overwrite." + error;
            }
            return null;
        };

        /**
         * Creates a CopyFileRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.CopyFileRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.CopyFileRequestBody} CopyFileRequestBody
         */
        CopyFileRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.CopyFileRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.CopyFileRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.CopyFileRequestBody();
            if (object.src != null)
                message.src = String(object.src);
            if (object.dst != null)
                message.dst = String(object.dst);
            if (object.overwrite != null) {
                if (!$util.isObject(object.overwrite))
                    throw TypeError(".fs.CopyFileRequestBody.overwrite: object expected");
                message.overwrite = $root.common.BooleanValue.fromObject(object.overwrite, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a CopyFileRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.CopyFileRequestBody
         * @static
         * @param {fs.CopyFileRequestBody} message CopyFileRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        CopyFileRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.src = "";
                object.dst = "";
                object.overwrite = null;
            }
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                object.src = message.src;
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                object.dst = message.dst;
            if (message.overwrite != null && Object.hasOwnProperty.call(message, "overwrite"))
                object.overwrite = $root.common.BooleanValue.toObject(message.overwrite, options, q + 1);
            return object;
        };

        /**
         * Converts this CopyFileRequestBody to JSON.
         * @function toJSON
         * @memberof fs.CopyFileRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        CopyFileRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for CopyFileRequestBody
         * @function getTypeUrl
         * @memberof fs.CopyFileRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        CopyFileRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.CopyFileRequestBody";
        };

        return CopyFileRequestBody;
    })();

    fs.CopyFolderRequestBody = (function() {

        /**
         * Properties of a CopyFolderRequestBody.
         * @memberof fs
         * @interface ICopyFolderRequestBody
         * @property {string|null} [src] CopyFolderRequestBody src
         * @property {string|null} [dst] CopyFolderRequestBody dst
         * @property {common.IBooleanValue|null} [mergeAndOverwrite] CopyFolderRequestBody mergeAndOverwrite
         */

        /**
         * Constructs a new CopyFolderRequestBody.
         * @memberof fs
         * @classdesc Represents a CopyFolderRequestBody.
         * @implements ICopyFolderRequestBody
         * @constructor
         * @param {fs.ICopyFolderRequestBody=} [properties] Properties to set
         */
        function CopyFolderRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * CopyFolderRequestBody src.
         * @member {string} src
         * @memberof fs.CopyFolderRequestBody
         * @instance
         */
        CopyFolderRequestBody.prototype.src = "";

        /**
         * CopyFolderRequestBody dst.
         * @member {string} dst
         * @memberof fs.CopyFolderRequestBody
         * @instance
         */
        CopyFolderRequestBody.prototype.dst = "";

        /**
         * CopyFolderRequestBody mergeAndOverwrite.
         * @member {common.IBooleanValue|null|undefined} mergeAndOverwrite
         * @memberof fs.CopyFolderRequestBody
         * @instance
         */
        CopyFolderRequestBody.prototype.mergeAndOverwrite = null;

        /**
         * Creates a new CopyFolderRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.CopyFolderRequestBody
         * @static
         * @param {fs.ICopyFolderRequestBody=} [properties] Properties to set
         * @returns {fs.CopyFolderRequestBody} CopyFolderRequestBody instance
         */
        CopyFolderRequestBody.create = function create(properties) {
            return new CopyFolderRequestBody(properties);
        };

        /**
         * Encodes the specified CopyFolderRequestBody message. Does not implicitly {@link fs.CopyFolderRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.CopyFolderRequestBody
         * @static
         * @param {fs.ICopyFolderRequestBody} message CopyFolderRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CopyFolderRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.src);
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.dst);
            if (message.mergeAndOverwrite != null && Object.hasOwnProperty.call(message, "mergeAndOverwrite"))
                $root.common.BooleanValue.encode(message.mergeAndOverwrite, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified CopyFolderRequestBody message, length delimited. Does not implicitly {@link fs.CopyFolderRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.CopyFolderRequestBody
         * @static
         * @param {fs.ICopyFolderRequestBody} message CopyFolderRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CopyFolderRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a CopyFolderRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.CopyFolderRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.CopyFolderRequestBody} CopyFolderRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CopyFolderRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.CopyFolderRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.src = reader.string();
                        break;
                    }
                case 2: {
                        message.dst = reader.string();
                        break;
                    }
                case 3: {
                        message.mergeAndOverwrite = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a CopyFolderRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.CopyFolderRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.CopyFolderRequestBody} CopyFolderRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CopyFolderRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a CopyFolderRequestBody message.
         * @function verify
         * @memberof fs.CopyFolderRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        CopyFolderRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                if (!$util.isString(message.src))
                    return "src: string expected";
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                if (!$util.isString(message.dst))
                    return "dst: string expected";
            if (message.mergeAndOverwrite != null && Object.hasOwnProperty.call(message, "mergeAndOverwrite")) {
                var error = $root.common.BooleanValue.verify(message.mergeAndOverwrite, long + 1);
                if (error)
                    return "mergeAndOverwrite." + error;
            }
            return null;
        };

        /**
         * Creates a CopyFolderRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.CopyFolderRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.CopyFolderRequestBody} CopyFolderRequestBody
         */
        CopyFolderRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.CopyFolderRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.CopyFolderRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.CopyFolderRequestBody();
            if (object.src != null)
                message.src = String(object.src);
            if (object.dst != null)
                message.dst = String(object.dst);
            if (object.mergeAndOverwrite != null) {
                if (!$util.isObject(object.mergeAndOverwrite))
                    throw TypeError(".fs.CopyFolderRequestBody.mergeAndOverwrite: object expected");
                message.mergeAndOverwrite = $root.common.BooleanValue.fromObject(object.mergeAndOverwrite, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a CopyFolderRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.CopyFolderRequestBody
         * @static
         * @param {fs.CopyFolderRequestBody} message CopyFolderRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        CopyFolderRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.src = "";
                object.dst = "";
                object.mergeAndOverwrite = null;
            }
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                object.src = message.src;
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                object.dst = message.dst;
            if (message.mergeAndOverwrite != null && Object.hasOwnProperty.call(message, "mergeAndOverwrite"))
                object.mergeAndOverwrite = $root.common.BooleanValue.toObject(message.mergeAndOverwrite, options, q + 1);
            return object;
        };

        /**
         * Converts this CopyFolderRequestBody to JSON.
         * @function toJSON
         * @memberof fs.CopyFolderRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        CopyFolderRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for CopyFolderRequestBody
         * @function getTypeUrl
         * @memberof fs.CopyFolderRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        CopyFolderRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.CopyFolderRequestBody";
        };

        return CopyFolderRequestBody;
    })();

    fs.SaveFileRequestBody = (function() {

        /**
         * Properties of a SaveFileRequestBody.
         * @memberof fs
         * @interface ISaveFileRequestBody
         * @property {common.IObjectReference|null} [file] SaveFileRequestBody file
         * @property {string|null} [dst] SaveFileRequestBody dst
         * @property {common.IBooleanValue|null} [overwrite] SaveFileRequestBody overwrite
         */

        /**
         * Constructs a new SaveFileRequestBody.
         * @memberof fs
         * @classdesc Represents a SaveFileRequestBody.
         * @implements ISaveFileRequestBody
         * @constructor
         * @param {fs.ISaveFileRequestBody=} [properties] Properties to set
         */
        function SaveFileRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * SaveFileRequestBody file.
         * @member {common.IObjectReference|null|undefined} file
         * @memberof fs.SaveFileRequestBody
         * @instance
         */
        SaveFileRequestBody.prototype.file = null;

        /**
         * SaveFileRequestBody dst.
         * @member {string} dst
         * @memberof fs.SaveFileRequestBody
         * @instance
         */
        SaveFileRequestBody.prototype.dst = "";

        /**
         * SaveFileRequestBody overwrite.
         * @member {common.IBooleanValue|null|undefined} overwrite
         * @memberof fs.SaveFileRequestBody
         * @instance
         */
        SaveFileRequestBody.prototype.overwrite = null;

        /**
         * Creates a new SaveFileRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.SaveFileRequestBody
         * @static
         * @param {fs.ISaveFileRequestBody=} [properties] Properties to set
         * @returns {fs.SaveFileRequestBody} SaveFileRequestBody instance
         */
        SaveFileRequestBody.create = function create(properties) {
            return new SaveFileRequestBody(properties);
        };

        /**
         * Encodes the specified SaveFileRequestBody message. Does not implicitly {@link fs.SaveFileRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.SaveFileRequestBody
         * @static
         * @param {fs.ISaveFileRequestBody} message SaveFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SaveFileRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                $root.common.ObjectReference.encode(message.file, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.dst);
            if (message.overwrite != null && Object.hasOwnProperty.call(message, "overwrite"))
                $root.common.BooleanValue.encode(message.overwrite, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified SaveFileRequestBody message, length delimited. Does not implicitly {@link fs.SaveFileRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.SaveFileRequestBody
         * @static
         * @param {fs.ISaveFileRequestBody} message SaveFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SaveFileRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a SaveFileRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.SaveFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.SaveFileRequestBody} SaveFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SaveFileRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SaveFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.file = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.dst = reader.string();
                        break;
                    }
                case 3: {
                        message.overwrite = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a SaveFileRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.SaveFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.SaveFileRequestBody} SaveFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SaveFileRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a SaveFileRequestBody message.
         * @function verify
         * @memberof fs.SaveFileRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        SaveFileRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.file != null && Object.hasOwnProperty.call(message, "file")) {
                var error = $root.common.ObjectReference.verify(message.file, long + 1);
                if (error)
                    return "file." + error;
            }
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                if (!$util.isString(message.dst))
                    return "dst: string expected";
            if (message.overwrite != null && Object.hasOwnProperty.call(message, "overwrite")) {
                var error = $root.common.BooleanValue.verify(message.overwrite, long + 1);
                if (error)
                    return "overwrite." + error;
            }
            return null;
        };

        /**
         * Creates a SaveFileRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.SaveFileRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.SaveFileRequestBody} SaveFileRequestBody
         */
        SaveFileRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.SaveFileRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.SaveFileRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.SaveFileRequestBody();
            if (object.file != null) {
                if (!$util.isObject(object.file))
                    throw TypeError(".fs.SaveFileRequestBody.file: object expected");
                message.file = $root.common.ObjectReference.fromObject(object.file, long + 1);
            }
            if (object.dst != null)
                message.dst = String(object.dst);
            if (object.overwrite != null) {
                if (!$util.isObject(object.overwrite))
                    throw TypeError(".fs.SaveFileRequestBody.overwrite: object expected");
                message.overwrite = $root.common.BooleanValue.fromObject(object.overwrite, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a SaveFileRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.SaveFileRequestBody
         * @static
         * @param {fs.SaveFileRequestBody} message SaveFileRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        SaveFileRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.file = null;
                object.dst = "";
                object.overwrite = null;
            }
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                object.file = $root.common.ObjectReference.toObject(message.file, options, q + 1);
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                object.dst = message.dst;
            if (message.overwrite != null && Object.hasOwnProperty.call(message, "overwrite"))
                object.overwrite = $root.common.BooleanValue.toObject(message.overwrite, options, q + 1);
            return object;
        };

        /**
         * Converts this SaveFileRequestBody to JSON.
         * @function toJSON
         * @memberof fs.SaveFileRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        SaveFileRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for SaveFileRequestBody
         * @function getTypeUrl
         * @memberof fs.SaveFileRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        SaveFileRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.SaveFileRequestBody";
        };

        return SaveFileRequestBody;
    })();

    fs.SaveFolderRequestBody = (function() {

        /**
         * Properties of a SaveFolderRequestBody.
         * @memberof fs
         * @interface ISaveFolderRequestBody
         * @property {common.IObjectReference|null} [folder] SaveFolderRequestBody folder
         * @property {string|null} [dst] SaveFolderRequestBody dst
         * @property {common.IBooleanValue|null} [mergeAndOverwrite] SaveFolderRequestBody mergeAndOverwrite
         */

        /**
         * Constructs a new SaveFolderRequestBody.
         * @memberof fs
         * @classdesc Represents a SaveFolderRequestBody.
         * @implements ISaveFolderRequestBody
         * @constructor
         * @param {fs.ISaveFolderRequestBody=} [properties] Properties to set
         */
        function SaveFolderRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * SaveFolderRequestBody folder.
         * @member {common.IObjectReference|null|undefined} folder
         * @memberof fs.SaveFolderRequestBody
         * @instance
         */
        SaveFolderRequestBody.prototype.folder = null;

        /**
         * SaveFolderRequestBody dst.
         * @member {string} dst
         * @memberof fs.SaveFolderRequestBody
         * @instance
         */
        SaveFolderRequestBody.prototype.dst = "";

        /**
         * SaveFolderRequestBody mergeAndOverwrite.
         * @member {common.IBooleanValue|null|undefined} mergeAndOverwrite
         * @memberof fs.SaveFolderRequestBody
         * @instance
         */
        SaveFolderRequestBody.prototype.mergeAndOverwrite = null;

        /**
         * Creates a new SaveFolderRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.SaveFolderRequestBody
         * @static
         * @param {fs.ISaveFolderRequestBody=} [properties] Properties to set
         * @returns {fs.SaveFolderRequestBody} SaveFolderRequestBody instance
         */
        SaveFolderRequestBody.create = function create(properties) {
            return new SaveFolderRequestBody(properties);
        };

        /**
         * Encodes the specified SaveFolderRequestBody message. Does not implicitly {@link fs.SaveFolderRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.SaveFolderRequestBody
         * @static
         * @param {fs.ISaveFolderRequestBody} message SaveFolderRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SaveFolderRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.folder != null && Object.hasOwnProperty.call(message, "folder"))
                $root.common.ObjectReference.encode(message.folder, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.dst);
            if (message.mergeAndOverwrite != null && Object.hasOwnProperty.call(message, "mergeAndOverwrite"))
                $root.common.BooleanValue.encode(message.mergeAndOverwrite, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified SaveFolderRequestBody message, length delimited. Does not implicitly {@link fs.SaveFolderRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.SaveFolderRequestBody
         * @static
         * @param {fs.ISaveFolderRequestBody} message SaveFolderRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SaveFolderRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a SaveFolderRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.SaveFolderRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.SaveFolderRequestBody} SaveFolderRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SaveFolderRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SaveFolderRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.folder = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.dst = reader.string();
                        break;
                    }
                case 3: {
                        message.mergeAndOverwrite = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a SaveFolderRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.SaveFolderRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.SaveFolderRequestBody} SaveFolderRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SaveFolderRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a SaveFolderRequestBody message.
         * @function verify
         * @memberof fs.SaveFolderRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        SaveFolderRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.folder != null && Object.hasOwnProperty.call(message, "folder")) {
                var error = $root.common.ObjectReference.verify(message.folder, long + 1);
                if (error)
                    return "folder." + error;
            }
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                if (!$util.isString(message.dst))
                    return "dst: string expected";
            if (message.mergeAndOverwrite != null && Object.hasOwnProperty.call(message, "mergeAndOverwrite")) {
                var error = $root.common.BooleanValue.verify(message.mergeAndOverwrite, long + 1);
                if (error)
                    return "mergeAndOverwrite." + error;
            }
            return null;
        };

        /**
         * Creates a SaveFolderRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.SaveFolderRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.SaveFolderRequestBody} SaveFolderRequestBody
         */
        SaveFolderRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.SaveFolderRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.SaveFolderRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.SaveFolderRequestBody();
            if (object.folder != null) {
                if (!$util.isObject(object.folder))
                    throw TypeError(".fs.SaveFolderRequestBody.folder: object expected");
                message.folder = $root.common.ObjectReference.fromObject(object.folder, long + 1);
            }
            if (object.dst != null)
                message.dst = String(object.dst);
            if (object.mergeAndOverwrite != null) {
                if (!$util.isObject(object.mergeAndOverwrite))
                    throw TypeError(".fs.SaveFolderRequestBody.mergeAndOverwrite: object expected");
                message.mergeAndOverwrite = $root.common.BooleanValue.fromObject(object.mergeAndOverwrite, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a SaveFolderRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.SaveFolderRequestBody
         * @static
         * @param {fs.SaveFolderRequestBody} message SaveFolderRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        SaveFolderRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.folder = null;
                object.dst = "";
                object.mergeAndOverwrite = null;
            }
            if (message.folder != null && Object.hasOwnProperty.call(message, "folder"))
                object.folder = $root.common.ObjectReference.toObject(message.folder, options, q + 1);
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                object.dst = message.dst;
            if (message.mergeAndOverwrite != null && Object.hasOwnProperty.call(message, "mergeAndOverwrite"))
                object.mergeAndOverwrite = $root.common.BooleanValue.toObject(message.mergeAndOverwrite, options, q + 1);
            return object;
        };

        /**
         * Converts this SaveFolderRequestBody to JSON.
         * @function toJSON
         * @memberof fs.SaveFolderRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        SaveFolderRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for SaveFolderRequestBody
         * @function getTypeUrl
         * @memberof fs.SaveFolderRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        SaveFolderRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.SaveFolderRequestBody";
        };

        return SaveFolderRequestBody;
    })();

    fs.LinkRequestBody = (function() {

        /**
         * Properties of a LinkRequestBody.
         * @memberof fs
         * @interface ILinkRequestBody
         * @property {string|null} [path] LinkRequestBody path
         * @property {common.IObjectReference|null} [target] LinkRequestBody target
         */

        /**
         * Constructs a new LinkRequestBody.
         * @memberof fs
         * @classdesc Represents a LinkRequestBody.
         * @implements ILinkRequestBody
         * @constructor
         * @param {fs.ILinkRequestBody=} [properties] Properties to set
         */
        function LinkRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * LinkRequestBody path.
         * @member {string} path
         * @memberof fs.LinkRequestBody
         * @instance
         */
        LinkRequestBody.prototype.path = "";

        /**
         * LinkRequestBody target.
         * @member {common.IObjectReference|null|undefined} target
         * @memberof fs.LinkRequestBody
         * @instance
         */
        LinkRequestBody.prototype.target = null;

        /**
         * Creates a new LinkRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.LinkRequestBody
         * @static
         * @param {fs.ILinkRequestBody=} [properties] Properties to set
         * @returns {fs.LinkRequestBody} LinkRequestBody instance
         */
        LinkRequestBody.create = function create(properties) {
            return new LinkRequestBody(properties);
        };

        /**
         * Encodes the specified LinkRequestBody message. Does not implicitly {@link fs.LinkRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.LinkRequestBody
         * @static
         * @param {fs.ILinkRequestBody} message LinkRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        LinkRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.target != null && Object.hasOwnProperty.call(message, "target"))
                $root.common.ObjectReference.encode(message.target, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified LinkRequestBody message, length delimited. Does not implicitly {@link fs.LinkRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.LinkRequestBody
         * @static
         * @param {fs.ILinkRequestBody} message LinkRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        LinkRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a LinkRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.LinkRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.LinkRequestBody} LinkRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        LinkRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.LinkRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.target = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a LinkRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.LinkRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.LinkRequestBody} LinkRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        LinkRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a LinkRequestBody message.
         * @function verify
         * @memberof fs.LinkRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        LinkRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.target != null && Object.hasOwnProperty.call(message, "target")) {
                var error = $root.common.ObjectReference.verify(message.target, long + 1);
                if (error)
                    return "target." + error;
            }
            return null;
        };

        /**
         * Creates a LinkRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.LinkRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.LinkRequestBody} LinkRequestBody
         */
        LinkRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.LinkRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.LinkRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.LinkRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.target != null) {
                if (!$util.isObject(object.target))
                    throw TypeError(".fs.LinkRequestBody.target: object expected");
                message.target = $root.common.ObjectReference.fromObject(object.target, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a LinkRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.LinkRequestBody
         * @static
         * @param {fs.LinkRequestBody} message LinkRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        LinkRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.target = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.target != null && Object.hasOwnProperty.call(message, "target"))
                object.target = $root.common.ObjectReference.toObject(message.target, options, q + 1);
            return object;
        };

        /**
         * Converts this LinkRequestBody to JSON.
         * @function toJSON
         * @memberof fs.LinkRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        LinkRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for LinkRequestBody
         * @function getTypeUrl
         * @memberof fs.LinkRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        LinkRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.LinkRequestBody";
        };

        return LinkRequestBody;
    })();

    fs.PathAndOptFileFlags = (function() {

        /**
         * Properties of a PathAndOptFileFlags.
         * @memberof fs
         * @interface IPathAndOptFileFlags
         * @property {string|null} [path] PathAndOptFileFlags path
         * @property {fs.IFileFlags|null} [flags] PathAndOptFileFlags flags
         */

        /**
         * Constructs a new PathAndOptFileFlags.
         * @memberof fs
         * @classdesc Represents a PathAndOptFileFlags.
         * @implements IPathAndOptFileFlags
         * @constructor
         * @param {fs.IPathAndOptFileFlags=} [properties] Properties to set
         */
        function PathAndOptFileFlags(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * PathAndOptFileFlags path.
         * @member {string} path
         * @memberof fs.PathAndOptFileFlags
         * @instance
         */
        PathAndOptFileFlags.prototype.path = "";

        /**
         * PathAndOptFileFlags flags.
         * @member {fs.IFileFlags|null|undefined} flags
         * @memberof fs.PathAndOptFileFlags
         * @instance
         */
        PathAndOptFileFlags.prototype.flags = null;

        /**
         * Creates a new PathAndOptFileFlags instance using the specified properties.
         * @function create
         * @memberof fs.PathAndOptFileFlags
         * @static
         * @param {fs.IPathAndOptFileFlags=} [properties] Properties to set
         * @returns {fs.PathAndOptFileFlags} PathAndOptFileFlags instance
         */
        PathAndOptFileFlags.create = function create(properties) {
            return new PathAndOptFileFlags(properties);
        };

        /**
         * Encodes the specified PathAndOptFileFlags message. Does not implicitly {@link fs.PathAndOptFileFlags.verify|verify} messages.
         * @function encode
         * @memberof fs.PathAndOptFileFlags
         * @static
         * @param {fs.IPathAndOptFileFlags} message PathAndOptFileFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        PathAndOptFileFlags.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.fs.FileFlags.encode(message.flags, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified PathAndOptFileFlags message, length delimited. Does not implicitly {@link fs.PathAndOptFileFlags.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.PathAndOptFileFlags
         * @static
         * @param {fs.IPathAndOptFileFlags} message PathAndOptFileFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        PathAndOptFileFlags.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a PathAndOptFileFlags message from the specified reader or buffer.
         * @function decode
         * @memberof fs.PathAndOptFileFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.PathAndOptFileFlags} PathAndOptFileFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        PathAndOptFileFlags.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.PathAndOptFileFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.flags = $root.fs.FileFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a PathAndOptFileFlags message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.PathAndOptFileFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.PathAndOptFileFlags} PathAndOptFileFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        PathAndOptFileFlags.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a PathAndOptFileFlags message.
         * @function verify
         * @memberof fs.PathAndOptFileFlags
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        PathAndOptFileFlags.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.fs.FileFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a PathAndOptFileFlags message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.PathAndOptFileFlags
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.PathAndOptFileFlags} PathAndOptFileFlags
         */
        PathAndOptFileFlags.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.PathAndOptFileFlags)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.PathAndOptFileFlags: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.PathAndOptFileFlags();
            if (object.path != null)
                message.path = String(object.path);
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.PathAndOptFileFlags.flags: object expected");
                message.flags = $root.fs.FileFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a PathAndOptFileFlags message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.PathAndOptFileFlags
         * @static
         * @param {fs.PathAndOptFileFlags} message PathAndOptFileFlags
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        PathAndOptFileFlags.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.fs.FileFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this PathAndOptFileFlags to JSON.
         * @function toJSON
         * @memberof fs.PathAndOptFileFlags
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        PathAndOptFileFlags.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for PathAndOptFileFlags
         * @function getTypeUrl
         * @memberof fs.PathAndOptFileFlags
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        PathAndOptFileFlags.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.PathAndOptFileFlags";
        };

        return PathAndOptFileFlags;
    })();

    fs.FileFlags = (function() {

        /**
         * Properties of a FileFlags.
         * @memberof fs
         * @interface IFileFlags
         * @property {common.IBooleanValue|null} [truncate] FileFlags truncate
         * @property {common.IBooleanValue|null} [create] FileFlags create
         * @property {common.IBooleanValue|null} [exclusive] FileFlags exclusive
         */

        /**
         * Constructs a new FileFlags.
         * @memberof fs
         * @classdesc Represents a FileFlags.
         * @implements IFileFlags
         * @constructor
         * @param {fs.IFileFlags=} [properties] Properties to set
         */
        function FileFlags(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileFlags truncate.
         * @member {common.IBooleanValue|null|undefined} truncate
         * @memberof fs.FileFlags
         * @instance
         */
        FileFlags.prototype.truncate = null;

        /**
         * FileFlags create.
         * @member {common.IBooleanValue|null|undefined} create
         * @memberof fs.FileFlags
         * @instance
         */
        FileFlags.prototype.create = null;

        /**
         * FileFlags exclusive.
         * @member {common.IBooleanValue|null|undefined} exclusive
         * @memberof fs.FileFlags
         * @instance
         */
        FileFlags.prototype.exclusive = null;

        /**
         * Creates a new FileFlags instance using the specified properties.
         * @function create
         * @memberof fs.FileFlags
         * @static
         * @param {fs.IFileFlags=} [properties] Properties to set
         * @returns {fs.FileFlags} FileFlags instance
         */
        FileFlags.create = function create(properties) {
            return new FileFlags(properties);
        };

        /**
         * Encodes the specified FileFlags message. Does not implicitly {@link fs.FileFlags.verify|verify} messages.
         * @function encode
         * @memberof fs.FileFlags
         * @static
         * @param {fs.IFileFlags} message FileFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileFlags.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.truncate != null && Object.hasOwnProperty.call(message, "truncate"))
                $root.common.BooleanValue.encode(message.truncate, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.create != null && Object.hasOwnProperty.call(message, "create"))
                $root.common.BooleanValue.encode(message.create, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive"))
                $root.common.BooleanValue.encode(message.exclusive, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FileFlags message, length delimited. Does not implicitly {@link fs.FileFlags.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FileFlags
         * @static
         * @param {fs.IFileFlags} message FileFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileFlags.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileFlags message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FileFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FileFlags} FileFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileFlags.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FileFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.truncate = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.create = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.exclusive = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileFlags message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FileFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FileFlags} FileFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileFlags.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileFlags message.
         * @function verify
         * @memberof fs.FileFlags
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileFlags.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.truncate != null && Object.hasOwnProperty.call(message, "truncate")) {
                var error = $root.common.BooleanValue.verify(message.truncate, long + 1);
                if (error)
                    return "truncate." + error;
            }
            if (message.create != null && Object.hasOwnProperty.call(message, "create")) {
                var error = $root.common.BooleanValue.verify(message.create, long + 1);
                if (error)
                    return "create." + error;
            }
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive")) {
                var error = $root.common.BooleanValue.verify(message.exclusive, long + 1);
                if (error)
                    return "exclusive." + error;
            }
            return null;
        };

        /**
         * Creates a FileFlags message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FileFlags
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FileFlags} FileFlags
         */
        FileFlags.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FileFlags)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FileFlags: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FileFlags();
            if (object.truncate != null) {
                if (!$util.isObject(object.truncate))
                    throw TypeError(".fs.FileFlags.truncate: object expected");
                message.truncate = $root.common.BooleanValue.fromObject(object.truncate, long + 1);
            }
            if (object.create != null) {
                if (!$util.isObject(object.create))
                    throw TypeError(".fs.FileFlags.create: object expected");
                message.create = $root.common.BooleanValue.fromObject(object.create, long + 1);
            }
            if (object.exclusive != null) {
                if (!$util.isObject(object.exclusive))
                    throw TypeError(".fs.FileFlags.exclusive: object expected");
                message.exclusive = $root.common.BooleanValue.fromObject(object.exclusive, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a FileFlags message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FileFlags
         * @static
         * @param {fs.FileFlags} message FileFlags
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileFlags.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.truncate = null;
                object.create = null;
                object.exclusive = null;
            }
            if (message.truncate != null && Object.hasOwnProperty.call(message, "truncate"))
                object.truncate = $root.common.BooleanValue.toObject(message.truncate, options, q + 1);
            if (message.create != null && Object.hasOwnProperty.call(message, "create"))
                object.create = $root.common.BooleanValue.toObject(message.create, options, q + 1);
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive"))
                object.exclusive = $root.common.BooleanValue.toObject(message.exclusive, options, q + 1);
            return object;
        };

        /**
         * Converts this FileFlags to JSON.
         * @function toJSON
         * @memberof fs.FileFlags
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileFlags.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileFlags
         * @function getTypeUrl
         * @memberof fs.FileFlags
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileFlags.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FileFlags";
        };

        return FileFlags;
    })();

    fs.WriteJsonFileRequestBody = (function() {

        /**
         * Properties of a WriteJsonFileRequestBody.
         * @memberof fs
         * @interface IWriteJsonFileRequestBody
         * @property {string|null} [path] WriteJsonFileRequestBody path
         * @property {string|null} [json] WriteJsonFileRequestBody json
         * @property {fs.IFileFlags|null} [flags] WriteJsonFileRequestBody flags
         */

        /**
         * Constructs a new WriteJsonFileRequestBody.
         * @memberof fs
         * @classdesc Represents a WriteJsonFileRequestBody.
         * @implements IWriteJsonFileRequestBody
         * @constructor
         * @param {fs.IWriteJsonFileRequestBody=} [properties] Properties to set
         */
        function WriteJsonFileRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * WriteJsonFileRequestBody path.
         * @member {string} path
         * @memberof fs.WriteJsonFileRequestBody
         * @instance
         */
        WriteJsonFileRequestBody.prototype.path = "";

        /**
         * WriteJsonFileRequestBody json.
         * @member {string} json
         * @memberof fs.WriteJsonFileRequestBody
         * @instance
         */
        WriteJsonFileRequestBody.prototype.json = "";

        /**
         * WriteJsonFileRequestBody flags.
         * @member {fs.IFileFlags|null|undefined} flags
         * @memberof fs.WriteJsonFileRequestBody
         * @instance
         */
        WriteJsonFileRequestBody.prototype.flags = null;

        /**
         * Creates a new WriteJsonFileRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.WriteJsonFileRequestBody
         * @static
         * @param {fs.IWriteJsonFileRequestBody=} [properties] Properties to set
         * @returns {fs.WriteJsonFileRequestBody} WriteJsonFileRequestBody instance
         */
        WriteJsonFileRequestBody.create = function create(properties) {
            return new WriteJsonFileRequestBody(properties);
        };

        /**
         * Encodes the specified WriteJsonFileRequestBody message. Does not implicitly {@link fs.WriteJsonFileRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.WriteJsonFileRequestBody
         * @static
         * @param {fs.IWriteJsonFileRequestBody} message WriteJsonFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteJsonFileRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.json);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.fs.FileFlags.encode(message.flags, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified WriteJsonFileRequestBody message, length delimited. Does not implicitly {@link fs.WriteJsonFileRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.WriteJsonFileRequestBody
         * @static
         * @param {fs.IWriteJsonFileRequestBody} message WriteJsonFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteJsonFileRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a WriteJsonFileRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.WriteJsonFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.WriteJsonFileRequestBody} WriteJsonFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteJsonFileRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.WriteJsonFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.json = reader.string();
                        break;
                    }
                case 3: {
                        message.flags = $root.fs.FileFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a WriteJsonFileRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.WriteJsonFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.WriteJsonFileRequestBody} WriteJsonFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteJsonFileRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a WriteJsonFileRequestBody message.
         * @function verify
         * @memberof fs.WriteJsonFileRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        WriteJsonFileRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                if (!$util.isString(message.json))
                    return "json: string expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.fs.FileFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a WriteJsonFileRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.WriteJsonFileRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.WriteJsonFileRequestBody} WriteJsonFileRequestBody
         */
        WriteJsonFileRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.WriteJsonFileRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.WriteJsonFileRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.WriteJsonFileRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.json != null)
                message.json = String(object.json);
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.WriteJsonFileRequestBody.flags: object expected");
                message.flags = $root.fs.FileFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a WriteJsonFileRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.WriteJsonFileRequestBody
         * @static
         * @param {fs.WriteJsonFileRequestBody} message WriteJsonFileRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        WriteJsonFileRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.json = "";
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = message.json;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.fs.FileFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this WriteJsonFileRequestBody to JSON.
         * @function toJSON
         * @memberof fs.WriteJsonFileRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        WriteJsonFileRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for WriteJsonFileRequestBody
         * @function getTypeUrl
         * @memberof fs.WriteJsonFileRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        WriteJsonFileRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.WriteJsonFileRequestBody";
        };

        return WriteJsonFileRequestBody;
    })();

    fs.WriteTxtFileRequestBody = (function() {

        /**
         * Properties of a WriteTxtFileRequestBody.
         * @memberof fs
         * @interface IWriteTxtFileRequestBody
         * @property {string|null} [path] WriteTxtFileRequestBody path
         * @property {string|null} [txt] WriteTxtFileRequestBody txt
         * @property {fs.IFileFlags|null} [flags] WriteTxtFileRequestBody flags
         */

        /**
         * Constructs a new WriteTxtFileRequestBody.
         * @memberof fs
         * @classdesc Represents a WriteTxtFileRequestBody.
         * @implements IWriteTxtFileRequestBody
         * @constructor
         * @param {fs.IWriteTxtFileRequestBody=} [properties] Properties to set
         */
        function WriteTxtFileRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * WriteTxtFileRequestBody path.
         * @member {string} path
         * @memberof fs.WriteTxtFileRequestBody
         * @instance
         */
        WriteTxtFileRequestBody.prototype.path = "";

        /**
         * WriteTxtFileRequestBody txt.
         * @member {string} txt
         * @memberof fs.WriteTxtFileRequestBody
         * @instance
         */
        WriteTxtFileRequestBody.prototype.txt = "";

        /**
         * WriteTxtFileRequestBody flags.
         * @member {fs.IFileFlags|null|undefined} flags
         * @memberof fs.WriteTxtFileRequestBody
         * @instance
         */
        WriteTxtFileRequestBody.prototype.flags = null;

        /**
         * Creates a new WriteTxtFileRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.WriteTxtFileRequestBody
         * @static
         * @param {fs.IWriteTxtFileRequestBody=} [properties] Properties to set
         * @returns {fs.WriteTxtFileRequestBody} WriteTxtFileRequestBody instance
         */
        WriteTxtFileRequestBody.create = function create(properties) {
            return new WriteTxtFileRequestBody(properties);
        };

        /**
         * Encodes the specified WriteTxtFileRequestBody message. Does not implicitly {@link fs.WriteTxtFileRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.WriteTxtFileRequestBody
         * @static
         * @param {fs.IWriteTxtFileRequestBody} message WriteTxtFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteTxtFileRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.txt);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.fs.FileFlags.encode(message.flags, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified WriteTxtFileRequestBody message, length delimited. Does not implicitly {@link fs.WriteTxtFileRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.WriteTxtFileRequestBody
         * @static
         * @param {fs.IWriteTxtFileRequestBody} message WriteTxtFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteTxtFileRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a WriteTxtFileRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.WriteTxtFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.WriteTxtFileRequestBody} WriteTxtFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteTxtFileRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.WriteTxtFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.txt = reader.string();
                        break;
                    }
                case 3: {
                        message.flags = $root.fs.FileFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a WriteTxtFileRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.WriteTxtFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.WriteTxtFileRequestBody} WriteTxtFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteTxtFileRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a WriteTxtFileRequestBody message.
         * @function verify
         * @memberof fs.WriteTxtFileRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        WriteTxtFileRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                if (!$util.isString(message.txt))
                    return "txt: string expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.fs.FileFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a WriteTxtFileRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.WriteTxtFileRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.WriteTxtFileRequestBody} WriteTxtFileRequestBody
         */
        WriteTxtFileRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.WriteTxtFileRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.WriteTxtFileRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.WriteTxtFileRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.txt != null)
                message.txt = String(object.txt);
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.WriteTxtFileRequestBody.flags: object expected");
                message.flags = $root.fs.FileFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a WriteTxtFileRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.WriteTxtFileRequestBody
         * @static
         * @param {fs.WriteTxtFileRequestBody} message WriteTxtFileRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        WriteTxtFileRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.txt = "";
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                object.txt = message.txt;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.fs.FileFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this WriteTxtFileRequestBody to JSON.
         * @function toJSON
         * @memberof fs.WriteTxtFileRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        WriteTxtFileRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for WriteTxtFileRequestBody
         * @function getTypeUrl
         * @memberof fs.WriteTxtFileRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        WriteTxtFileRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.WriteTxtFileRequestBody";
        };

        return WriteTxtFileRequestBody;
    })();

    fs.WriteBytesRequestBody = (function() {

        /**
         * Properties of a WriteBytesRequestBody.
         * @memberof fs
         * @interface IWriteBytesRequestBody
         * @property {string|null} [path] WriteBytesRequestBody path
         * @property {Uint8Array|null} [bytes] WriteBytesRequestBody bytes
         * @property {fs.IFileFlags|null} [flags] WriteBytesRequestBody flags
         */

        /**
         * Constructs a new WriteBytesRequestBody.
         * @memberof fs
         * @classdesc Represents a WriteBytesRequestBody.
         * @implements IWriteBytesRequestBody
         * @constructor
         * @param {fs.IWriteBytesRequestBody=} [properties] Properties to set
         */
        function WriteBytesRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * WriteBytesRequestBody path.
         * @member {string} path
         * @memberof fs.WriteBytesRequestBody
         * @instance
         */
        WriteBytesRequestBody.prototype.path = "";

        /**
         * WriteBytesRequestBody bytes.
         * @member {Uint8Array} bytes
         * @memberof fs.WriteBytesRequestBody
         * @instance
         */
        WriteBytesRequestBody.prototype.bytes = $util.newBuffer([]);

        /**
         * WriteBytesRequestBody flags.
         * @member {fs.IFileFlags|null|undefined} flags
         * @memberof fs.WriteBytesRequestBody
         * @instance
         */
        WriteBytesRequestBody.prototype.flags = null;

        /**
         * Creates a new WriteBytesRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.WriteBytesRequestBody
         * @static
         * @param {fs.IWriteBytesRequestBody=} [properties] Properties to set
         * @returns {fs.WriteBytesRequestBody} WriteBytesRequestBody instance
         */
        WriteBytesRequestBody.create = function create(properties) {
            return new WriteBytesRequestBody(properties);
        };

        /**
         * Encodes the specified WriteBytesRequestBody message. Does not implicitly {@link fs.WriteBytesRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.WriteBytesRequestBody
         * @static
         * @param {fs.IWriteBytesRequestBody} message WriteBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteBytesRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.bytes);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.fs.FileFlags.encode(message.flags, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified WriteBytesRequestBody message, length delimited. Does not implicitly {@link fs.WriteBytesRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.WriteBytesRequestBody
         * @static
         * @param {fs.IWriteBytesRequestBody} message WriteBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteBytesRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a WriteBytesRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.WriteBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.WriteBytesRequestBody} WriteBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteBytesRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.WriteBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.bytes = reader.bytes();
                        break;
                    }
                case 3: {
                        message.flags = $root.fs.FileFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a WriteBytesRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.WriteBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.WriteBytesRequestBody} WriteBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteBytesRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a WriteBytesRequestBody message.
         * @function verify
         * @memberof fs.WriteBytesRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        WriteBytesRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                if (!(message.bytes && typeof message.bytes.length === "number" || $util.isString(message.bytes)))
                    return "bytes: buffer expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.fs.FileFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a WriteBytesRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.WriteBytesRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.WriteBytesRequestBody} WriteBytesRequestBody
         */
        WriteBytesRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.WriteBytesRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.WriteBytesRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.WriteBytesRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.bytes != null)
                if (typeof object.bytes === "string")
                    $util.base64.decode(object.bytes, message.bytes = $util.newBuffer($util.base64.length(object.bytes)), 0);
                else if (object.bytes.length >= 0)
                    message.bytes = object.bytes;
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.WriteBytesRequestBody.flags: object expected");
                message.flags = $root.fs.FileFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a WriteBytesRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.WriteBytesRequestBody
         * @static
         * @param {fs.WriteBytesRequestBody} message WriteBytesRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        WriteBytesRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                if (options.bytes === String)
                    object.bytes = "";
                else {
                    object.bytes = [];
                    if (options.bytes !== Array)
                        object.bytes = $util.newBuffer(object.bytes);
                }
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = options.bytes === String ? $util.base64.encode(message.bytes, 0, message.bytes.length) : options.bytes === Array ? Array.prototype.slice.call(message.bytes) : message.bytes;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.fs.FileFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this WriteBytesRequestBody to JSON.
         * @function toJSON
         * @memberof fs.WriteBytesRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        WriteBytesRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for WriteBytesRequestBody
         * @function getTypeUrl
         * @memberof fs.WriteBytesRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        WriteBytesRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.WriteBytesRequestBody";
        };

        return WriteBytesRequestBody;
    })();

    fs.VersionedWriteJsonFileRequestBody = (function() {

        /**
         * Properties of a VersionedWriteJsonFileRequestBody.
         * @memberof fs
         * @interface IVersionedWriteJsonFileRequestBody
         * @property {string|null} [path] VersionedWriteJsonFileRequestBody path
         * @property {string|null} [json] VersionedWriteJsonFileRequestBody json
         * @property {fs.IVersionedFileWriteFlags|null} [flags] VersionedWriteJsonFileRequestBody flags
         */

        /**
         * Constructs a new VersionedWriteJsonFileRequestBody.
         * @memberof fs
         * @classdesc Represents a VersionedWriteJsonFileRequestBody.
         * @implements IVersionedWriteJsonFileRequestBody
         * @constructor
         * @param {fs.IVersionedWriteJsonFileRequestBody=} [properties] Properties to set
         */
        function VersionedWriteJsonFileRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedWriteJsonFileRequestBody path.
         * @member {string} path
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @instance
         */
        VersionedWriteJsonFileRequestBody.prototype.path = "";

        /**
         * VersionedWriteJsonFileRequestBody json.
         * @member {string} json
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @instance
         */
        VersionedWriteJsonFileRequestBody.prototype.json = "";

        /**
         * VersionedWriteJsonFileRequestBody flags.
         * @member {fs.IVersionedFileWriteFlags|null|undefined} flags
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @instance
         */
        VersionedWriteJsonFileRequestBody.prototype.flags = null;

        /**
         * Creates a new VersionedWriteJsonFileRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @static
         * @param {fs.IVersionedWriteJsonFileRequestBody=} [properties] Properties to set
         * @returns {fs.VersionedWriteJsonFileRequestBody} VersionedWriteJsonFileRequestBody instance
         */
        VersionedWriteJsonFileRequestBody.create = function create(properties) {
            return new VersionedWriteJsonFileRequestBody(properties);
        };

        /**
         * Encodes the specified VersionedWriteJsonFileRequestBody message. Does not implicitly {@link fs.VersionedWriteJsonFileRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @static
         * @param {fs.IVersionedWriteJsonFileRequestBody} message VersionedWriteJsonFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedWriteJsonFileRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.json);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.fs.VersionedFileWriteFlags.encode(message.flags, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedWriteJsonFileRequestBody message, length delimited. Does not implicitly {@link fs.VersionedWriteJsonFileRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @static
         * @param {fs.IVersionedWriteJsonFileRequestBody} message VersionedWriteJsonFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedWriteJsonFileRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedWriteJsonFileRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.VersionedWriteJsonFileRequestBody} VersionedWriteJsonFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedWriteJsonFileRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedWriteJsonFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.json = reader.string();
                        break;
                    }
                case 3: {
                        message.flags = $root.fs.VersionedFileWriteFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedWriteJsonFileRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.VersionedWriteJsonFileRequestBody} VersionedWriteJsonFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedWriteJsonFileRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedWriteJsonFileRequestBody message.
         * @function verify
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedWriteJsonFileRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                if (!$util.isString(message.json))
                    return "json: string expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.fs.VersionedFileWriteFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedWriteJsonFileRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.VersionedWriteJsonFileRequestBody} VersionedWriteJsonFileRequestBody
         */
        VersionedWriteJsonFileRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.VersionedWriteJsonFileRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.VersionedWriteJsonFileRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.VersionedWriteJsonFileRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.json != null)
                message.json = String(object.json);
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.VersionedWriteJsonFileRequestBody.flags: object expected");
                message.flags = $root.fs.VersionedFileWriteFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedWriteJsonFileRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @static
         * @param {fs.VersionedWriteJsonFileRequestBody} message VersionedWriteJsonFileRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedWriteJsonFileRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.json = "";
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = message.json;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.fs.VersionedFileWriteFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedWriteJsonFileRequestBody to JSON.
         * @function toJSON
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedWriteJsonFileRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedWriteJsonFileRequestBody
         * @function getTypeUrl
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedWriteJsonFileRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.VersionedWriteJsonFileRequestBody";
        };

        return VersionedWriteJsonFileRequestBody;
    })();

    fs.VersionedFileWriteFlags = (function() {

        /**
         * Properties of a VersionedFileWriteFlags.
         * @memberof fs
         * @interface IVersionedFileWriteFlags
         * @property {common.IBooleanValue|null} [truncate] VersionedFileWriteFlags truncate
         * @property {common.IBooleanValue|null} [create] VersionedFileWriteFlags create
         * @property {common.IBooleanValue|null} [exclusive] VersionedFileWriteFlags exclusive
         * @property {common.IUInt64Value|null} [currentVersion] VersionedFileWriteFlags currentVersion
         */

        /**
         * Constructs a new VersionedFileWriteFlags.
         * @memberof fs
         * @classdesc Represents a VersionedFileWriteFlags.
         * @implements IVersionedFileWriteFlags
         * @constructor
         * @param {fs.IVersionedFileWriteFlags=} [properties] Properties to set
         */
        function VersionedFileWriteFlags(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedFileWriteFlags truncate.
         * @member {common.IBooleanValue|null|undefined} truncate
         * @memberof fs.VersionedFileWriteFlags
         * @instance
         */
        VersionedFileWriteFlags.prototype.truncate = null;

        /**
         * VersionedFileWriteFlags create.
         * @member {common.IBooleanValue|null|undefined} create
         * @memberof fs.VersionedFileWriteFlags
         * @instance
         */
        VersionedFileWriteFlags.prototype.create = null;

        /**
         * VersionedFileWriteFlags exclusive.
         * @member {common.IBooleanValue|null|undefined} exclusive
         * @memberof fs.VersionedFileWriteFlags
         * @instance
         */
        VersionedFileWriteFlags.prototype.exclusive = null;

        /**
         * VersionedFileWriteFlags currentVersion.
         * @member {common.IUInt64Value|null|undefined} currentVersion
         * @memberof fs.VersionedFileWriteFlags
         * @instance
         */
        VersionedFileWriteFlags.prototype.currentVersion = null;

        /**
         * Creates a new VersionedFileWriteFlags instance using the specified properties.
         * @function create
         * @memberof fs.VersionedFileWriteFlags
         * @static
         * @param {fs.IVersionedFileWriteFlags=} [properties] Properties to set
         * @returns {fs.VersionedFileWriteFlags} VersionedFileWriteFlags instance
         */
        VersionedFileWriteFlags.create = function create(properties) {
            return new VersionedFileWriteFlags(properties);
        };

        /**
         * Encodes the specified VersionedFileWriteFlags message. Does not implicitly {@link fs.VersionedFileWriteFlags.verify|verify} messages.
         * @function encode
         * @memberof fs.VersionedFileWriteFlags
         * @static
         * @param {fs.IVersionedFileWriteFlags} message VersionedFileWriteFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedFileWriteFlags.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.truncate != null && Object.hasOwnProperty.call(message, "truncate"))
                $root.common.BooleanValue.encode(message.truncate, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.create != null && Object.hasOwnProperty.call(message, "create"))
                $root.common.BooleanValue.encode(message.create, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive"))
                $root.common.BooleanValue.encode(message.exclusive, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                $root.common.UInt64Value.encode(message.currentVersion, writer.uint32(/* id 10, wireType 2 =*/82).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedFileWriteFlags message, length delimited. Does not implicitly {@link fs.VersionedFileWriteFlags.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.VersionedFileWriteFlags
         * @static
         * @param {fs.IVersionedFileWriteFlags} message VersionedFileWriteFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedFileWriteFlags.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedFileWriteFlags message from the specified reader or buffer.
         * @function decode
         * @memberof fs.VersionedFileWriteFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.VersionedFileWriteFlags} VersionedFileWriteFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedFileWriteFlags.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedFileWriteFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.truncate = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.create = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.exclusive = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 10: {
                        message.currentVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedFileWriteFlags message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.VersionedFileWriteFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.VersionedFileWriteFlags} VersionedFileWriteFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedFileWriteFlags.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedFileWriteFlags message.
         * @function verify
         * @memberof fs.VersionedFileWriteFlags
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedFileWriteFlags.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.truncate != null && Object.hasOwnProperty.call(message, "truncate")) {
                var error = $root.common.BooleanValue.verify(message.truncate, long + 1);
                if (error)
                    return "truncate." + error;
            }
            if (message.create != null && Object.hasOwnProperty.call(message, "create")) {
                var error = $root.common.BooleanValue.verify(message.create, long + 1);
                if (error)
                    return "create." + error;
            }
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive")) {
                var error = $root.common.BooleanValue.verify(message.exclusive, long + 1);
                if (error)
                    return "exclusive." + error;
            }
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion")) {
                var error = $root.common.UInt64Value.verify(message.currentVersion, long + 1);
                if (error)
                    return "currentVersion." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedFileWriteFlags message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.VersionedFileWriteFlags
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.VersionedFileWriteFlags} VersionedFileWriteFlags
         */
        VersionedFileWriteFlags.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.VersionedFileWriteFlags)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.VersionedFileWriteFlags: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.VersionedFileWriteFlags();
            if (object.truncate != null) {
                if (!$util.isObject(object.truncate))
                    throw TypeError(".fs.VersionedFileWriteFlags.truncate: object expected");
                message.truncate = $root.common.BooleanValue.fromObject(object.truncate, long + 1);
            }
            if (object.create != null) {
                if (!$util.isObject(object.create))
                    throw TypeError(".fs.VersionedFileWriteFlags.create: object expected");
                message.create = $root.common.BooleanValue.fromObject(object.create, long + 1);
            }
            if (object.exclusive != null) {
                if (!$util.isObject(object.exclusive))
                    throw TypeError(".fs.VersionedFileWriteFlags.exclusive: object expected");
                message.exclusive = $root.common.BooleanValue.fromObject(object.exclusive, long + 1);
            }
            if (object.currentVersion != null) {
                if (!$util.isObject(object.currentVersion))
                    throw TypeError(".fs.VersionedFileWriteFlags.currentVersion: object expected");
                message.currentVersion = $root.common.UInt64Value.fromObject(object.currentVersion, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedFileWriteFlags message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.VersionedFileWriteFlags
         * @static
         * @param {fs.VersionedFileWriteFlags} message VersionedFileWriteFlags
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedFileWriteFlags.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.truncate = null;
                object.create = null;
                object.exclusive = null;
                object.currentVersion = null;
            }
            if (message.truncate != null && Object.hasOwnProperty.call(message, "truncate"))
                object.truncate = $root.common.BooleanValue.toObject(message.truncate, options, q + 1);
            if (message.create != null && Object.hasOwnProperty.call(message, "create"))
                object.create = $root.common.BooleanValue.toObject(message.create, options, q + 1);
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive"))
                object.exclusive = $root.common.BooleanValue.toObject(message.exclusive, options, q + 1);
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                object.currentVersion = $root.common.UInt64Value.toObject(message.currentVersion, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedFileWriteFlags to JSON.
         * @function toJSON
         * @memberof fs.VersionedFileWriteFlags
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedFileWriteFlags.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedFileWriteFlags
         * @function getTypeUrl
         * @memberof fs.VersionedFileWriteFlags
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedFileWriteFlags.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.VersionedFileWriteFlags";
        };

        return VersionedFileWriteFlags;
    })();

    fs.VersionedWriteTxtFileRequestBody = (function() {

        /**
         * Properties of a VersionedWriteTxtFileRequestBody.
         * @memberof fs
         * @interface IVersionedWriteTxtFileRequestBody
         * @property {string|null} [path] VersionedWriteTxtFileRequestBody path
         * @property {string|null} [txt] VersionedWriteTxtFileRequestBody txt
         * @property {fs.IVersionedFileWriteFlags|null} [flags] VersionedWriteTxtFileRequestBody flags
         */

        /**
         * Constructs a new VersionedWriteTxtFileRequestBody.
         * @memberof fs
         * @classdesc Represents a VersionedWriteTxtFileRequestBody.
         * @implements IVersionedWriteTxtFileRequestBody
         * @constructor
         * @param {fs.IVersionedWriteTxtFileRequestBody=} [properties] Properties to set
         */
        function VersionedWriteTxtFileRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedWriteTxtFileRequestBody path.
         * @member {string} path
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @instance
         */
        VersionedWriteTxtFileRequestBody.prototype.path = "";

        /**
         * VersionedWriteTxtFileRequestBody txt.
         * @member {string} txt
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @instance
         */
        VersionedWriteTxtFileRequestBody.prototype.txt = "";

        /**
         * VersionedWriteTxtFileRequestBody flags.
         * @member {fs.IVersionedFileWriteFlags|null|undefined} flags
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @instance
         */
        VersionedWriteTxtFileRequestBody.prototype.flags = null;

        /**
         * Creates a new VersionedWriteTxtFileRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @static
         * @param {fs.IVersionedWriteTxtFileRequestBody=} [properties] Properties to set
         * @returns {fs.VersionedWriteTxtFileRequestBody} VersionedWriteTxtFileRequestBody instance
         */
        VersionedWriteTxtFileRequestBody.create = function create(properties) {
            return new VersionedWriteTxtFileRequestBody(properties);
        };

        /**
         * Encodes the specified VersionedWriteTxtFileRequestBody message. Does not implicitly {@link fs.VersionedWriteTxtFileRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @static
         * @param {fs.IVersionedWriteTxtFileRequestBody} message VersionedWriteTxtFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedWriteTxtFileRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.txt);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.fs.VersionedFileWriteFlags.encode(message.flags, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedWriteTxtFileRequestBody message, length delimited. Does not implicitly {@link fs.VersionedWriteTxtFileRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @static
         * @param {fs.IVersionedWriteTxtFileRequestBody} message VersionedWriteTxtFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedWriteTxtFileRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedWriteTxtFileRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.VersionedWriteTxtFileRequestBody} VersionedWriteTxtFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedWriteTxtFileRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedWriteTxtFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.txt = reader.string();
                        break;
                    }
                case 3: {
                        message.flags = $root.fs.VersionedFileWriteFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedWriteTxtFileRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.VersionedWriteTxtFileRequestBody} VersionedWriteTxtFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedWriteTxtFileRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedWriteTxtFileRequestBody message.
         * @function verify
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedWriteTxtFileRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                if (!$util.isString(message.txt))
                    return "txt: string expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.fs.VersionedFileWriteFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedWriteTxtFileRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.VersionedWriteTxtFileRequestBody} VersionedWriteTxtFileRequestBody
         */
        VersionedWriteTxtFileRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.VersionedWriteTxtFileRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.VersionedWriteTxtFileRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.VersionedWriteTxtFileRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.txt != null)
                message.txt = String(object.txt);
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.VersionedWriteTxtFileRequestBody.flags: object expected");
                message.flags = $root.fs.VersionedFileWriteFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedWriteTxtFileRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @static
         * @param {fs.VersionedWriteTxtFileRequestBody} message VersionedWriteTxtFileRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedWriteTxtFileRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.txt = "";
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                object.txt = message.txt;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.fs.VersionedFileWriteFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedWriteTxtFileRequestBody to JSON.
         * @function toJSON
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedWriteTxtFileRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedWriteTxtFileRequestBody
         * @function getTypeUrl
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedWriteTxtFileRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.VersionedWriteTxtFileRequestBody";
        };

        return VersionedWriteTxtFileRequestBody;
    })();

    fs.VersionedWriteBytesRequestBody = (function() {

        /**
         * Properties of a VersionedWriteBytesRequestBody.
         * @memberof fs
         * @interface IVersionedWriteBytesRequestBody
         * @property {string|null} [path] VersionedWriteBytesRequestBody path
         * @property {Uint8Array|null} [bytes] VersionedWriteBytesRequestBody bytes
         * @property {fs.IVersionedFileWriteFlags|null} [flags] VersionedWriteBytesRequestBody flags
         */

        /**
         * Constructs a new VersionedWriteBytesRequestBody.
         * @memberof fs
         * @classdesc Represents a VersionedWriteBytesRequestBody.
         * @implements IVersionedWriteBytesRequestBody
         * @constructor
         * @param {fs.IVersionedWriteBytesRequestBody=} [properties] Properties to set
         */
        function VersionedWriteBytesRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedWriteBytesRequestBody path.
         * @member {string} path
         * @memberof fs.VersionedWriteBytesRequestBody
         * @instance
         */
        VersionedWriteBytesRequestBody.prototype.path = "";

        /**
         * VersionedWriteBytesRequestBody bytes.
         * @member {Uint8Array} bytes
         * @memberof fs.VersionedWriteBytesRequestBody
         * @instance
         */
        VersionedWriteBytesRequestBody.prototype.bytes = $util.newBuffer([]);

        /**
         * VersionedWriteBytesRequestBody flags.
         * @member {fs.IVersionedFileWriteFlags|null|undefined} flags
         * @memberof fs.VersionedWriteBytesRequestBody
         * @instance
         */
        VersionedWriteBytesRequestBody.prototype.flags = null;

        /**
         * Creates a new VersionedWriteBytesRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.VersionedWriteBytesRequestBody
         * @static
         * @param {fs.IVersionedWriteBytesRequestBody=} [properties] Properties to set
         * @returns {fs.VersionedWriteBytesRequestBody} VersionedWriteBytesRequestBody instance
         */
        VersionedWriteBytesRequestBody.create = function create(properties) {
            return new VersionedWriteBytesRequestBody(properties);
        };

        /**
         * Encodes the specified VersionedWriteBytesRequestBody message. Does not implicitly {@link fs.VersionedWriteBytesRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.VersionedWriteBytesRequestBody
         * @static
         * @param {fs.IVersionedWriteBytesRequestBody} message VersionedWriteBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedWriteBytesRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.bytes);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.fs.VersionedFileWriteFlags.encode(message.flags, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedWriteBytesRequestBody message, length delimited. Does not implicitly {@link fs.VersionedWriteBytesRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.VersionedWriteBytesRequestBody
         * @static
         * @param {fs.IVersionedWriteBytesRequestBody} message VersionedWriteBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedWriteBytesRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedWriteBytesRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.VersionedWriteBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.VersionedWriteBytesRequestBody} VersionedWriteBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedWriteBytesRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedWriteBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.bytes = reader.bytes();
                        break;
                    }
                case 3: {
                        message.flags = $root.fs.VersionedFileWriteFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedWriteBytesRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.VersionedWriteBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.VersionedWriteBytesRequestBody} VersionedWriteBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedWriteBytesRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedWriteBytesRequestBody message.
         * @function verify
         * @memberof fs.VersionedWriteBytesRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedWriteBytesRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                if (!(message.bytes && typeof message.bytes.length === "number" || $util.isString(message.bytes)))
                    return "bytes: buffer expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.fs.VersionedFileWriteFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedWriteBytesRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.VersionedWriteBytesRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.VersionedWriteBytesRequestBody} VersionedWriteBytesRequestBody
         */
        VersionedWriteBytesRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.VersionedWriteBytesRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.VersionedWriteBytesRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.VersionedWriteBytesRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.bytes != null)
                if (typeof object.bytes === "string")
                    $util.base64.decode(object.bytes, message.bytes = $util.newBuffer($util.base64.length(object.bytes)), 0);
                else if (object.bytes.length >= 0)
                    message.bytes = object.bytes;
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.VersionedWriteBytesRequestBody.flags: object expected");
                message.flags = $root.fs.VersionedFileWriteFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedWriteBytesRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.VersionedWriteBytesRequestBody
         * @static
         * @param {fs.VersionedWriteBytesRequestBody} message VersionedWriteBytesRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedWriteBytesRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                if (options.bytes === String)
                    object.bytes = "";
                else {
                    object.bytes = [];
                    if (options.bytes !== Array)
                        object.bytes = $util.newBuffer(object.bytes);
                }
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = options.bytes === String ? $util.base64.encode(message.bytes, 0, message.bytes.length) : options.bytes === Array ? Array.prototype.slice.call(message.bytes) : message.bytes;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.fs.VersionedFileWriteFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedWriteBytesRequestBody to JSON.
         * @function toJSON
         * @memberof fs.VersionedWriteBytesRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedWriteBytesRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedWriteBytesRequestBody
         * @function getTypeUrl
         * @memberof fs.VersionedWriteBytesRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedWriteBytesRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.VersionedWriteBytesRequestBody";
        };

        return VersionedWriteBytesRequestBody;
    })();

    fs.VersionedGetByteSinkRequestBody = (function() {

        /**
         * Properties of a VersionedGetByteSinkRequestBody.
         * @memberof fs
         * @interface IVersionedGetByteSinkRequestBody
         * @property {string|null} [path] VersionedGetByteSinkRequestBody path
         * @property {fs.IVersionedFileWriteFlags|null} [flags] VersionedGetByteSinkRequestBody flags
         */

        /**
         * Constructs a new VersionedGetByteSinkRequestBody.
         * @memberof fs
         * @classdesc Represents a VersionedGetByteSinkRequestBody.
         * @implements IVersionedGetByteSinkRequestBody
         * @constructor
         * @param {fs.IVersionedGetByteSinkRequestBody=} [properties] Properties to set
         */
        function VersionedGetByteSinkRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedGetByteSinkRequestBody path.
         * @member {string} path
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @instance
         */
        VersionedGetByteSinkRequestBody.prototype.path = "";

        /**
         * VersionedGetByteSinkRequestBody flags.
         * @member {fs.IVersionedFileWriteFlags|null|undefined} flags
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @instance
         */
        VersionedGetByteSinkRequestBody.prototype.flags = null;

        /**
         * Creates a new VersionedGetByteSinkRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @static
         * @param {fs.IVersionedGetByteSinkRequestBody=} [properties] Properties to set
         * @returns {fs.VersionedGetByteSinkRequestBody} VersionedGetByteSinkRequestBody instance
         */
        VersionedGetByteSinkRequestBody.create = function create(properties) {
            return new VersionedGetByteSinkRequestBody(properties);
        };

        /**
         * Encodes the specified VersionedGetByteSinkRequestBody message. Does not implicitly {@link fs.VersionedGetByteSinkRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @static
         * @param {fs.IVersionedGetByteSinkRequestBody} message VersionedGetByteSinkRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetByteSinkRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.fs.VersionedFileWriteFlags.encode(message.flags, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedGetByteSinkRequestBody message, length delimited. Does not implicitly {@link fs.VersionedGetByteSinkRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @static
         * @param {fs.IVersionedGetByteSinkRequestBody} message VersionedGetByteSinkRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetByteSinkRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedGetByteSinkRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.VersionedGetByteSinkRequestBody} VersionedGetByteSinkRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetByteSinkRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedGetByteSinkRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.flags = $root.fs.VersionedFileWriteFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedGetByteSinkRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.VersionedGetByteSinkRequestBody} VersionedGetByteSinkRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetByteSinkRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedGetByteSinkRequestBody message.
         * @function verify
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedGetByteSinkRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.fs.VersionedFileWriteFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedGetByteSinkRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.VersionedGetByteSinkRequestBody} VersionedGetByteSinkRequestBody
         */
        VersionedGetByteSinkRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.VersionedGetByteSinkRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.VersionedGetByteSinkRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.VersionedGetByteSinkRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.VersionedGetByteSinkRequestBody.flags: object expected");
                message.flags = $root.fs.VersionedFileWriteFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedGetByteSinkRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @static
         * @param {fs.VersionedGetByteSinkRequestBody} message VersionedGetByteSinkRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedGetByteSinkRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.fs.VersionedFileWriteFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedGetByteSinkRequestBody to JSON.
         * @function toJSON
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedGetByteSinkRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedGetByteSinkRequestBody
         * @function getTypeUrl
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedGetByteSinkRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.VersionedGetByteSinkRequestBody";
        };

        return VersionedGetByteSinkRequestBody;
    })();

    fs.ArchiveCurrentRequestBody = (function() {

        /**
         * Properties of an ArchiveCurrentRequestBody.
         * @memberof fs
         * @interface IArchiveCurrentRequestBody
         * @property {string|null} [path] ArchiveCurrentRequestBody path
         * @property {common.IUInt64Value|null} [version] ArchiveCurrentRequestBody version
         */

        /**
         * Constructs a new ArchiveCurrentRequestBody.
         * @memberof fs
         * @classdesc Represents an ArchiveCurrentRequestBody.
         * @implements IArchiveCurrentRequestBody
         * @constructor
         * @param {fs.IArchiveCurrentRequestBody=} [properties] Properties to set
         */
        function ArchiveCurrentRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ArchiveCurrentRequestBody path.
         * @member {string} path
         * @memberof fs.ArchiveCurrentRequestBody
         * @instance
         */
        ArchiveCurrentRequestBody.prototype.path = "";

        /**
         * ArchiveCurrentRequestBody version.
         * @member {common.IUInt64Value|null|undefined} version
         * @memberof fs.ArchiveCurrentRequestBody
         * @instance
         */
        ArchiveCurrentRequestBody.prototype.version = null;

        /**
         * Creates a new ArchiveCurrentRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.ArchiveCurrentRequestBody
         * @static
         * @param {fs.IArchiveCurrentRequestBody=} [properties] Properties to set
         * @returns {fs.ArchiveCurrentRequestBody} ArchiveCurrentRequestBody instance
         */
        ArchiveCurrentRequestBody.create = function create(properties) {
            return new ArchiveCurrentRequestBody(properties);
        };

        /**
         * Encodes the specified ArchiveCurrentRequestBody message. Does not implicitly {@link fs.ArchiveCurrentRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.ArchiveCurrentRequestBody
         * @static
         * @param {fs.IArchiveCurrentRequestBody} message ArchiveCurrentRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ArchiveCurrentRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                $root.common.UInt64Value.encode(message.version, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified ArchiveCurrentRequestBody message, length delimited. Does not implicitly {@link fs.ArchiveCurrentRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.ArchiveCurrentRequestBody
         * @static
         * @param {fs.IArchiveCurrentRequestBody} message ArchiveCurrentRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ArchiveCurrentRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an ArchiveCurrentRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.ArchiveCurrentRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.ArchiveCurrentRequestBody} ArchiveCurrentRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ArchiveCurrentRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.ArchiveCurrentRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.version = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an ArchiveCurrentRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.ArchiveCurrentRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.ArchiveCurrentRequestBody} ArchiveCurrentRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ArchiveCurrentRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an ArchiveCurrentRequestBody message.
         * @function verify
         * @memberof fs.ArchiveCurrentRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ArchiveCurrentRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.version != null && Object.hasOwnProperty.call(message, "version")) {
                var error = $root.common.UInt64Value.verify(message.version, long + 1);
                if (error)
                    return "version." + error;
            }
            return null;
        };

        /**
         * Creates an ArchiveCurrentRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.ArchiveCurrentRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.ArchiveCurrentRequestBody} ArchiveCurrentRequestBody
         */
        ArchiveCurrentRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.ArchiveCurrentRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.ArchiveCurrentRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.ArchiveCurrentRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.version != null) {
                if (!$util.isObject(object.version))
                    throw TypeError(".fs.ArchiveCurrentRequestBody.version: object expected");
                message.version = $root.common.UInt64Value.fromObject(object.version, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an ArchiveCurrentRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.ArchiveCurrentRequestBody
         * @static
         * @param {fs.ArchiveCurrentRequestBody} message ArchiveCurrentRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ArchiveCurrentRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.version = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                object.version = $root.common.UInt64Value.toObject(message.version, options, q + 1);
            return object;
        };

        /**
         * Converts this ArchiveCurrentRequestBody to JSON.
         * @function toJSON
         * @memberof fs.ArchiveCurrentRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ArchiveCurrentRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ArchiveCurrentRequestBody
         * @function getTypeUrl
         * @memberof fs.ArchiveCurrentRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ArchiveCurrentRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.ArchiveCurrentRequestBody";
        };

        return ArchiveCurrentRequestBody;
    })();

    fs.FSSyncStatusRequestBody = (function() {

        /**
         * Properties of a FSSyncStatusRequestBody.
         * @memberof fs
         * @interface IFSSyncStatusRequestBody
         * @property {string|null} [path] FSSyncStatusRequestBody path
         * @property {boolean|null} [skipServerCheck] FSSyncStatusRequestBody skipServerCheck
         */

        /**
         * Constructs a new FSSyncStatusRequestBody.
         * @memberof fs
         * @classdesc Represents a FSSyncStatusRequestBody.
         * @implements IFSSyncStatusRequestBody
         * @constructor
         * @param {fs.IFSSyncStatusRequestBody=} [properties] Properties to set
         */
        function FSSyncStatusRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FSSyncStatusRequestBody path.
         * @member {string} path
         * @memberof fs.FSSyncStatusRequestBody
         * @instance
         */
        FSSyncStatusRequestBody.prototype.path = "";

        /**
         * FSSyncStatusRequestBody skipServerCheck.
         * @member {boolean} skipServerCheck
         * @memberof fs.FSSyncStatusRequestBody
         * @instance
         */
        FSSyncStatusRequestBody.prototype.skipServerCheck = false;

        /**
         * Creates a new FSSyncStatusRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.FSSyncStatusRequestBody
         * @static
         * @param {fs.IFSSyncStatusRequestBody=} [properties] Properties to set
         * @returns {fs.FSSyncStatusRequestBody} FSSyncStatusRequestBody instance
         */
        FSSyncStatusRequestBody.create = function create(properties) {
            return new FSSyncStatusRequestBody(properties);
        };

        /**
         * Encodes the specified FSSyncStatusRequestBody message. Does not implicitly {@link fs.FSSyncStatusRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.FSSyncStatusRequestBody
         * @static
         * @param {fs.IFSSyncStatusRequestBody} message FSSyncStatusRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncStatusRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.skipServerCheck != null && Object.hasOwnProperty.call(message, "skipServerCheck"))
                writer.uint32(/* id 2, wireType 0 =*/16).bool(message.skipServerCheck);
            return writer;
        };

        /**
         * Encodes the specified FSSyncStatusRequestBody message, length delimited. Does not implicitly {@link fs.FSSyncStatusRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FSSyncStatusRequestBody
         * @static
         * @param {fs.IFSSyncStatusRequestBody} message FSSyncStatusRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncStatusRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FSSyncStatusRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FSSyncStatusRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FSSyncStatusRequestBody} FSSyncStatusRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSSyncStatusRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSSyncStatusRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.skipServerCheck = reader.bool();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FSSyncStatusRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FSSyncStatusRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FSSyncStatusRequestBody} FSSyncStatusRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSSyncStatusRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FSSyncStatusRequestBody message.
         * @function verify
         * @memberof fs.FSSyncStatusRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSSyncStatusRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.skipServerCheck != null && Object.hasOwnProperty.call(message, "skipServerCheck"))
                if (typeof message.skipServerCheck !== "boolean")
                    return "skipServerCheck: boolean expected";
            return null;
        };

        /**
         * Creates a FSSyncStatusRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSSyncStatusRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSSyncStatusRequestBody} FSSyncStatusRequestBody
         */
        FSSyncStatusRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FSSyncStatusRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FSSyncStatusRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FSSyncStatusRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.skipServerCheck != null)
                message.skipServerCheck = Boolean(object.skipServerCheck);
            return message;
        };

        /**
         * Creates a plain object from a FSSyncStatusRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSSyncStatusRequestBody
         * @static
         * @param {fs.FSSyncStatusRequestBody} message FSSyncStatusRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSSyncStatusRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.skipServerCheck = false;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.skipServerCheck != null && Object.hasOwnProperty.call(message, "skipServerCheck"))
                object.skipServerCheck = message.skipServerCheck;
            return object;
        };

        /**
         * Converts this FSSyncStatusRequestBody to JSON.
         * @function toJSON
         * @memberof fs.FSSyncStatusRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FSSyncStatusRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FSSyncStatusRequestBody
         * @function getTypeUrl
         * @memberof fs.FSSyncStatusRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FSSyncStatusRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FSSyncStatusRequestBody";
        };

        return FSSyncStatusRequestBody;
    })();

    fs.FSSyncIsOnDiskRequestBody = (function() {

        /**
         * Properties of a FSSyncIsOnDiskRequestBody.
         * @memberof fs
         * @interface IFSSyncIsOnDiskRequestBody
         * @property {string|null} [path] FSSyncIsOnDiskRequestBody path
         * @property {number|Long|null} [version] FSSyncIsOnDiskRequestBody version
         */

        /**
         * Constructs a new FSSyncIsOnDiskRequestBody.
         * @memberof fs
         * @classdesc Represents a FSSyncIsOnDiskRequestBody.
         * @implements IFSSyncIsOnDiskRequestBody
         * @constructor
         * @param {fs.IFSSyncIsOnDiskRequestBody=} [properties] Properties to set
         */
        function FSSyncIsOnDiskRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FSSyncIsOnDiskRequestBody path.
         * @member {string} path
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @instance
         */
        FSSyncIsOnDiskRequestBody.prototype.path = "";

        /**
         * FSSyncIsOnDiskRequestBody version.
         * @member {number|Long} version
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @instance
         */
        FSSyncIsOnDiskRequestBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new FSSyncIsOnDiskRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @static
         * @param {fs.IFSSyncIsOnDiskRequestBody=} [properties] Properties to set
         * @returns {fs.FSSyncIsOnDiskRequestBody} FSSyncIsOnDiskRequestBody instance
         */
        FSSyncIsOnDiskRequestBody.create = function create(properties) {
            return new FSSyncIsOnDiskRequestBody(properties);
        };

        /**
         * Encodes the specified FSSyncIsOnDiskRequestBody message. Does not implicitly {@link fs.FSSyncIsOnDiskRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @static
         * @param {fs.IFSSyncIsOnDiskRequestBody} message FSSyncIsOnDiskRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncIsOnDiskRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.version);
            return writer;
        };

        /**
         * Encodes the specified FSSyncIsOnDiskRequestBody message, length delimited. Does not implicitly {@link fs.FSSyncIsOnDiskRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @static
         * @param {fs.IFSSyncIsOnDiskRequestBody} message FSSyncIsOnDiskRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncIsOnDiskRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FSSyncIsOnDiskRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FSSyncIsOnDiskRequestBody} FSSyncIsOnDiskRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSSyncIsOnDiskRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSSyncIsOnDiskRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.version = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FSSyncIsOnDiskRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FSSyncIsOnDiskRequestBody} FSSyncIsOnDiskRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSSyncIsOnDiskRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FSSyncIsOnDiskRequestBody message.
         * @function verify
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSSyncIsOnDiskRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            return null;
        };

        /**
         * Creates a FSSyncIsOnDiskRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSSyncIsOnDiskRequestBody} FSSyncIsOnDiskRequestBody
         */
        FSSyncIsOnDiskRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FSSyncIsOnDiskRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FSSyncIsOnDiskRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FSSyncIsOnDiskRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from a FSSyncIsOnDiskRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @static
         * @param {fs.FSSyncIsOnDiskRequestBody} message FSSyncIsOnDiskRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSSyncIsOnDiskRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            return object;
        };

        /**
         * Converts this FSSyncIsOnDiskRequestBody to JSON.
         * @function toJSON
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FSSyncIsOnDiskRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FSSyncIsOnDiskRequestBody
         * @function getTypeUrl
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FSSyncIsOnDiskRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FSSyncIsOnDiskRequestBody";
        };

        return FSSyncIsOnDiskRequestBody;
    })();

    fs.FSSyncIsOnDiskReplyBody = (function() {

        /**
         * Properties of a FSSyncIsOnDiskReplyBody.
         * @memberof fs
         * @interface IFSSyncIsOnDiskReplyBody
         * @property {string|null} [status] FSSyncIsOnDiskReplyBody status
         */

        /**
         * Constructs a new FSSyncIsOnDiskReplyBody.
         * @memberof fs
         * @classdesc Represents a FSSyncIsOnDiskReplyBody.
         * @implements IFSSyncIsOnDiskReplyBody
         * @constructor
         * @param {fs.IFSSyncIsOnDiskReplyBody=} [properties] Properties to set
         */
        function FSSyncIsOnDiskReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FSSyncIsOnDiskReplyBody status.
         * @member {string} status
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @instance
         */
        FSSyncIsOnDiskReplyBody.prototype.status = "";

        /**
         * Creates a new FSSyncIsOnDiskReplyBody instance using the specified properties.
         * @function create
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @static
         * @param {fs.IFSSyncIsOnDiskReplyBody=} [properties] Properties to set
         * @returns {fs.FSSyncIsOnDiskReplyBody} FSSyncIsOnDiskReplyBody instance
         */
        FSSyncIsOnDiskReplyBody.create = function create(properties) {
            return new FSSyncIsOnDiskReplyBody(properties);
        };

        /**
         * Encodes the specified FSSyncIsOnDiskReplyBody message. Does not implicitly {@link fs.FSSyncIsOnDiskReplyBody.verify|verify} messages.
         * @function encode
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @static
         * @param {fs.IFSSyncIsOnDiskReplyBody} message FSSyncIsOnDiskReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncIsOnDiskReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.status != null && Object.hasOwnProperty.call(message, "status"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.status);
            return writer;
        };

        /**
         * Encodes the specified FSSyncIsOnDiskReplyBody message, length delimited. Does not implicitly {@link fs.FSSyncIsOnDiskReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @static
         * @param {fs.IFSSyncIsOnDiskReplyBody} message FSSyncIsOnDiskReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncIsOnDiskReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FSSyncIsOnDiskReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FSSyncIsOnDiskReplyBody} FSSyncIsOnDiskReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSSyncIsOnDiskReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSSyncIsOnDiskReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.status = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FSSyncIsOnDiskReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FSSyncIsOnDiskReplyBody} FSSyncIsOnDiskReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSSyncIsOnDiskReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FSSyncIsOnDiskReplyBody message.
         * @function verify
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSSyncIsOnDiskReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.status != null && Object.hasOwnProperty.call(message, "status"))
                if (!$util.isString(message.status))
                    return "status: string expected";
            return null;
        };

        /**
         * Creates a FSSyncIsOnDiskReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSSyncIsOnDiskReplyBody} FSSyncIsOnDiskReplyBody
         */
        FSSyncIsOnDiskReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FSSyncIsOnDiskReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FSSyncIsOnDiskReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FSSyncIsOnDiskReplyBody();
            if (object.status != null)
                message.status = String(object.status);
            return message;
        };

        /**
         * Creates a plain object from a FSSyncIsOnDiskReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @static
         * @param {fs.FSSyncIsOnDiskReplyBody} message FSSyncIsOnDiskReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSSyncIsOnDiskReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.status = "";
            if (message.status != null && Object.hasOwnProperty.call(message, "status"))
                object.status = message.status;
            return object;
        };

        /**
         * Converts this FSSyncIsOnDiskReplyBody to JSON.
         * @function toJSON
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FSSyncIsOnDiskReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FSSyncIsOnDiskReplyBody
         * @function getTypeUrl
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FSSyncIsOnDiskReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FSSyncIsOnDiskReplyBody";
        };

        return FSSyncIsOnDiskReplyBody;
    })();

    fs.FSSyncStartDownloadRequestBody = (function() {

        /**
         * Properties of a FSSyncStartDownloadRequestBody.
         * @memberof fs
         * @interface IFSSyncStartDownloadRequestBody
         * @property {string|null} [path] FSSyncStartDownloadRequestBody path
         * @property {number|Long|null} [version] FSSyncStartDownloadRequestBody version
         */

        /**
         * Constructs a new FSSyncStartDownloadRequestBody.
         * @memberof fs
         * @classdesc Represents a FSSyncStartDownloadRequestBody.
         * @implements IFSSyncStartDownloadRequestBody
         * @constructor
         * @param {fs.IFSSyncStartDownloadRequestBody=} [properties] Properties to set
         */
        function FSSyncStartDownloadRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FSSyncStartDownloadRequestBody path.
         * @member {string} path
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @instance
         */
        FSSyncStartDownloadRequestBody.prototype.path = "";

        /**
         * FSSyncStartDownloadRequestBody version.
         * @member {number|Long} version
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @instance
         */
        FSSyncStartDownloadRequestBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new FSSyncStartDownloadRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @static
         * @param {fs.IFSSyncStartDownloadRequestBody=} [properties] Properties to set
         * @returns {fs.FSSyncStartDownloadRequestBody} FSSyncStartDownloadRequestBody instance
         */
        FSSyncStartDownloadRequestBody.create = function create(properties) {
            return new FSSyncStartDownloadRequestBody(properties);
        };

        /**
         * Encodes the specified FSSyncStartDownloadRequestBody message. Does not implicitly {@link fs.FSSyncStartDownloadRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @static
         * @param {fs.IFSSyncStartDownloadRequestBody} message FSSyncStartDownloadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncStartDownloadRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.version);
            return writer;
        };

        /**
         * Encodes the specified FSSyncStartDownloadRequestBody message, length delimited. Does not implicitly {@link fs.FSSyncStartDownloadRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @static
         * @param {fs.IFSSyncStartDownloadRequestBody} message FSSyncStartDownloadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncStartDownloadRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FSSyncStartDownloadRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FSSyncStartDownloadRequestBody} FSSyncStartDownloadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSSyncStartDownloadRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSSyncStartDownloadRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.version = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FSSyncStartDownloadRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FSSyncStartDownloadRequestBody} FSSyncStartDownloadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSSyncStartDownloadRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FSSyncStartDownloadRequestBody message.
         * @function verify
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSSyncStartDownloadRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            return null;
        };

        /**
         * Creates a FSSyncStartDownloadRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSSyncStartDownloadRequestBody} FSSyncStartDownloadRequestBody
         */
        FSSyncStartDownloadRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FSSyncStartDownloadRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FSSyncStartDownloadRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FSSyncStartDownloadRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from a FSSyncStartDownloadRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @static
         * @param {fs.FSSyncStartDownloadRequestBody} message FSSyncStartDownloadRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSSyncStartDownloadRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            return object;
        };

        /**
         * Converts this FSSyncStartDownloadRequestBody to JSON.
         * @function toJSON
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FSSyncStartDownloadRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FSSyncStartDownloadRequestBody
         * @function getTypeUrl
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FSSyncStartDownloadRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FSSyncStartDownloadRequestBody";
        };

        return FSSyncStartDownloadRequestBody;
    })();

    fs.AdoptRemoteRequestBody = (function() {

        /**
         * Properties of an AdoptRemoteRequestBody.
         * @memberof fs
         * @interface IAdoptRemoteRequestBody
         * @property {string|null} [path] AdoptRemoteRequestBody path
         * @property {file.IOptionsToAdopteRemote|null} [opts] AdoptRemoteRequestBody opts
         */

        /**
         * Constructs a new AdoptRemoteRequestBody.
         * @memberof fs
         * @classdesc Represents an AdoptRemoteRequestBody.
         * @implements IAdoptRemoteRequestBody
         * @constructor
         * @param {fs.IAdoptRemoteRequestBody=} [properties] Properties to set
         */
        function AdoptRemoteRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * AdoptRemoteRequestBody path.
         * @member {string} path
         * @memberof fs.AdoptRemoteRequestBody
         * @instance
         */
        AdoptRemoteRequestBody.prototype.path = "";

        /**
         * AdoptRemoteRequestBody opts.
         * @member {file.IOptionsToAdopteRemote|null|undefined} opts
         * @memberof fs.AdoptRemoteRequestBody
         * @instance
         */
        AdoptRemoteRequestBody.prototype.opts = null;

        /**
         * Creates a new AdoptRemoteRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.AdoptRemoteRequestBody
         * @static
         * @param {fs.IAdoptRemoteRequestBody=} [properties] Properties to set
         * @returns {fs.AdoptRemoteRequestBody} AdoptRemoteRequestBody instance
         */
        AdoptRemoteRequestBody.create = function create(properties) {
            return new AdoptRemoteRequestBody(properties);
        };

        /**
         * Encodes the specified AdoptRemoteRequestBody message. Does not implicitly {@link fs.AdoptRemoteRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.AdoptRemoteRequestBody
         * @static
         * @param {fs.IAdoptRemoteRequestBody} message AdoptRemoteRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AdoptRemoteRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.file.OptionsToAdopteRemote.encode(message.opts, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified AdoptRemoteRequestBody message, length delimited. Does not implicitly {@link fs.AdoptRemoteRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.AdoptRemoteRequestBody
         * @static
         * @param {fs.IAdoptRemoteRequestBody} message AdoptRemoteRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AdoptRemoteRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an AdoptRemoteRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.AdoptRemoteRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.AdoptRemoteRequestBody} AdoptRemoteRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AdoptRemoteRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.AdoptRemoteRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.opts = $root.file.OptionsToAdopteRemote.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an AdoptRemoteRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.AdoptRemoteRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.AdoptRemoteRequestBody} AdoptRemoteRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AdoptRemoteRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an AdoptRemoteRequestBody message.
         * @function verify
         * @memberof fs.AdoptRemoteRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        AdoptRemoteRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts")) {
                var error = $root.file.OptionsToAdopteRemote.verify(message.opts, long + 1);
                if (error)
                    return "opts." + error;
            }
            return null;
        };

        /**
         * Creates an AdoptRemoteRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.AdoptRemoteRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.AdoptRemoteRequestBody} AdoptRemoteRequestBody
         */
        AdoptRemoteRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.AdoptRemoteRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.AdoptRemoteRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.AdoptRemoteRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.opts != null) {
                if (!$util.isObject(object.opts))
                    throw TypeError(".fs.AdoptRemoteRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToAdopteRemote.fromObject(object.opts, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an AdoptRemoteRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.AdoptRemoteRequestBody
         * @static
         * @param {fs.AdoptRemoteRequestBody} message AdoptRemoteRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        AdoptRemoteRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.opts = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                object.opts = $root.file.OptionsToAdopteRemote.toObject(message.opts, options, q + 1);
            return object;
        };

        /**
         * Converts this AdoptRemoteRequestBody to JSON.
         * @function toJSON
         * @memberof fs.AdoptRemoteRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        AdoptRemoteRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for AdoptRemoteRequestBody
         * @function getTypeUrl
         * @memberof fs.AdoptRemoteRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        AdoptRemoteRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.AdoptRemoteRequestBody";
        };

        return AdoptRemoteRequestBody;
    })();

    fs.DiffCurrentAndRemoteFileVersionsRequestBody = (function() {

        /**
         * Properties of a DiffCurrentAndRemoteFileVersionsRequestBody.
         * @memberof fs
         * @interface IDiffCurrentAndRemoteFileVersionsRequestBody
         * @property {string|null} [path] DiffCurrentAndRemoteFileVersionsRequestBody path
         * @property {file.IOptionsToDiffFileVersions|null} [opts] DiffCurrentAndRemoteFileVersionsRequestBody opts
         */

        /**
         * Constructs a new DiffCurrentAndRemoteFileVersionsRequestBody.
         * @memberof fs
         * @classdesc Represents a DiffCurrentAndRemoteFileVersionsRequestBody.
         * @implements IDiffCurrentAndRemoteFileVersionsRequestBody
         * @constructor
         * @param {fs.IDiffCurrentAndRemoteFileVersionsRequestBody=} [properties] Properties to set
         */
        function DiffCurrentAndRemoteFileVersionsRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * DiffCurrentAndRemoteFileVersionsRequestBody path.
         * @member {string} path
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @instance
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.prototype.path = "";

        /**
         * DiffCurrentAndRemoteFileVersionsRequestBody opts.
         * @member {file.IOptionsToDiffFileVersions|null|undefined} opts
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @instance
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.prototype.opts = null;

        /**
         * Creates a new DiffCurrentAndRemoteFileVersionsRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @static
         * @param {fs.IDiffCurrentAndRemoteFileVersionsRequestBody=} [properties] Properties to set
         * @returns {fs.DiffCurrentAndRemoteFileVersionsRequestBody} DiffCurrentAndRemoteFileVersionsRequestBody instance
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.create = function create(properties) {
            return new DiffCurrentAndRemoteFileVersionsRequestBody(properties);
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteFileVersionsRequestBody message. Does not implicitly {@link fs.DiffCurrentAndRemoteFileVersionsRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @static
         * @param {fs.IDiffCurrentAndRemoteFileVersionsRequestBody} message DiffCurrentAndRemoteFileVersionsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.file.OptionsToDiffFileVersions.encode(message.opts, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteFileVersionsRequestBody message, length delimited. Does not implicitly {@link fs.DiffCurrentAndRemoteFileVersionsRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @static
         * @param {fs.IDiffCurrentAndRemoteFileVersionsRequestBody} message DiffCurrentAndRemoteFileVersionsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a DiffCurrentAndRemoteFileVersionsRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.DiffCurrentAndRemoteFileVersionsRequestBody} DiffCurrentAndRemoteFileVersionsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.DiffCurrentAndRemoteFileVersionsRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.opts = $root.file.OptionsToDiffFileVersions.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a DiffCurrentAndRemoteFileVersionsRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.DiffCurrentAndRemoteFileVersionsRequestBody} DiffCurrentAndRemoteFileVersionsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a DiffCurrentAndRemoteFileVersionsRequestBody message.
         * @function verify
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts")) {
                var error = $root.file.OptionsToDiffFileVersions.verify(message.opts, long + 1);
                if (error)
                    return "opts." + error;
            }
            return null;
        };

        /**
         * Creates a DiffCurrentAndRemoteFileVersionsRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.DiffCurrentAndRemoteFileVersionsRequestBody} DiffCurrentAndRemoteFileVersionsRequestBody
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.DiffCurrentAndRemoteFileVersionsRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.DiffCurrentAndRemoteFileVersionsRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.DiffCurrentAndRemoteFileVersionsRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.opts != null) {
                if (!$util.isObject(object.opts))
                    throw TypeError(".fs.DiffCurrentAndRemoteFileVersionsRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToDiffFileVersions.fromObject(object.opts, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a DiffCurrentAndRemoteFileVersionsRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @static
         * @param {fs.DiffCurrentAndRemoteFileVersionsRequestBody} message DiffCurrentAndRemoteFileVersionsRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.opts = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                object.opts = $root.file.OptionsToDiffFileVersions.toObject(message.opts, options, q + 1);
            return object;
        };

        /**
         * Converts this DiffCurrentAndRemoteFileVersionsRequestBody to JSON.
         * @function toJSON
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for DiffCurrentAndRemoteFileVersionsRequestBody
         * @function getTypeUrl
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.DiffCurrentAndRemoteFileVersionsRequestBody";
        };

        return DiffCurrentAndRemoteFileVersionsRequestBody;
    })();

    fs.DiffCurrentAndRemoteFolderVersionsRequestBody = (function() {

        /**
         * Properties of a DiffCurrentAndRemoteFolderVersionsRequestBody.
         * @memberof fs
         * @interface IDiffCurrentAndRemoteFolderVersionsRequestBody
         * @property {string|null} [path] DiffCurrentAndRemoteFolderVersionsRequestBody path
         * @property {common.IUInt64Value|null} [remoteVersion] DiffCurrentAndRemoteFolderVersionsRequestBody remoteVersion
         */

        /**
         * Constructs a new DiffCurrentAndRemoteFolderVersionsRequestBody.
         * @memberof fs
         * @classdesc Represents a DiffCurrentAndRemoteFolderVersionsRequestBody.
         * @implements IDiffCurrentAndRemoteFolderVersionsRequestBody
         * @constructor
         * @param {fs.IDiffCurrentAndRemoteFolderVersionsRequestBody=} [properties] Properties to set
         */
        function DiffCurrentAndRemoteFolderVersionsRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * DiffCurrentAndRemoteFolderVersionsRequestBody path.
         * @member {string} path
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @instance
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.prototype.path = "";

        /**
         * DiffCurrentAndRemoteFolderVersionsRequestBody remoteVersion.
         * @member {common.IUInt64Value|null|undefined} remoteVersion
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @instance
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.prototype.remoteVersion = null;

        /**
         * Creates a new DiffCurrentAndRemoteFolderVersionsRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @static
         * @param {fs.IDiffCurrentAndRemoteFolderVersionsRequestBody=} [properties] Properties to set
         * @returns {fs.DiffCurrentAndRemoteFolderVersionsRequestBody} DiffCurrentAndRemoteFolderVersionsRequestBody instance
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.create = function create(properties) {
            return new DiffCurrentAndRemoteFolderVersionsRequestBody(properties);
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteFolderVersionsRequestBody message. Does not implicitly {@link fs.DiffCurrentAndRemoteFolderVersionsRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @static
         * @param {fs.IDiffCurrentAndRemoteFolderVersionsRequestBody} message DiffCurrentAndRemoteFolderVersionsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteFolderVersionsRequestBody message, length delimited. Does not implicitly {@link fs.DiffCurrentAndRemoteFolderVersionsRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @static
         * @param {fs.IDiffCurrentAndRemoteFolderVersionsRequestBody} message DiffCurrentAndRemoteFolderVersionsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a DiffCurrentAndRemoteFolderVersionsRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.DiffCurrentAndRemoteFolderVersionsRequestBody} DiffCurrentAndRemoteFolderVersionsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.DiffCurrentAndRemoteFolderVersionsRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a DiffCurrentAndRemoteFolderVersionsRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.DiffCurrentAndRemoteFolderVersionsRequestBody} DiffCurrentAndRemoteFolderVersionsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a DiffCurrentAndRemoteFolderVersionsRequestBody message.
         * @function verify
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion, long + 1);
                if (error)
                    return "remoteVersion." + error;
            }
            return null;
        };

        /**
         * Creates a DiffCurrentAndRemoteFolderVersionsRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.DiffCurrentAndRemoteFolderVersionsRequestBody} DiffCurrentAndRemoteFolderVersionsRequestBody
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.DiffCurrentAndRemoteFolderVersionsRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.DiffCurrentAndRemoteFolderVersionsRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.DiffCurrentAndRemoteFolderVersionsRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.remoteVersion != null) {
                if (!$util.isObject(object.remoteVersion))
                    throw TypeError(".fs.DiffCurrentAndRemoteFolderVersionsRequestBody.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a DiffCurrentAndRemoteFolderVersionsRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @static
         * @param {fs.DiffCurrentAndRemoteFolderVersionsRequestBody} message DiffCurrentAndRemoteFolderVersionsRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.remoteVersion = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options, q + 1);
            return object;
        };

        /**
         * Converts this DiffCurrentAndRemoteFolderVersionsRequestBody to JSON.
         * @function toJSON
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for DiffCurrentAndRemoteFolderVersionsRequestBody
         * @function getTypeUrl
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.DiffCurrentAndRemoteFolderVersionsRequestBody";
        };

        return DiffCurrentAndRemoteFolderVersionsRequestBody;
    })();

    fs.DiffCurrentAndRemoteReplyBody = (function() {

        /**
         * Properties of a DiffCurrentAndRemoteReplyBody.
         * @memberof fs
         * @interface IDiffCurrentAndRemoteReplyBody
         * @property {fs.IFolderDiff|null} [diff] DiffCurrentAndRemoteReplyBody diff
         */

        /**
         * Constructs a new DiffCurrentAndRemoteReplyBody.
         * @memberof fs
         * @classdesc Represents a DiffCurrentAndRemoteReplyBody.
         * @implements IDiffCurrentAndRemoteReplyBody
         * @constructor
         * @param {fs.IDiffCurrentAndRemoteReplyBody=} [properties] Properties to set
         */
        function DiffCurrentAndRemoteReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * DiffCurrentAndRemoteReplyBody diff.
         * @member {fs.IFolderDiff|null|undefined} diff
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @instance
         */
        DiffCurrentAndRemoteReplyBody.prototype.diff = null;

        /**
         * Creates a new DiffCurrentAndRemoteReplyBody instance using the specified properties.
         * @function create
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {fs.IDiffCurrentAndRemoteReplyBody=} [properties] Properties to set
         * @returns {fs.DiffCurrentAndRemoteReplyBody} DiffCurrentAndRemoteReplyBody instance
         */
        DiffCurrentAndRemoteReplyBody.create = function create(properties) {
            return new DiffCurrentAndRemoteReplyBody(properties);
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteReplyBody message. Does not implicitly {@link fs.DiffCurrentAndRemoteReplyBody.verify|verify} messages.
         * @function encode
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {fs.IDiffCurrentAndRemoteReplyBody} message DiffCurrentAndRemoteReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.diff != null && Object.hasOwnProperty.call(message, "diff"))
                $root.fs.FolderDiff.encode(message.diff, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteReplyBody message, length delimited. Does not implicitly {@link fs.DiffCurrentAndRemoteReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {fs.IDiffCurrentAndRemoteReplyBody} message DiffCurrentAndRemoteReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a DiffCurrentAndRemoteReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.DiffCurrentAndRemoteReplyBody} DiffCurrentAndRemoteReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.DiffCurrentAndRemoteReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.diff = $root.fs.FolderDiff.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a DiffCurrentAndRemoteReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.DiffCurrentAndRemoteReplyBody} DiffCurrentAndRemoteReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a DiffCurrentAndRemoteReplyBody message.
         * @function verify
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        DiffCurrentAndRemoteReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.diff != null && Object.hasOwnProperty.call(message, "diff")) {
                var error = $root.fs.FolderDiff.verify(message.diff, long + 1);
                if (error)
                    return "diff." + error;
            }
            return null;
        };

        /**
         * Creates a DiffCurrentAndRemoteReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.DiffCurrentAndRemoteReplyBody} DiffCurrentAndRemoteReplyBody
         */
        DiffCurrentAndRemoteReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.DiffCurrentAndRemoteReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.DiffCurrentAndRemoteReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.DiffCurrentAndRemoteReplyBody();
            if (object.diff != null) {
                if (!$util.isObject(object.diff))
                    throw TypeError(".fs.DiffCurrentAndRemoteReplyBody.diff: object expected");
                message.diff = $root.fs.FolderDiff.fromObject(object.diff, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a DiffCurrentAndRemoteReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {fs.DiffCurrentAndRemoteReplyBody} message DiffCurrentAndRemoteReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        DiffCurrentAndRemoteReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.diff = null;
            if (message.diff != null && Object.hasOwnProperty.call(message, "diff"))
                object.diff = $root.fs.FolderDiff.toObject(message.diff, options, q + 1);
            return object;
        };

        /**
         * Converts this DiffCurrentAndRemoteReplyBody to JSON.
         * @function toJSON
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        DiffCurrentAndRemoteReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for DiffCurrentAndRemoteReplyBody
         * @function getTypeUrl
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        DiffCurrentAndRemoteReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.DiffCurrentAndRemoteReplyBody";
        };

        return DiffCurrentAndRemoteReplyBody;
    })();

    fs.FolderDiff = (function() {

        /**
         * Properties of a FolderDiff.
         * @memberof fs
         * @interface IFolderDiff
         * @property {number|Long|null} [currentVersion] FolderDiff currentVersion
         * @property {boolean|null} [isCurrentLocal] FolderDiff isCurrentLocal
         * @property {common.IUInt64Value|null} [remoteVersion] FolderDiff remoteVersion
         * @property {common.IUInt64Value|null} [syncedVersion] FolderDiff syncedVersion
         * @property {boolean|null} [isRemoteRemoved] FolderDiff isRemoteRemoved
         * @property {file.ITimeStampsDiff|null} [ctime] FolderDiff ctime
         * @property {file.ITimeStampsDiff|null} [mtime] FolderDiff mtime
         * @property {Array.<file.IXAttrDiff>|null} [xattrs] FolderDiff xattrs
         * @property {fs.FolderDiff.IItemsByBranches|null} [removed] FolderDiff removed
         * @property {Array.<fs.FolderDiff.IRenamed>|null} [renamed] FolderDiff renamed
         * @property {fs.FolderDiff.IItemsByBranches|null} [added] FolderDiff added
         * @property {Array.<fs.FolderDiff.IRekeyed>|null} [rekeyed] FolderDiff rekeyed
         * @property {Array.<string>|null} [nameOverlaps] FolderDiff nameOverlaps
         */

        /**
         * Constructs a new FolderDiff.
         * @memberof fs
         * @classdesc Represents a FolderDiff.
         * @implements IFolderDiff
         * @constructor
         * @param {fs.IFolderDiff=} [properties] Properties to set
         */
        function FolderDiff(properties) {
            this.xattrs = [];
            this.renamed = [];
            this.rekeyed = [];
            this.nameOverlaps = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FolderDiff currentVersion.
         * @member {number|Long} currentVersion
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.currentVersion = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * FolderDiff isCurrentLocal.
         * @member {boolean} isCurrentLocal
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.isCurrentLocal = false;

        /**
         * FolderDiff remoteVersion.
         * @member {common.IUInt64Value|null|undefined} remoteVersion
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.remoteVersion = null;

        /**
         * FolderDiff syncedVersion.
         * @member {common.IUInt64Value|null|undefined} syncedVersion
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.syncedVersion = null;

        /**
         * FolderDiff isRemoteRemoved.
         * @member {boolean} isRemoteRemoved
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.isRemoteRemoved = false;

        /**
         * FolderDiff ctime.
         * @member {file.ITimeStampsDiff|null|undefined} ctime
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.ctime = null;

        /**
         * FolderDiff mtime.
         * @member {file.ITimeStampsDiff|null|undefined} mtime
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.mtime = null;

        /**
         * FolderDiff xattrs.
         * @member {Array.<file.IXAttrDiff>} xattrs
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.xattrs = $util.emptyArray;

        /**
         * FolderDiff removed.
         * @member {fs.FolderDiff.IItemsByBranches|null|undefined} removed
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.removed = null;

        /**
         * FolderDiff renamed.
         * @member {Array.<fs.FolderDiff.IRenamed>} renamed
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.renamed = $util.emptyArray;

        /**
         * FolderDiff added.
         * @member {fs.FolderDiff.IItemsByBranches|null|undefined} added
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.added = null;

        /**
         * FolderDiff rekeyed.
         * @member {Array.<fs.FolderDiff.IRekeyed>} rekeyed
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.rekeyed = $util.emptyArray;

        /**
         * FolderDiff nameOverlaps.
         * @member {Array.<string>} nameOverlaps
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.nameOverlaps = $util.emptyArray;

        /**
         * Creates a new FolderDiff instance using the specified properties.
         * @function create
         * @memberof fs.FolderDiff
         * @static
         * @param {fs.IFolderDiff=} [properties] Properties to set
         * @returns {fs.FolderDiff} FolderDiff instance
         */
        FolderDiff.create = function create(properties) {
            return new FolderDiff(properties);
        };

        /**
         * Encodes the specified FolderDiff message. Does not implicitly {@link fs.FolderDiff.verify|verify} messages.
         * @function encode
         * @memberof fs.FolderDiff
         * @static
         * @param {fs.IFolderDiff} message FolderDiff message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FolderDiff.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.currentVersion);
            if (message.isCurrentLocal != null && Object.hasOwnProperty.call(message, "isCurrentLocal"))
                writer.uint32(/* id 2, wireType 0 =*/16).bool(message.isCurrentLocal);
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.syncedVersion != null && Object.hasOwnProperty.call(message, "syncedVersion"))
                $root.common.UInt64Value.encode(message.syncedVersion, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            if (message.isRemoteRemoved != null && Object.hasOwnProperty.call(message, "isRemoteRemoved"))
                writer.uint32(/* id 5, wireType 0 =*/40).bool(message.isRemoteRemoved);
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime"))
                $root.file.TimeStampsDiff.encode(message.ctime, writer.uint32(/* id 6, wireType 2 =*/50).fork(), q + 1).ldelim();
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime"))
                $root.file.TimeStampsDiff.encode(message.mtime, writer.uint32(/* id 7, wireType 2 =*/58).fork(), q + 1).ldelim();
            if (message.xattrs != null && message.xattrs.length)
                for (var i = 0; i < message.xattrs.length; ++i)
                    $root.file.XAttrDiff.encode(message.xattrs[i], writer.uint32(/* id 8, wireType 2 =*/66).fork(), q + 1).ldelim();
            if (message.removed != null && Object.hasOwnProperty.call(message, "removed"))
                $root.fs.FolderDiff.ItemsByBranches.encode(message.removed, writer.uint32(/* id 11, wireType 2 =*/90).fork(), q + 1).ldelim();
            if (message.renamed != null && message.renamed.length)
                for (var i = 0; i < message.renamed.length; ++i)
                    $root.fs.FolderDiff.Renamed.encode(message.renamed[i], writer.uint32(/* id 12, wireType 2 =*/98).fork(), q + 1).ldelim();
            if (message.added != null && Object.hasOwnProperty.call(message, "added"))
                $root.fs.FolderDiff.ItemsByBranches.encode(message.added, writer.uint32(/* id 13, wireType 2 =*/106).fork(), q + 1).ldelim();
            if (message.rekeyed != null && message.rekeyed.length)
                for (var i = 0; i < message.rekeyed.length; ++i)
                    $root.fs.FolderDiff.Rekeyed.encode(message.rekeyed[i], writer.uint32(/* id 14, wireType 2 =*/114).fork(), q + 1).ldelim();
            if (message.nameOverlaps != null && message.nameOverlaps.length)
                for (var i = 0; i < message.nameOverlaps.length; ++i)
                    writer.uint32(/* id 15, wireType 2 =*/122).string(message.nameOverlaps[i]);
            return writer;
        };

        /**
         * Encodes the specified FolderDiff message, length delimited. Does not implicitly {@link fs.FolderDiff.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FolderDiff
         * @static
         * @param {fs.IFolderDiff} message FolderDiff message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FolderDiff.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FolderDiff message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FolderDiff
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FolderDiff} FolderDiff
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FolderDiff.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FolderDiff();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.currentVersion = reader.uint64();
                        break;
                    }
                case 2: {
                        message.isCurrentLocal = reader.bool();
                        break;
                    }
                case 3: {
                        message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.syncedVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 5: {
                        message.isRemoteRemoved = reader.bool();
                        break;
                    }
                case 6: {
                        message.ctime = $root.file.TimeStampsDiff.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 7: {
                        message.mtime = $root.file.TimeStampsDiff.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 8: {
                        if (!(message.xattrs && message.xattrs.length))
                            message.xattrs = [];
                        message.xattrs.push($root.file.XAttrDiff.decode(reader, reader.uint32(), undefined, long + 1));
                        break;
                    }
                case 11: {
                        message.removed = $root.fs.FolderDiff.ItemsByBranches.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 12: {
                        if (!(message.renamed && message.renamed.length))
                            message.renamed = [];
                        message.renamed.push($root.fs.FolderDiff.Renamed.decode(reader, reader.uint32(), undefined, long + 1));
                        break;
                    }
                case 13: {
                        message.added = $root.fs.FolderDiff.ItemsByBranches.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 14: {
                        if (!(message.rekeyed && message.rekeyed.length))
                            message.rekeyed = [];
                        message.rekeyed.push($root.fs.FolderDiff.Rekeyed.decode(reader, reader.uint32(), undefined, long + 1));
                        break;
                    }
                case 15: {
                        if (!(message.nameOverlaps && message.nameOverlaps.length))
                            message.nameOverlaps = [];
                        message.nameOverlaps.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FolderDiff message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FolderDiff
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FolderDiff} FolderDiff
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FolderDiff.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FolderDiff message.
         * @function verify
         * @memberof fs.FolderDiff
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FolderDiff.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                if (!$util.isInteger(message.currentVersion) && !(message.currentVersion && $util.isInteger(message.currentVersion.low) && $util.isInteger(message.currentVersion.high)))
                    return "currentVersion: integer|Long expected";
            if (message.isCurrentLocal != null && Object.hasOwnProperty.call(message, "isCurrentLocal"))
                if (typeof message.isCurrentLocal !== "boolean")
                    return "isCurrentLocal: boolean expected";
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion, long + 1);
                if (error)
                    return "remoteVersion." + error;
            }
            if (message.syncedVersion != null && Object.hasOwnProperty.call(message, "syncedVersion")) {
                var error = $root.common.UInt64Value.verify(message.syncedVersion, long + 1);
                if (error)
                    return "syncedVersion." + error;
            }
            if (message.isRemoteRemoved != null && Object.hasOwnProperty.call(message, "isRemoteRemoved"))
                if (typeof message.isRemoteRemoved !== "boolean")
                    return "isRemoteRemoved: boolean expected";
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime")) {
                var error = $root.file.TimeStampsDiff.verify(message.ctime, long + 1);
                if (error)
                    return "ctime." + error;
            }
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime")) {
                var error = $root.file.TimeStampsDiff.verify(message.mtime, long + 1);
                if (error)
                    return "mtime." + error;
            }
            if (message.xattrs != null && Object.hasOwnProperty.call(message, "xattrs")) {
                if (!Array.isArray(message.xattrs))
                    return "xattrs: array expected";
                for (var i = 0; i < message.xattrs.length; ++i) {
                    var error = $root.file.XAttrDiff.verify(message.xattrs[i], long + 1);
                    if (error)
                        return "xattrs." + error;
                }
            }
            if (message.removed != null && Object.hasOwnProperty.call(message, "removed")) {
                var error = $root.fs.FolderDiff.ItemsByBranches.verify(message.removed, long + 1);
                if (error)
                    return "removed." + error;
            }
            if (message.renamed != null && Object.hasOwnProperty.call(message, "renamed")) {
                if (!Array.isArray(message.renamed))
                    return "renamed: array expected";
                for (var i = 0; i < message.renamed.length; ++i) {
                    var error = $root.fs.FolderDiff.Renamed.verify(message.renamed[i], long + 1);
                    if (error)
                        return "renamed." + error;
                }
            }
            if (message.added != null && Object.hasOwnProperty.call(message, "added")) {
                var error = $root.fs.FolderDiff.ItemsByBranches.verify(message.added, long + 1);
                if (error)
                    return "added." + error;
            }
            if (message.rekeyed != null && Object.hasOwnProperty.call(message, "rekeyed")) {
                if (!Array.isArray(message.rekeyed))
                    return "rekeyed: array expected";
                for (var i = 0; i < message.rekeyed.length; ++i) {
                    var error = $root.fs.FolderDiff.Rekeyed.verify(message.rekeyed[i], long + 1);
                    if (error)
                        return "rekeyed." + error;
                }
            }
            if (message.nameOverlaps != null && Object.hasOwnProperty.call(message, "nameOverlaps")) {
                if (!Array.isArray(message.nameOverlaps))
                    return "nameOverlaps: array expected";
                for (var i = 0; i < message.nameOverlaps.length; ++i)
                    if (!$util.isString(message.nameOverlaps[i]))
                        return "nameOverlaps: string[] expected";
            }
            return null;
        };

        /**
         * Creates a FolderDiff message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FolderDiff
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FolderDiff} FolderDiff
         */
        FolderDiff.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FolderDiff)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FolderDiff: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FolderDiff();
            if (object.currentVersion != null)
                if ($util.Long)
                    message.currentVersion = $util.Long.fromValue(object.currentVersion, true);
                else if (typeof object.currentVersion === "string")
                    message.currentVersion = parseInt(object.currentVersion, 10);
                else if (typeof object.currentVersion === "number")
                    message.currentVersion = object.currentVersion;
                else if (typeof object.currentVersion === "object")
                    message.currentVersion = new $util.LongBits(object.currentVersion.low >>> 0, object.currentVersion.high >>> 0).toNumber(true);
            if (object.isCurrentLocal != null)
                message.isCurrentLocal = Boolean(object.isCurrentLocal);
            if (object.remoteVersion != null) {
                if (!$util.isObject(object.remoteVersion))
                    throw TypeError(".fs.FolderDiff.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion, long + 1);
            }
            if (object.syncedVersion != null) {
                if (!$util.isObject(object.syncedVersion))
                    throw TypeError(".fs.FolderDiff.syncedVersion: object expected");
                message.syncedVersion = $root.common.UInt64Value.fromObject(object.syncedVersion, long + 1);
            }
            if (object.isRemoteRemoved != null)
                message.isRemoteRemoved = Boolean(object.isRemoteRemoved);
            if (object.ctime != null) {
                if (!$util.isObject(object.ctime))
                    throw TypeError(".fs.FolderDiff.ctime: object expected");
                message.ctime = $root.file.TimeStampsDiff.fromObject(object.ctime, long + 1);
            }
            if (object.mtime != null) {
                if (!$util.isObject(object.mtime))
                    throw TypeError(".fs.FolderDiff.mtime: object expected");
                message.mtime = $root.file.TimeStampsDiff.fromObject(object.mtime, long + 1);
            }
            if (object.xattrs) {
                if (!Array.isArray(object.xattrs))
                    throw TypeError(".fs.FolderDiff.xattrs: array expected");
                message.xattrs = [];
                for (var i = 0; i < object.xattrs.length; ++i) {
                    if (!$util.isObject(object.xattrs[i]))
                        throw TypeError(".fs.FolderDiff.xattrs: object expected");
                    message.xattrs[i] = $root.file.XAttrDiff.fromObject(object.xattrs[i], long + 1);
                }
            }
            if (object.removed != null) {
                if (!$util.isObject(object.removed))
                    throw TypeError(".fs.FolderDiff.removed: object expected");
                message.removed = $root.fs.FolderDiff.ItemsByBranches.fromObject(object.removed, long + 1);
            }
            if (object.renamed) {
                if (!Array.isArray(object.renamed))
                    throw TypeError(".fs.FolderDiff.renamed: array expected");
                message.renamed = [];
                for (var i = 0; i < object.renamed.length; ++i) {
                    if (!$util.isObject(object.renamed[i]))
                        throw TypeError(".fs.FolderDiff.renamed: object expected");
                    message.renamed[i] = $root.fs.FolderDiff.Renamed.fromObject(object.renamed[i], long + 1);
                }
            }
            if (object.added != null) {
                if (!$util.isObject(object.added))
                    throw TypeError(".fs.FolderDiff.added: object expected");
                message.added = $root.fs.FolderDiff.ItemsByBranches.fromObject(object.added, long + 1);
            }
            if (object.rekeyed) {
                if (!Array.isArray(object.rekeyed))
                    throw TypeError(".fs.FolderDiff.rekeyed: array expected");
                message.rekeyed = [];
                for (var i = 0; i < object.rekeyed.length; ++i) {
                    if (!$util.isObject(object.rekeyed[i]))
                        throw TypeError(".fs.FolderDiff.rekeyed: object expected");
                    message.rekeyed[i] = $root.fs.FolderDiff.Rekeyed.fromObject(object.rekeyed[i], long + 1);
                }
            }
            if (object.nameOverlaps) {
                if (!Array.isArray(object.nameOverlaps))
                    throw TypeError(".fs.FolderDiff.nameOverlaps: array expected");
                message.nameOverlaps = [];
                for (var i = 0; i < object.nameOverlaps.length; ++i)
                    message.nameOverlaps[i] = String(object.nameOverlaps[i]);
            }
            return message;
        };

        /**
         * Creates a plain object from a FolderDiff message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FolderDiff
         * @static
         * @param {fs.FolderDiff} message FolderDiff
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FolderDiff.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults) {
                object.xattrs = [];
                object.renamed = [];
                object.rekeyed = [];
                object.nameOverlaps = [];
            }
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.currentVersion = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.currentVersion = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.isCurrentLocal = false;
                object.remoteVersion = null;
                object.syncedVersion = null;
                object.isRemoteRemoved = false;
                object.ctime = null;
                object.mtime = null;
                object.removed = null;
                object.added = null;
            }
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.currentVersion = typeof message.currentVersion === "number" ? BigInt(message.currentVersion) : $util.Long.fromBits(message.currentVersion.low >>> 0, message.currentVersion.high >>> 0, true).toBigInt();
                else if (typeof message.currentVersion === "number")
                    object.currentVersion = options.longs === String ? String(message.currentVersion) : message.currentVersion;
                else
                    object.currentVersion = options.longs === String ? $util.Long.prototype.toString.call(message.currentVersion) : options.longs === Number ? new $util.LongBits(message.currentVersion.low >>> 0, message.currentVersion.high >>> 0).toNumber(true) : message.currentVersion;
            if (message.isCurrentLocal != null && Object.hasOwnProperty.call(message, "isCurrentLocal"))
                object.isCurrentLocal = message.isCurrentLocal;
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options, q + 1);
            if (message.syncedVersion != null && Object.hasOwnProperty.call(message, "syncedVersion"))
                object.syncedVersion = $root.common.UInt64Value.toObject(message.syncedVersion, options, q + 1);
            if (message.isRemoteRemoved != null && Object.hasOwnProperty.call(message, "isRemoteRemoved"))
                object.isRemoteRemoved = message.isRemoteRemoved;
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime"))
                object.ctime = $root.file.TimeStampsDiff.toObject(message.ctime, options, q + 1);
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime"))
                object.mtime = $root.file.TimeStampsDiff.toObject(message.mtime, options, q + 1);
            if (message.xattrs && message.xattrs.length) {
                object.xattrs = [];
                for (var j = 0; j < message.xattrs.length; ++j)
                    object.xattrs[j] = $root.file.XAttrDiff.toObject(message.xattrs[j], options, q + 1);
            }
            if (message.removed != null && Object.hasOwnProperty.call(message, "removed"))
                object.removed = $root.fs.FolderDiff.ItemsByBranches.toObject(message.removed, options, q + 1);
            if (message.renamed && message.renamed.length) {
                object.renamed = [];
                for (var j = 0; j < message.renamed.length; ++j)
                    object.renamed[j] = $root.fs.FolderDiff.Renamed.toObject(message.renamed[j], options, q + 1);
            }
            if (message.added != null && Object.hasOwnProperty.call(message, "added"))
                object.added = $root.fs.FolderDiff.ItemsByBranches.toObject(message.added, options, q + 1);
            if (message.rekeyed && message.rekeyed.length) {
                object.rekeyed = [];
                for (var j = 0; j < message.rekeyed.length; ++j)
                    object.rekeyed[j] = $root.fs.FolderDiff.Rekeyed.toObject(message.rekeyed[j], options, q + 1);
            }
            if (message.nameOverlaps && message.nameOverlaps.length) {
                object.nameOverlaps = [];
                for (var j = 0; j < message.nameOverlaps.length; ++j)
                    object.nameOverlaps[j] = message.nameOverlaps[j];
            }
            return object;
        };

        /**
         * Converts this FolderDiff to JSON.
         * @function toJSON
         * @memberof fs.FolderDiff
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FolderDiff.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FolderDiff
         * @function getTypeUrl
         * @memberof fs.FolderDiff
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FolderDiff.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FolderDiff";
        };

        FolderDiff.ItemsByBranches = (function() {

            /**
             * Properties of an ItemsByBranches.
             * @memberof fs.FolderDiff
             * @interface IItemsByBranches
             * @property {Array.<string>|null} [inLocal] ItemsByBranches inLocal
             * @property {Array.<string>|null} [inRemote] ItemsByBranches inRemote
             */

            /**
             * Constructs a new ItemsByBranches.
             * @memberof fs.FolderDiff
             * @classdesc Represents an ItemsByBranches.
             * @implements IItemsByBranches
             * @constructor
             * @param {fs.FolderDiff.IItemsByBranches=} [properties] Properties to set
             */
            function ItemsByBranches(properties) {
                this.inLocal = [];
                this.inRemote = [];
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * ItemsByBranches inLocal.
             * @member {Array.<string>} inLocal
             * @memberof fs.FolderDiff.ItemsByBranches
             * @instance
             */
            ItemsByBranches.prototype.inLocal = $util.emptyArray;

            /**
             * ItemsByBranches inRemote.
             * @member {Array.<string>} inRemote
             * @memberof fs.FolderDiff.ItemsByBranches
             * @instance
             */
            ItemsByBranches.prototype.inRemote = $util.emptyArray;

            /**
             * Creates a new ItemsByBranches instance using the specified properties.
             * @function create
             * @memberof fs.FolderDiff.ItemsByBranches
             * @static
             * @param {fs.FolderDiff.IItemsByBranches=} [properties] Properties to set
             * @returns {fs.FolderDiff.ItemsByBranches} ItemsByBranches instance
             */
            ItemsByBranches.create = function create(properties) {
                return new ItemsByBranches(properties);
            };

            /**
             * Encodes the specified ItemsByBranches message. Does not implicitly {@link fs.FolderDiff.ItemsByBranches.verify|verify} messages.
             * @function encode
             * @memberof fs.FolderDiff.ItemsByBranches
             * @static
             * @param {fs.FolderDiff.IItemsByBranches} message ItemsByBranches message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            ItemsByBranches.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.inLocal != null && message.inLocal.length)
                    for (var i = 0; i < message.inLocal.length; ++i)
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.inLocal[i]);
                if (message.inRemote != null && message.inRemote.length)
                    for (var i = 0; i < message.inRemote.length; ++i)
                        writer.uint32(/* id 2, wireType 2 =*/18).string(message.inRemote[i]);
                return writer;
            };

            /**
             * Encodes the specified ItemsByBranches message, length delimited. Does not implicitly {@link fs.FolderDiff.ItemsByBranches.verify|verify} messages.
             * @function encodeDelimited
             * @memberof fs.FolderDiff.ItemsByBranches
             * @static
             * @param {fs.FolderDiff.IItemsByBranches} message ItemsByBranches message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            ItemsByBranches.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes an ItemsByBranches message from the specified reader or buffer.
             * @function decode
             * @memberof fs.FolderDiff.ItemsByBranches
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {fs.FolderDiff.ItemsByBranches} ItemsByBranches
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            ItemsByBranches.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FolderDiff.ItemsByBranches();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            if (!(message.inLocal && message.inLocal.length))
                                message.inLocal = [];
                            message.inLocal.push(reader.string());
                            break;
                        }
                    case 2: {
                            if (!(message.inRemote && message.inRemote.length))
                                message.inRemote = [];
                            message.inRemote.push(reader.string());
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes an ItemsByBranches message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof fs.FolderDiff.ItemsByBranches
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {fs.FolderDiff.ItemsByBranches} ItemsByBranches
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            ItemsByBranches.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies an ItemsByBranches message.
             * @function verify
             * @memberof fs.FolderDiff.ItemsByBranches
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            ItemsByBranches.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.inLocal != null && Object.hasOwnProperty.call(message, "inLocal")) {
                    if (!Array.isArray(message.inLocal))
                        return "inLocal: array expected";
                    for (var i = 0; i < message.inLocal.length; ++i)
                        if (!$util.isString(message.inLocal[i]))
                            return "inLocal: string[] expected";
                }
                if (message.inRemote != null && Object.hasOwnProperty.call(message, "inRemote")) {
                    if (!Array.isArray(message.inRemote))
                        return "inRemote: array expected";
                    for (var i = 0; i < message.inRemote.length; ++i)
                        if (!$util.isString(message.inRemote[i]))
                            return "inRemote: string[] expected";
                }
                return null;
            };

            /**
             * Creates an ItemsByBranches message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof fs.FolderDiff.ItemsByBranches
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {fs.FolderDiff.ItemsByBranches} ItemsByBranches
             */
            ItemsByBranches.fromObject = function fromObject(object, long) {
                if (object instanceof $root.fs.FolderDiff.ItemsByBranches)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".fs.FolderDiff.ItemsByBranches: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.fs.FolderDiff.ItemsByBranches();
                if (object.inLocal) {
                    if (!Array.isArray(object.inLocal))
                        throw TypeError(".fs.FolderDiff.ItemsByBranches.inLocal: array expected");
                    message.inLocal = [];
                    for (var i = 0; i < object.inLocal.length; ++i)
                        message.inLocal[i] = String(object.inLocal[i]);
                }
                if (object.inRemote) {
                    if (!Array.isArray(object.inRemote))
                        throw TypeError(".fs.FolderDiff.ItemsByBranches.inRemote: array expected");
                    message.inRemote = [];
                    for (var i = 0; i < object.inRemote.length; ++i)
                        message.inRemote[i] = String(object.inRemote[i]);
                }
                return message;
            };

            /**
             * Creates a plain object from an ItemsByBranches message. Also converts values to other types if specified.
             * @function toObject
             * @memberof fs.FolderDiff.ItemsByBranches
             * @static
             * @param {fs.FolderDiff.ItemsByBranches} message ItemsByBranches
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            ItemsByBranches.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.arrays || options.defaults) {
                    object.inLocal = [];
                    object.inRemote = [];
                }
                if (message.inLocal && message.inLocal.length) {
                    object.inLocal = [];
                    for (var j = 0; j < message.inLocal.length; ++j)
                        object.inLocal[j] = message.inLocal[j];
                }
                if (message.inRemote && message.inRemote.length) {
                    object.inRemote = [];
                    for (var j = 0; j < message.inRemote.length; ++j)
                        object.inRemote[j] = message.inRemote[j];
                }
                return object;
            };

            /**
             * Converts this ItemsByBranches to JSON.
             * @function toJSON
             * @memberof fs.FolderDiff.ItemsByBranches
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            ItemsByBranches.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for ItemsByBranches
             * @function getTypeUrl
             * @memberof fs.FolderDiff.ItemsByBranches
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            ItemsByBranches.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/fs.FolderDiff.ItemsByBranches";
            };

            return ItemsByBranches;
        })();

        FolderDiff.Renamed = (function() {

            /**
             * Properties of a Renamed.
             * @memberof fs.FolderDiff
             * @interface IRenamed
             * @property {string|null} [local] Renamed local
             * @property {string|null} [remote] Renamed remote
             * @property {string|null} [renamedIn] Renamed renamedIn
             */

            /**
             * Constructs a new Renamed.
             * @memberof fs.FolderDiff
             * @classdesc Represents a Renamed.
             * @implements IRenamed
             * @constructor
             * @param {fs.FolderDiff.IRenamed=} [properties] Properties to set
             */
            function Renamed(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * Renamed local.
             * @member {string} local
             * @memberof fs.FolderDiff.Renamed
             * @instance
             */
            Renamed.prototype.local = "";

            /**
             * Renamed remote.
             * @member {string} remote
             * @memberof fs.FolderDiff.Renamed
             * @instance
             */
            Renamed.prototype.remote = "";

            /**
             * Renamed renamedIn.
             * @member {string} renamedIn
             * @memberof fs.FolderDiff.Renamed
             * @instance
             */
            Renamed.prototype.renamedIn = "";

            /**
             * Creates a new Renamed instance using the specified properties.
             * @function create
             * @memberof fs.FolderDiff.Renamed
             * @static
             * @param {fs.FolderDiff.IRenamed=} [properties] Properties to set
             * @returns {fs.FolderDiff.Renamed} Renamed instance
             */
            Renamed.create = function create(properties) {
                return new Renamed(properties);
            };

            /**
             * Encodes the specified Renamed message. Does not implicitly {@link fs.FolderDiff.Renamed.verify|verify} messages.
             * @function encode
             * @memberof fs.FolderDiff.Renamed
             * @static
             * @param {fs.FolderDiff.IRenamed} message Renamed message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Renamed.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.local != null && Object.hasOwnProperty.call(message, "local"))
                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.local);
                if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.remote);
                if (message.renamedIn != null && Object.hasOwnProperty.call(message, "renamedIn"))
                    writer.uint32(/* id 3, wireType 2 =*/26).string(message.renamedIn);
                return writer;
            };

            /**
             * Encodes the specified Renamed message, length delimited. Does not implicitly {@link fs.FolderDiff.Renamed.verify|verify} messages.
             * @function encodeDelimited
             * @memberof fs.FolderDiff.Renamed
             * @static
             * @param {fs.FolderDiff.IRenamed} message Renamed message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Renamed.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes a Renamed message from the specified reader or buffer.
             * @function decode
             * @memberof fs.FolderDiff.Renamed
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {fs.FolderDiff.Renamed} Renamed
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Renamed.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FolderDiff.Renamed();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.local = reader.string();
                            break;
                        }
                    case 2: {
                            message.remote = reader.string();
                            break;
                        }
                    case 3: {
                            message.renamedIn = reader.string();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a Renamed message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof fs.FolderDiff.Renamed
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {fs.FolderDiff.Renamed} Renamed
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Renamed.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a Renamed message.
             * @function verify
             * @memberof fs.FolderDiff.Renamed
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            Renamed.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.local != null && Object.hasOwnProperty.call(message, "local"))
                    if (!$util.isString(message.local))
                        return "local: string expected";
                if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                    if (!$util.isString(message.remote))
                        return "remote: string expected";
                if (message.renamedIn != null && Object.hasOwnProperty.call(message, "renamedIn"))
                    if (!$util.isString(message.renamedIn))
                        return "renamedIn: string expected";
                return null;
            };

            /**
             * Creates a Renamed message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof fs.FolderDiff.Renamed
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {fs.FolderDiff.Renamed} Renamed
             */
            Renamed.fromObject = function fromObject(object, long) {
                if (object instanceof $root.fs.FolderDiff.Renamed)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".fs.FolderDiff.Renamed: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.fs.FolderDiff.Renamed();
                if (object.local != null)
                    message.local = String(object.local);
                if (object.remote != null)
                    message.remote = String(object.remote);
                if (object.renamedIn != null)
                    message.renamedIn = String(object.renamedIn);
                return message;
            };

            /**
             * Creates a plain object from a Renamed message. Also converts values to other types if specified.
             * @function toObject
             * @memberof fs.FolderDiff.Renamed
             * @static
             * @param {fs.FolderDiff.Renamed} message Renamed
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            Renamed.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults) {
                    object.local = "";
                    object.remote = "";
                    object.renamedIn = "";
                }
                if (message.local != null && Object.hasOwnProperty.call(message, "local"))
                    object.local = message.local;
                if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                    object.remote = message.remote;
                if (message.renamedIn != null && Object.hasOwnProperty.call(message, "renamedIn"))
                    object.renamedIn = message.renamedIn;
                return object;
            };

            /**
             * Converts this Renamed to JSON.
             * @function toJSON
             * @memberof fs.FolderDiff.Renamed
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            Renamed.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for Renamed
             * @function getTypeUrl
             * @memberof fs.FolderDiff.Renamed
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            Renamed.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/fs.FolderDiff.Renamed";
            };

            return Renamed;
        })();

        FolderDiff.Rekeyed = (function() {

            /**
             * Properties of a Rekeyed.
             * @memberof fs.FolderDiff
             * @interface IRekeyed
             * @property {string|null} [local] Rekeyed local
             * @property {string|null} [remote] Rekeyed remote
             * @property {string|null} [rekeyedIn] Rekeyed rekeyedIn
             */

            /**
             * Constructs a new Rekeyed.
             * @memberof fs.FolderDiff
             * @classdesc Represents a Rekeyed.
             * @implements IRekeyed
             * @constructor
             * @param {fs.FolderDiff.IRekeyed=} [properties] Properties to set
             */
            function Rekeyed(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * Rekeyed local.
             * @member {string} local
             * @memberof fs.FolderDiff.Rekeyed
             * @instance
             */
            Rekeyed.prototype.local = "";

            /**
             * Rekeyed remote.
             * @member {string} remote
             * @memberof fs.FolderDiff.Rekeyed
             * @instance
             */
            Rekeyed.prototype.remote = "";

            /**
             * Rekeyed rekeyedIn.
             * @member {string} rekeyedIn
             * @memberof fs.FolderDiff.Rekeyed
             * @instance
             */
            Rekeyed.prototype.rekeyedIn = "";

            /**
             * Creates a new Rekeyed instance using the specified properties.
             * @function create
             * @memberof fs.FolderDiff.Rekeyed
             * @static
             * @param {fs.FolderDiff.IRekeyed=} [properties] Properties to set
             * @returns {fs.FolderDiff.Rekeyed} Rekeyed instance
             */
            Rekeyed.create = function create(properties) {
                return new Rekeyed(properties);
            };

            /**
             * Encodes the specified Rekeyed message. Does not implicitly {@link fs.FolderDiff.Rekeyed.verify|verify} messages.
             * @function encode
             * @memberof fs.FolderDiff.Rekeyed
             * @static
             * @param {fs.FolderDiff.IRekeyed} message Rekeyed message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Rekeyed.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.local != null && Object.hasOwnProperty.call(message, "local"))
                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.local);
                if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.remote);
                if (message.rekeyedIn != null && Object.hasOwnProperty.call(message, "rekeyedIn"))
                    writer.uint32(/* id 3, wireType 2 =*/26).string(message.rekeyedIn);
                return writer;
            };

            /**
             * Encodes the specified Rekeyed message, length delimited. Does not implicitly {@link fs.FolderDiff.Rekeyed.verify|verify} messages.
             * @function encodeDelimited
             * @memberof fs.FolderDiff.Rekeyed
             * @static
             * @param {fs.FolderDiff.IRekeyed} message Rekeyed message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Rekeyed.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes a Rekeyed message from the specified reader or buffer.
             * @function decode
             * @memberof fs.FolderDiff.Rekeyed
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {fs.FolderDiff.Rekeyed} Rekeyed
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Rekeyed.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FolderDiff.Rekeyed();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.local = reader.string();
                            break;
                        }
                    case 2: {
                            message.remote = reader.string();
                            break;
                        }
                    case 3: {
                            message.rekeyedIn = reader.string();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a Rekeyed message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof fs.FolderDiff.Rekeyed
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {fs.FolderDiff.Rekeyed} Rekeyed
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Rekeyed.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a Rekeyed message.
             * @function verify
             * @memberof fs.FolderDiff.Rekeyed
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            Rekeyed.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.local != null && Object.hasOwnProperty.call(message, "local"))
                    if (!$util.isString(message.local))
                        return "local: string expected";
                if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                    if (!$util.isString(message.remote))
                        return "remote: string expected";
                if (message.rekeyedIn != null && Object.hasOwnProperty.call(message, "rekeyedIn"))
                    if (!$util.isString(message.rekeyedIn))
                        return "rekeyedIn: string expected";
                return null;
            };

            /**
             * Creates a Rekeyed message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof fs.FolderDiff.Rekeyed
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {fs.FolderDiff.Rekeyed} Rekeyed
             */
            Rekeyed.fromObject = function fromObject(object, long) {
                if (object instanceof $root.fs.FolderDiff.Rekeyed)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".fs.FolderDiff.Rekeyed: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.fs.FolderDiff.Rekeyed();
                if (object.local != null)
                    message.local = String(object.local);
                if (object.remote != null)
                    message.remote = String(object.remote);
                if (object.rekeyedIn != null)
                    message.rekeyedIn = String(object.rekeyedIn);
                return message;
            };

            /**
             * Creates a plain object from a Rekeyed message. Also converts values to other types if specified.
             * @function toObject
             * @memberof fs.FolderDiff.Rekeyed
             * @static
             * @param {fs.FolderDiff.Rekeyed} message Rekeyed
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            Rekeyed.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults) {
                    object.local = "";
                    object.remote = "";
                    object.rekeyedIn = "";
                }
                if (message.local != null && Object.hasOwnProperty.call(message, "local"))
                    object.local = message.local;
                if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                    object.remote = message.remote;
                if (message.rekeyedIn != null && Object.hasOwnProperty.call(message, "rekeyedIn"))
                    object.rekeyedIn = message.rekeyedIn;
                return object;
            };

            /**
             * Converts this Rekeyed to JSON.
             * @function toJSON
             * @memberof fs.FolderDiff.Rekeyed
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            Rekeyed.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for Rekeyed
             * @function getTypeUrl
             * @memberof fs.FolderDiff.Rekeyed
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            Rekeyed.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/fs.FolderDiff.Rekeyed";
            };

            return Rekeyed;
        })();

        return FolderDiff;
    })();

    fs.RemoteChildRequestBody = (function() {

        /**
         * Properties of a RemoteChildRequestBody.
         * @memberof fs
         * @interface IRemoteChildRequestBody
         * @property {string|null} [path] RemoteChildRequestBody path
         * @property {string|null} [remoteItemName] RemoteChildRequestBody remoteItemName
         * @property {common.IUInt64Value|null} [remoteVersion] RemoteChildRequestBody remoteVersion
         */

        /**
         * Constructs a new RemoteChildRequestBody.
         * @memberof fs
         * @classdesc Represents a RemoteChildRequestBody.
         * @implements IRemoteChildRequestBody
         * @constructor
         * @param {fs.IRemoteChildRequestBody=} [properties] Properties to set
         */
        function RemoteChildRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * RemoteChildRequestBody path.
         * @member {string} path
         * @memberof fs.RemoteChildRequestBody
         * @instance
         */
        RemoteChildRequestBody.prototype.path = "";

        /**
         * RemoteChildRequestBody remoteItemName.
         * @member {string} remoteItemName
         * @memberof fs.RemoteChildRequestBody
         * @instance
         */
        RemoteChildRequestBody.prototype.remoteItemName = "";

        /**
         * RemoteChildRequestBody remoteVersion.
         * @member {common.IUInt64Value|null|undefined} remoteVersion
         * @memberof fs.RemoteChildRequestBody
         * @instance
         */
        RemoteChildRequestBody.prototype.remoteVersion = null;

        /**
         * Creates a new RemoteChildRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.RemoteChildRequestBody
         * @static
         * @param {fs.IRemoteChildRequestBody=} [properties] Properties to set
         * @returns {fs.RemoteChildRequestBody} RemoteChildRequestBody instance
         */
        RemoteChildRequestBody.create = function create(properties) {
            return new RemoteChildRequestBody(properties);
        };

        /**
         * Encodes the specified RemoteChildRequestBody message. Does not implicitly {@link fs.RemoteChildRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.RemoteChildRequestBody
         * @static
         * @param {fs.IRemoteChildRequestBody} message RemoteChildRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        RemoteChildRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.remoteItemName != null && Object.hasOwnProperty.call(message, "remoteItemName"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.remoteItemName);
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified RemoteChildRequestBody message, length delimited. Does not implicitly {@link fs.RemoteChildRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.RemoteChildRequestBody
         * @static
         * @param {fs.IRemoteChildRequestBody} message RemoteChildRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        RemoteChildRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a RemoteChildRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.RemoteChildRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.RemoteChildRequestBody} RemoteChildRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        RemoteChildRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.RemoteChildRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.remoteItemName = reader.string();
                        break;
                    }
                case 3: {
                        message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a RemoteChildRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.RemoteChildRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.RemoteChildRequestBody} RemoteChildRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        RemoteChildRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a RemoteChildRequestBody message.
         * @function verify
         * @memberof fs.RemoteChildRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        RemoteChildRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.remoteItemName != null && Object.hasOwnProperty.call(message, "remoteItemName"))
                if (!$util.isString(message.remoteItemName))
                    return "remoteItemName: string expected";
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion, long + 1);
                if (error)
                    return "remoteVersion." + error;
            }
            return null;
        };

        /**
         * Creates a RemoteChildRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.RemoteChildRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.RemoteChildRequestBody} RemoteChildRequestBody
         */
        RemoteChildRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.RemoteChildRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.RemoteChildRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.RemoteChildRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.remoteItemName != null)
                message.remoteItemName = String(object.remoteItemName);
            if (object.remoteVersion != null) {
                if (!$util.isObject(object.remoteVersion))
                    throw TypeError(".fs.RemoteChildRequestBody.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a RemoteChildRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.RemoteChildRequestBody
         * @static
         * @param {fs.RemoteChildRequestBody} message RemoteChildRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        RemoteChildRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.remoteItemName = "";
                object.remoteVersion = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.remoteItemName != null && Object.hasOwnProperty.call(message, "remoteItemName"))
                object.remoteItemName = message.remoteItemName;
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options, q + 1);
            return object;
        };

        /**
         * Converts this RemoteChildRequestBody to JSON.
         * @function toJSON
         * @memberof fs.RemoteChildRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        RemoteChildRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for RemoteChildRequestBody
         * @function getTypeUrl
         * @memberof fs.RemoteChildRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        RemoteChildRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.RemoteChildRequestBody";
        };

        return RemoteChildRequestBody;
    })();

    fs.FSSyncUploadRequestBody = (function() {

        /**
         * Properties of a FSSyncUploadRequestBody.
         * @memberof fs
         * @interface IFSSyncUploadRequestBody
         * @property {string|null} [path] FSSyncUploadRequestBody path
         * @property {file.IOptionsToUploadLocal|null} [opts] FSSyncUploadRequestBody opts
         */

        /**
         * Constructs a new FSSyncUploadRequestBody.
         * @memberof fs
         * @classdesc Represents a FSSyncUploadRequestBody.
         * @implements IFSSyncUploadRequestBody
         * @constructor
         * @param {fs.IFSSyncUploadRequestBody=} [properties] Properties to set
         */
        function FSSyncUploadRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FSSyncUploadRequestBody path.
         * @member {string} path
         * @memberof fs.FSSyncUploadRequestBody
         * @instance
         */
        FSSyncUploadRequestBody.prototype.path = "";

        /**
         * FSSyncUploadRequestBody opts.
         * @member {file.IOptionsToUploadLocal|null|undefined} opts
         * @memberof fs.FSSyncUploadRequestBody
         * @instance
         */
        FSSyncUploadRequestBody.prototype.opts = null;

        /**
         * Creates a new FSSyncUploadRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.FSSyncUploadRequestBody
         * @static
         * @param {fs.IFSSyncUploadRequestBody=} [properties] Properties to set
         * @returns {fs.FSSyncUploadRequestBody} FSSyncUploadRequestBody instance
         */
        FSSyncUploadRequestBody.create = function create(properties) {
            return new FSSyncUploadRequestBody(properties);
        };

        /**
         * Encodes the specified FSSyncUploadRequestBody message. Does not implicitly {@link fs.FSSyncUploadRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.FSSyncUploadRequestBody
         * @static
         * @param {fs.IFSSyncUploadRequestBody} message FSSyncUploadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncUploadRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.file.OptionsToUploadLocal.encode(message.opts, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FSSyncUploadRequestBody message, length delimited. Does not implicitly {@link fs.FSSyncUploadRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FSSyncUploadRequestBody
         * @static
         * @param {fs.IFSSyncUploadRequestBody} message FSSyncUploadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncUploadRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FSSyncUploadRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FSSyncUploadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FSSyncUploadRequestBody} FSSyncUploadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSSyncUploadRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSSyncUploadRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.opts = $root.file.OptionsToUploadLocal.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FSSyncUploadRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FSSyncUploadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FSSyncUploadRequestBody} FSSyncUploadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSSyncUploadRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FSSyncUploadRequestBody message.
         * @function verify
         * @memberof fs.FSSyncUploadRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSSyncUploadRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts")) {
                var error = $root.file.OptionsToUploadLocal.verify(message.opts, long + 1);
                if (error)
                    return "opts." + error;
            }
            return null;
        };

        /**
         * Creates a FSSyncUploadRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSSyncUploadRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSSyncUploadRequestBody} FSSyncUploadRequestBody
         */
        FSSyncUploadRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FSSyncUploadRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FSSyncUploadRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FSSyncUploadRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.opts != null) {
                if (!$util.isObject(object.opts))
                    throw TypeError(".fs.FSSyncUploadRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToUploadLocal.fromObject(object.opts, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a FSSyncUploadRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSSyncUploadRequestBody
         * @static
         * @param {fs.FSSyncUploadRequestBody} message FSSyncUploadRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSSyncUploadRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.opts = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                object.opts = $root.file.OptionsToUploadLocal.toObject(message.opts, options, q + 1);
            return object;
        };

        /**
         * Converts this FSSyncUploadRequestBody to JSON.
         * @function toJSON
         * @memberof fs.FSSyncUploadRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FSSyncUploadRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FSSyncUploadRequestBody
         * @function getTypeUrl
         * @memberof fs.FSSyncUploadRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FSSyncUploadRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FSSyncUploadRequestBody";
        };

        return FSSyncUploadRequestBody;
    })();

    fs.AdoptRemoteFolderItemRequestBody = (function() {

        /**
         * Properties of an AdoptRemoteFolderItemRequestBody.
         * @memberof fs
         * @interface IAdoptRemoteFolderItemRequestBody
         * @property {string|null} [path] AdoptRemoteFolderItemRequestBody path
         * @property {string|null} [itemName] AdoptRemoteFolderItemRequestBody itemName
         * @property {fs.AdoptRemoteFolderItemRequestBody.IOptions|null} [opts] AdoptRemoteFolderItemRequestBody opts
         */

        /**
         * Constructs a new AdoptRemoteFolderItemRequestBody.
         * @memberof fs
         * @classdesc Represents an AdoptRemoteFolderItemRequestBody.
         * @implements IAdoptRemoteFolderItemRequestBody
         * @constructor
         * @param {fs.IAdoptRemoteFolderItemRequestBody=} [properties] Properties to set
         */
        function AdoptRemoteFolderItemRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * AdoptRemoteFolderItemRequestBody path.
         * @member {string} path
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @instance
         */
        AdoptRemoteFolderItemRequestBody.prototype.path = "";

        /**
         * AdoptRemoteFolderItemRequestBody itemName.
         * @member {string} itemName
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @instance
         */
        AdoptRemoteFolderItemRequestBody.prototype.itemName = "";

        /**
         * AdoptRemoteFolderItemRequestBody opts.
         * @member {fs.AdoptRemoteFolderItemRequestBody.IOptions|null|undefined} opts
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @instance
         */
        AdoptRemoteFolderItemRequestBody.prototype.opts = null;

        /**
         * Creates a new AdoptRemoteFolderItemRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @static
         * @param {fs.IAdoptRemoteFolderItemRequestBody=} [properties] Properties to set
         * @returns {fs.AdoptRemoteFolderItemRequestBody} AdoptRemoteFolderItemRequestBody instance
         */
        AdoptRemoteFolderItemRequestBody.create = function create(properties) {
            return new AdoptRemoteFolderItemRequestBody(properties);
        };

        /**
         * Encodes the specified AdoptRemoteFolderItemRequestBody message. Does not implicitly {@link fs.AdoptRemoteFolderItemRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @static
         * @param {fs.IAdoptRemoteFolderItemRequestBody} message AdoptRemoteFolderItemRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AdoptRemoteFolderItemRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.itemName != null && Object.hasOwnProperty.call(message, "itemName"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.itemName);
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.fs.AdoptRemoteFolderItemRequestBody.Options.encode(message.opts, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified AdoptRemoteFolderItemRequestBody message, length delimited. Does not implicitly {@link fs.AdoptRemoteFolderItemRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @static
         * @param {fs.IAdoptRemoteFolderItemRequestBody} message AdoptRemoteFolderItemRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AdoptRemoteFolderItemRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an AdoptRemoteFolderItemRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.AdoptRemoteFolderItemRequestBody} AdoptRemoteFolderItemRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AdoptRemoteFolderItemRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.AdoptRemoteFolderItemRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.itemName = reader.string();
                        break;
                    }
                case 3: {
                        message.opts = $root.fs.AdoptRemoteFolderItemRequestBody.Options.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an AdoptRemoteFolderItemRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.AdoptRemoteFolderItemRequestBody} AdoptRemoteFolderItemRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AdoptRemoteFolderItemRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an AdoptRemoteFolderItemRequestBody message.
         * @function verify
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        AdoptRemoteFolderItemRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.itemName != null && Object.hasOwnProperty.call(message, "itemName"))
                if (!$util.isString(message.itemName))
                    return "itemName: string expected";
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts")) {
                var error = $root.fs.AdoptRemoteFolderItemRequestBody.Options.verify(message.opts, long + 1);
                if (error)
                    return "opts." + error;
            }
            return null;
        };

        /**
         * Creates an AdoptRemoteFolderItemRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.AdoptRemoteFolderItemRequestBody} AdoptRemoteFolderItemRequestBody
         */
        AdoptRemoteFolderItemRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.AdoptRemoteFolderItemRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.AdoptRemoteFolderItemRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.AdoptRemoteFolderItemRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.itemName != null)
                message.itemName = String(object.itemName);
            if (object.opts != null) {
                if (!$util.isObject(object.opts))
                    throw TypeError(".fs.AdoptRemoteFolderItemRequestBody.opts: object expected");
                message.opts = $root.fs.AdoptRemoteFolderItemRequestBody.Options.fromObject(object.opts, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an AdoptRemoteFolderItemRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @static
         * @param {fs.AdoptRemoteFolderItemRequestBody} message AdoptRemoteFolderItemRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        AdoptRemoteFolderItemRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.itemName = "";
                object.opts = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.itemName != null && Object.hasOwnProperty.call(message, "itemName"))
                object.itemName = message.itemName;
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                object.opts = $root.fs.AdoptRemoteFolderItemRequestBody.Options.toObject(message.opts, options, q + 1);
            return object;
        };

        /**
         * Converts this AdoptRemoteFolderItemRequestBody to JSON.
         * @function toJSON
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        AdoptRemoteFolderItemRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for AdoptRemoteFolderItemRequestBody
         * @function getTypeUrl
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        AdoptRemoteFolderItemRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.AdoptRemoteFolderItemRequestBody";
        };

        AdoptRemoteFolderItemRequestBody.Options = (function() {

            /**
             * Properties of an Options.
             * @memberof fs.AdoptRemoteFolderItemRequestBody
             * @interface IOptions
             * @property {common.IUInt64Value|null} [localVersion] Options localVersion
             * @property {common.IUInt64Value|null} [uploadVersion] Options uploadVersion
             * @property {common.IBooleanValue|null} [replaceLocalItem] Options replaceLocalItem
             * @property {common.IStringValue|null} [newItemName] Options newItemName
             */

            /**
             * Constructs a new Options.
             * @memberof fs.AdoptRemoteFolderItemRequestBody
             * @classdesc Represents an Options.
             * @implements IOptions
             * @constructor
             * @param {fs.AdoptRemoteFolderItemRequestBody.IOptions=} [properties] Properties to set
             */
            function Options(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * Options localVersion.
             * @member {common.IUInt64Value|null|undefined} localVersion
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @instance
             */
            Options.prototype.localVersion = null;

            /**
             * Options uploadVersion.
             * @member {common.IUInt64Value|null|undefined} uploadVersion
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @instance
             */
            Options.prototype.uploadVersion = null;

            /**
             * Options replaceLocalItem.
             * @member {common.IBooleanValue|null|undefined} replaceLocalItem
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @instance
             */
            Options.prototype.replaceLocalItem = null;

            /**
             * Options newItemName.
             * @member {common.IStringValue|null|undefined} newItemName
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @instance
             */
            Options.prototype.newItemName = null;

            /**
             * Creates a new Options instance using the specified properties.
             * @function create
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @static
             * @param {fs.AdoptRemoteFolderItemRequestBody.IOptions=} [properties] Properties to set
             * @returns {fs.AdoptRemoteFolderItemRequestBody.Options} Options instance
             */
            Options.create = function create(properties) {
                return new Options(properties);
            };

            /**
             * Encodes the specified Options message. Does not implicitly {@link fs.AdoptRemoteFolderItemRequestBody.Options.verify|verify} messages.
             * @function encode
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @static
             * @param {fs.AdoptRemoteFolderItemRequestBody.IOptions} message Options message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Options.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                    $root.common.UInt64Value.encode(message.localVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
                if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                    $root.common.UInt64Value.encode(message.uploadVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
                if (message.replaceLocalItem != null && Object.hasOwnProperty.call(message, "replaceLocalItem"))
                    $root.common.BooleanValue.encode(message.replaceLocalItem, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
                if (message.newItemName != null && Object.hasOwnProperty.call(message, "newItemName"))
                    $root.common.StringValue.encode(message.newItemName, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
                return writer;
            };

            /**
             * Encodes the specified Options message, length delimited. Does not implicitly {@link fs.AdoptRemoteFolderItemRequestBody.Options.verify|verify} messages.
             * @function encodeDelimited
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @static
             * @param {fs.AdoptRemoteFolderItemRequestBody.IOptions} message Options message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Options.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes an Options message from the specified reader or buffer.
             * @function decode
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {fs.AdoptRemoteFolderItemRequestBody.Options} Options
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Options.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.AdoptRemoteFolderItemRequestBody.Options();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.localVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 2: {
                            message.uploadVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 3: {
                            message.replaceLocalItem = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 4: {
                            message.newItemName = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes an Options message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {fs.AdoptRemoteFolderItemRequestBody.Options} Options
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Options.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies an Options message.
             * @function verify
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            Options.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion")) {
                    var error = $root.common.UInt64Value.verify(message.localVersion, long + 1);
                    if (error)
                        return "localVersion." + error;
                }
                if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion")) {
                    var error = $root.common.UInt64Value.verify(message.uploadVersion, long + 1);
                    if (error)
                        return "uploadVersion." + error;
                }
                if (message.replaceLocalItem != null && Object.hasOwnProperty.call(message, "replaceLocalItem")) {
                    var error = $root.common.BooleanValue.verify(message.replaceLocalItem, long + 1);
                    if (error)
                        return "replaceLocalItem." + error;
                }
                if (message.newItemName != null && Object.hasOwnProperty.call(message, "newItemName")) {
                    var error = $root.common.StringValue.verify(message.newItemName, long + 1);
                    if (error)
                        return "newItemName." + error;
                }
                return null;
            };

            /**
             * Creates an Options message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {fs.AdoptRemoteFolderItemRequestBody.Options} Options
             */
            Options.fromObject = function fromObject(object, long) {
                if (object instanceof $root.fs.AdoptRemoteFolderItemRequestBody.Options)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".fs.AdoptRemoteFolderItemRequestBody.Options: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.fs.AdoptRemoteFolderItemRequestBody.Options();
                if (object.localVersion != null) {
                    if (!$util.isObject(object.localVersion))
                        throw TypeError(".fs.AdoptRemoteFolderItemRequestBody.Options.localVersion: object expected");
                    message.localVersion = $root.common.UInt64Value.fromObject(object.localVersion, long + 1);
                }
                if (object.uploadVersion != null) {
                    if (!$util.isObject(object.uploadVersion))
                        throw TypeError(".fs.AdoptRemoteFolderItemRequestBody.Options.uploadVersion: object expected");
                    message.uploadVersion = $root.common.UInt64Value.fromObject(object.uploadVersion, long + 1);
                }
                if (object.replaceLocalItem != null) {
                    if (!$util.isObject(object.replaceLocalItem))
                        throw TypeError(".fs.AdoptRemoteFolderItemRequestBody.Options.replaceLocalItem: object expected");
                    message.replaceLocalItem = $root.common.BooleanValue.fromObject(object.replaceLocalItem, long + 1);
                }
                if (object.newItemName != null) {
                    if (!$util.isObject(object.newItemName))
                        throw TypeError(".fs.AdoptRemoteFolderItemRequestBody.Options.newItemName: object expected");
                    message.newItemName = $root.common.StringValue.fromObject(object.newItemName, long + 1);
                }
                return message;
            };

            /**
             * Creates a plain object from an Options message. Also converts values to other types if specified.
             * @function toObject
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @static
             * @param {fs.AdoptRemoteFolderItemRequestBody.Options} message Options
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            Options.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults) {
                    object.localVersion = null;
                    object.uploadVersion = null;
                    object.replaceLocalItem = null;
                    object.newItemName = null;
                }
                if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                    object.localVersion = $root.common.UInt64Value.toObject(message.localVersion, options, q + 1);
                if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                    object.uploadVersion = $root.common.UInt64Value.toObject(message.uploadVersion, options, q + 1);
                if (message.replaceLocalItem != null && Object.hasOwnProperty.call(message, "replaceLocalItem"))
                    object.replaceLocalItem = $root.common.BooleanValue.toObject(message.replaceLocalItem, options, q + 1);
                if (message.newItemName != null && Object.hasOwnProperty.call(message, "newItemName"))
                    object.newItemName = $root.common.StringValue.toObject(message.newItemName, options, q + 1);
                return object;
            };

            /**
             * Converts this Options to JSON.
             * @function toJSON
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            Options.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for Options
             * @function getTypeUrl
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            Options.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/fs.AdoptRemoteFolderItemRequestBody.Options";
            };

            return Options;
        })();

        return AdoptRemoteFolderItemRequestBody;
    })();

    fs.AbsorbRemoteFolderChangesRequestBody = (function() {

        /**
         * Properties of an AbsorbRemoteFolderChangesRequestBody.
         * @memberof fs
         * @interface IAbsorbRemoteFolderChangesRequestBody
         * @property {string|null} [path] AbsorbRemoteFolderChangesRequestBody path
         * @property {fs.AbsorbRemoteFolderChangesRequestBody.IOptions|null} [opts] AbsorbRemoteFolderChangesRequestBody opts
         */

        /**
         * Constructs a new AbsorbRemoteFolderChangesRequestBody.
         * @memberof fs
         * @classdesc Represents an AbsorbRemoteFolderChangesRequestBody.
         * @implements IAbsorbRemoteFolderChangesRequestBody
         * @constructor
         * @param {fs.IAbsorbRemoteFolderChangesRequestBody=} [properties] Properties to set
         */
        function AbsorbRemoteFolderChangesRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * AbsorbRemoteFolderChangesRequestBody path.
         * @member {string} path
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @instance
         */
        AbsorbRemoteFolderChangesRequestBody.prototype.path = "";

        /**
         * AbsorbRemoteFolderChangesRequestBody opts.
         * @member {fs.AbsorbRemoteFolderChangesRequestBody.IOptions|null|undefined} opts
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @instance
         */
        AbsorbRemoteFolderChangesRequestBody.prototype.opts = null;

        /**
         * Creates a new AbsorbRemoteFolderChangesRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @static
         * @param {fs.IAbsorbRemoteFolderChangesRequestBody=} [properties] Properties to set
         * @returns {fs.AbsorbRemoteFolderChangesRequestBody} AbsorbRemoteFolderChangesRequestBody instance
         */
        AbsorbRemoteFolderChangesRequestBody.create = function create(properties) {
            return new AbsorbRemoteFolderChangesRequestBody(properties);
        };

        /**
         * Encodes the specified AbsorbRemoteFolderChangesRequestBody message. Does not implicitly {@link fs.AbsorbRemoteFolderChangesRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @static
         * @param {fs.IAbsorbRemoteFolderChangesRequestBody} message AbsorbRemoteFolderChangesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AbsorbRemoteFolderChangesRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.fs.AbsorbRemoteFolderChangesRequestBody.Options.encode(message.opts, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified AbsorbRemoteFolderChangesRequestBody message, length delimited. Does not implicitly {@link fs.AbsorbRemoteFolderChangesRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @static
         * @param {fs.IAbsorbRemoteFolderChangesRequestBody} message AbsorbRemoteFolderChangesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AbsorbRemoteFolderChangesRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an AbsorbRemoteFolderChangesRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.AbsorbRemoteFolderChangesRequestBody} AbsorbRemoteFolderChangesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AbsorbRemoteFolderChangesRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.AbsorbRemoteFolderChangesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.opts = $root.fs.AbsorbRemoteFolderChangesRequestBody.Options.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an AbsorbRemoteFolderChangesRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.AbsorbRemoteFolderChangesRequestBody} AbsorbRemoteFolderChangesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AbsorbRemoteFolderChangesRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an AbsorbRemoteFolderChangesRequestBody message.
         * @function verify
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        AbsorbRemoteFolderChangesRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts")) {
                var error = $root.fs.AbsorbRemoteFolderChangesRequestBody.Options.verify(message.opts, long + 1);
                if (error)
                    return "opts." + error;
            }
            return null;
        };

        /**
         * Creates an AbsorbRemoteFolderChangesRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.AbsorbRemoteFolderChangesRequestBody} AbsorbRemoteFolderChangesRequestBody
         */
        AbsorbRemoteFolderChangesRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.AbsorbRemoteFolderChangesRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.AbsorbRemoteFolderChangesRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.AbsorbRemoteFolderChangesRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.opts != null) {
                if (!$util.isObject(object.opts))
                    throw TypeError(".fs.AbsorbRemoteFolderChangesRequestBody.opts: object expected");
                message.opts = $root.fs.AbsorbRemoteFolderChangesRequestBody.Options.fromObject(object.opts, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an AbsorbRemoteFolderChangesRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @static
         * @param {fs.AbsorbRemoteFolderChangesRequestBody} message AbsorbRemoteFolderChangesRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        AbsorbRemoteFolderChangesRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.opts = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                object.opts = $root.fs.AbsorbRemoteFolderChangesRequestBody.Options.toObject(message.opts, options, q + 1);
            return object;
        };

        /**
         * Converts this AbsorbRemoteFolderChangesRequestBody to JSON.
         * @function toJSON
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        AbsorbRemoteFolderChangesRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for AbsorbRemoteFolderChangesRequestBody
         * @function getTypeUrl
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        AbsorbRemoteFolderChangesRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.AbsorbRemoteFolderChangesRequestBody";
        };

        AbsorbRemoteFolderChangesRequestBody.Options = (function() {

            /**
             * Properties of an Options.
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody
             * @interface IOptions
             * @property {common.IUInt64Value|null} [localVersion] Options localVersion
             * @property {common.IStringValue|null} [postfixForNameOverlaps] Options postfixForNameOverlaps
             * @property {common.IUInt64Value|null} [remoteVersion] Options remoteVersion
             */

            /**
             * Constructs a new Options.
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody
             * @classdesc Represents an Options.
             * @implements IOptions
             * @constructor
             * @param {fs.AbsorbRemoteFolderChangesRequestBody.IOptions=} [properties] Properties to set
             */
            function Options(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * Options localVersion.
             * @member {common.IUInt64Value|null|undefined} localVersion
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @instance
             */
            Options.prototype.localVersion = null;

            /**
             * Options postfixForNameOverlaps.
             * @member {common.IStringValue|null|undefined} postfixForNameOverlaps
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @instance
             */
            Options.prototype.postfixForNameOverlaps = null;

            /**
             * Options remoteVersion.
             * @member {common.IUInt64Value|null|undefined} remoteVersion
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @instance
             */
            Options.prototype.remoteVersion = null;

            /**
             * Creates a new Options instance using the specified properties.
             * @function create
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @static
             * @param {fs.AbsorbRemoteFolderChangesRequestBody.IOptions=} [properties] Properties to set
             * @returns {fs.AbsorbRemoteFolderChangesRequestBody.Options} Options instance
             */
            Options.create = function create(properties) {
                return new Options(properties);
            };

            /**
             * Encodes the specified Options message. Does not implicitly {@link fs.AbsorbRemoteFolderChangesRequestBody.Options.verify|verify} messages.
             * @function encode
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @static
             * @param {fs.AbsorbRemoteFolderChangesRequestBody.IOptions} message Options message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Options.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                    $root.common.UInt64Value.encode(message.localVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
                if (message.postfixForNameOverlaps != null && Object.hasOwnProperty.call(message, "postfixForNameOverlaps"))
                    $root.common.StringValue.encode(message.postfixForNameOverlaps, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
                if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                    $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
                return writer;
            };

            /**
             * Encodes the specified Options message, length delimited. Does not implicitly {@link fs.AbsorbRemoteFolderChangesRequestBody.Options.verify|verify} messages.
             * @function encodeDelimited
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @static
             * @param {fs.AbsorbRemoteFolderChangesRequestBody.IOptions} message Options message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Options.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes an Options message from the specified reader or buffer.
             * @function decode
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {fs.AbsorbRemoteFolderChangesRequestBody.Options} Options
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Options.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.AbsorbRemoteFolderChangesRequestBody.Options();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.localVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 2: {
                            message.postfixForNameOverlaps = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 3: {
                            message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes an Options message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {fs.AbsorbRemoteFolderChangesRequestBody.Options} Options
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Options.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies an Options message.
             * @function verify
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            Options.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion")) {
                    var error = $root.common.UInt64Value.verify(message.localVersion, long + 1);
                    if (error)
                        return "localVersion." + error;
                }
                if (message.postfixForNameOverlaps != null && Object.hasOwnProperty.call(message, "postfixForNameOverlaps")) {
                    var error = $root.common.StringValue.verify(message.postfixForNameOverlaps, long + 1);
                    if (error)
                        return "postfixForNameOverlaps." + error;
                }
                if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion")) {
                    var error = $root.common.UInt64Value.verify(message.remoteVersion, long + 1);
                    if (error)
                        return "remoteVersion." + error;
                }
                return null;
            };

            /**
             * Creates an Options message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {fs.AbsorbRemoteFolderChangesRequestBody.Options} Options
             */
            Options.fromObject = function fromObject(object, long) {
                if (object instanceof $root.fs.AbsorbRemoteFolderChangesRequestBody.Options)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".fs.AbsorbRemoteFolderChangesRequestBody.Options: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.fs.AbsorbRemoteFolderChangesRequestBody.Options();
                if (object.localVersion != null) {
                    if (!$util.isObject(object.localVersion))
                        throw TypeError(".fs.AbsorbRemoteFolderChangesRequestBody.Options.localVersion: object expected");
                    message.localVersion = $root.common.UInt64Value.fromObject(object.localVersion, long + 1);
                }
                if (object.postfixForNameOverlaps != null) {
                    if (!$util.isObject(object.postfixForNameOverlaps))
                        throw TypeError(".fs.AbsorbRemoteFolderChangesRequestBody.Options.postfixForNameOverlaps: object expected");
                    message.postfixForNameOverlaps = $root.common.StringValue.fromObject(object.postfixForNameOverlaps, long + 1);
                }
                if (object.remoteVersion != null) {
                    if (!$util.isObject(object.remoteVersion))
                        throw TypeError(".fs.AbsorbRemoteFolderChangesRequestBody.Options.remoteVersion: object expected");
                    message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion, long + 1);
                }
                return message;
            };

            /**
             * Creates a plain object from an Options message. Also converts values to other types if specified.
             * @function toObject
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @static
             * @param {fs.AbsorbRemoteFolderChangesRequestBody.Options} message Options
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            Options.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults) {
                    object.localVersion = null;
                    object.postfixForNameOverlaps = null;
                    object.remoteVersion = null;
                }
                if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                    object.localVersion = $root.common.UInt64Value.toObject(message.localVersion, options, q + 1);
                if (message.postfixForNameOverlaps != null && Object.hasOwnProperty.call(message, "postfixForNameOverlaps"))
                    object.postfixForNameOverlaps = $root.common.StringValue.toObject(message.postfixForNameOverlaps, options, q + 1);
                if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                    object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options, q + 1);
                return object;
            };

            /**
             * Converts this Options to JSON.
             * @function toJSON
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            Options.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for Options
             * @function getTypeUrl
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            Options.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/fs.AbsorbRemoteFolderChangesRequestBody.Options";
            };

            return Options;
        })();

        return AbsorbRemoteFolderChangesRequestBody;
    })();

    fs.AbsorbRemoteFolderChangesReplyBody = (function() {

        /**
         * Properties of an AbsorbRemoteFolderChangesReplyBody.
         * @memberof fs
         * @interface IAbsorbRemoteFolderChangesReplyBody
         * @property {common.IUInt64Value|null} [newVersion] AbsorbRemoteFolderChangesReplyBody newVersion
         */

        /**
         * Constructs a new AbsorbRemoteFolderChangesReplyBody.
         * @memberof fs
         * @classdesc Represents an AbsorbRemoteFolderChangesReplyBody.
         * @implements IAbsorbRemoteFolderChangesReplyBody
         * @constructor
         * @param {fs.IAbsorbRemoteFolderChangesReplyBody=} [properties] Properties to set
         */
        function AbsorbRemoteFolderChangesReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * AbsorbRemoteFolderChangesReplyBody newVersion.
         * @member {common.IUInt64Value|null|undefined} newVersion
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @instance
         */
        AbsorbRemoteFolderChangesReplyBody.prototype.newVersion = null;

        /**
         * Creates a new AbsorbRemoteFolderChangesReplyBody instance using the specified properties.
         * @function create
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @static
         * @param {fs.IAbsorbRemoteFolderChangesReplyBody=} [properties] Properties to set
         * @returns {fs.AbsorbRemoteFolderChangesReplyBody} AbsorbRemoteFolderChangesReplyBody instance
         */
        AbsorbRemoteFolderChangesReplyBody.create = function create(properties) {
            return new AbsorbRemoteFolderChangesReplyBody(properties);
        };

        /**
         * Encodes the specified AbsorbRemoteFolderChangesReplyBody message. Does not implicitly {@link fs.AbsorbRemoteFolderChangesReplyBody.verify|verify} messages.
         * @function encode
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @static
         * @param {fs.IAbsorbRemoteFolderChangesReplyBody} message AbsorbRemoteFolderChangesReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AbsorbRemoteFolderChangesReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.newVersion != null && Object.hasOwnProperty.call(message, "newVersion"))
                $root.common.UInt64Value.encode(message.newVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified AbsorbRemoteFolderChangesReplyBody message, length delimited. Does not implicitly {@link fs.AbsorbRemoteFolderChangesReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @static
         * @param {fs.IAbsorbRemoteFolderChangesReplyBody} message AbsorbRemoteFolderChangesReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AbsorbRemoteFolderChangesReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an AbsorbRemoteFolderChangesReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.AbsorbRemoteFolderChangesReplyBody} AbsorbRemoteFolderChangesReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AbsorbRemoteFolderChangesReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.AbsorbRemoteFolderChangesReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.newVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an AbsorbRemoteFolderChangesReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.AbsorbRemoteFolderChangesReplyBody} AbsorbRemoteFolderChangesReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AbsorbRemoteFolderChangesReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an AbsorbRemoteFolderChangesReplyBody message.
         * @function verify
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        AbsorbRemoteFolderChangesReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.newVersion != null && Object.hasOwnProperty.call(message, "newVersion")) {
                var error = $root.common.UInt64Value.verify(message.newVersion, long + 1);
                if (error)
                    return "newVersion." + error;
            }
            return null;
        };

        /**
         * Creates an AbsorbRemoteFolderChangesReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.AbsorbRemoteFolderChangesReplyBody} AbsorbRemoteFolderChangesReplyBody
         */
        AbsorbRemoteFolderChangesReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.AbsorbRemoteFolderChangesReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.AbsorbRemoteFolderChangesReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.AbsorbRemoteFolderChangesReplyBody();
            if (object.newVersion != null) {
                if (!$util.isObject(object.newVersion))
                    throw TypeError(".fs.AbsorbRemoteFolderChangesReplyBody.newVersion: object expected");
                message.newVersion = $root.common.UInt64Value.fromObject(object.newVersion, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an AbsorbRemoteFolderChangesReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @static
         * @param {fs.AbsorbRemoteFolderChangesReplyBody} message AbsorbRemoteFolderChangesReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        AbsorbRemoteFolderChangesReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.newVersion = null;
            if (message.newVersion != null && Object.hasOwnProperty.call(message, "newVersion"))
                object.newVersion = $root.common.UInt64Value.toObject(message.newVersion, options, q + 1);
            return object;
        };

        /**
         * Converts this AbsorbRemoteFolderChangesReplyBody to JSON.
         * @function toJSON
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        AbsorbRemoteFolderChangesReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for AbsorbRemoteFolderChangesReplyBody
         * @function getTypeUrl
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        AbsorbRemoteFolderChangesReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.AbsorbRemoteFolderChangesReplyBody";
        };

        return AbsorbRemoteFolderChangesReplyBody;
    })();

    return fs;
})();

$root.common = (function() {

    /**
     * Namespace common.
     * @exports common
     * @namespace
     */
    var common = {};

    common.ObjectReference = (function() {

        /**
         * Properties of an ObjectReference.
         * @memberof common
         * @interface IObjectReference
         * @property {string|null} [objType] ObjectReference objType
         * @property {Array.<string>|null} [path] ObjectReference path
         */

        /**
         * Constructs a new ObjectReference.
         * @memberof common
         * @classdesc Represents an ObjectReference.
         * @implements IObjectReference
         * @constructor
         * @param {common.IObjectReference=} [properties] Properties to set
         */
        function ObjectReference(properties) {
            this.path = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ObjectReference objType.
         * @member {string} objType
         * @memberof common.ObjectReference
         * @instance
         */
        ObjectReference.prototype.objType = "";

        /**
         * ObjectReference path.
         * @member {Array.<string>} path
         * @memberof common.ObjectReference
         * @instance
         */
        ObjectReference.prototype.path = $util.emptyArray;

        /**
         * Creates a new ObjectReference instance using the specified properties.
         * @function create
         * @memberof common.ObjectReference
         * @static
         * @param {common.IObjectReference=} [properties] Properties to set
         * @returns {common.ObjectReference} ObjectReference instance
         */
        ObjectReference.create = function create(properties) {
            return new ObjectReference(properties);
        };

        /**
         * Encodes the specified ObjectReference message. Does not implicitly {@link common.ObjectReference.verify|verify} messages.
         * @function encode
         * @memberof common.ObjectReference
         * @static
         * @param {common.IObjectReference} message ObjectReference message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ObjectReference.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.objType != null && Object.hasOwnProperty.call(message, "objType"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.objType);
            if (message.path != null && message.path.length)
                for (var i = 0; i < message.path.length; ++i)
                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.path[i]);
            return writer;
        };

        /**
         * Encodes the specified ObjectReference message, length delimited. Does not implicitly {@link common.ObjectReference.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.ObjectReference
         * @static
         * @param {common.IObjectReference} message ObjectReference message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ObjectReference.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an ObjectReference message from the specified reader or buffer.
         * @function decode
         * @memberof common.ObjectReference
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.ObjectReference} ObjectReference
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ObjectReference.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ObjectReference();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.objType = reader.string();
                        break;
                    }
                case 2: {
                        if (!(message.path && message.path.length))
                            message.path = [];
                        message.path.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an ObjectReference message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.ObjectReference
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.ObjectReference} ObjectReference
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ObjectReference.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an ObjectReference message.
         * @function verify
         * @memberof common.ObjectReference
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ObjectReference.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.objType != null && Object.hasOwnProperty.call(message, "objType"))
                if (!$util.isString(message.objType))
                    return "objType: string expected";
            if (message.path != null && Object.hasOwnProperty.call(message, "path")) {
                if (!Array.isArray(message.path))
                    return "path: array expected";
                for (var i = 0; i < message.path.length; ++i)
                    if (!$util.isString(message.path[i]))
                        return "path: string[] expected";
            }
            return null;
        };

        /**
         * Creates an ObjectReference message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.ObjectReference
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.ObjectReference} ObjectReference
         */
        ObjectReference.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.ObjectReference)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.ObjectReference: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.ObjectReference();
            if (object.objType != null)
                message.objType = String(object.objType);
            if (object.path) {
                if (!Array.isArray(object.path))
                    throw TypeError(".common.ObjectReference.path: array expected");
                message.path = [];
                for (var i = 0; i < object.path.length; ++i)
                    message.path[i] = String(object.path[i]);
            }
            return message;
        };

        /**
         * Creates a plain object from an ObjectReference message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.ObjectReference
         * @static
         * @param {common.ObjectReference} message ObjectReference
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ObjectReference.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.path = [];
            if (options.defaults)
                object.objType = "";
            if (message.objType != null && Object.hasOwnProperty.call(message, "objType"))
                object.objType = message.objType;
            if (message.path && message.path.length) {
                object.path = [];
                for (var j = 0; j < message.path.length; ++j)
                    object.path[j] = message.path[j];
            }
            return object;
        };

        /**
         * Converts this ObjectReference to JSON.
         * @function toJSON
         * @memberof common.ObjectReference
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ObjectReference.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ObjectReference
         * @function getTypeUrl
         * @memberof common.ObjectReference
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ObjectReference.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.ObjectReference";
        };

        return ObjectReference;
    })();

    common.BooleanValue = (function() {

        /**
         * Properties of a BooleanValue.
         * @memberof common
         * @interface IBooleanValue
         * @property {boolean|null} [value] BooleanValue value
         */

        /**
         * Constructs a new BooleanValue.
         * @memberof common
         * @classdesc Represents a BooleanValue.
         * @implements IBooleanValue
         * @constructor
         * @param {common.IBooleanValue=} [properties] Properties to set
         */
        function BooleanValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * BooleanValue value.
         * @member {boolean} value
         * @memberof common.BooleanValue
         * @instance
         */
        BooleanValue.prototype.value = false;

        /**
         * Creates a new BooleanValue instance using the specified properties.
         * @function create
         * @memberof common.BooleanValue
         * @static
         * @param {common.IBooleanValue=} [properties] Properties to set
         * @returns {common.BooleanValue} BooleanValue instance
         */
        BooleanValue.create = function create(properties) {
            return new BooleanValue(properties);
        };

        /**
         * Encodes the specified BooleanValue message. Does not implicitly {@link common.BooleanValue.verify|verify} messages.
         * @function encode
         * @memberof common.BooleanValue
         * @static
         * @param {common.IBooleanValue} message BooleanValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BooleanValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 0 =*/8).bool(message.value);
            return writer;
        };

        /**
         * Encodes the specified BooleanValue message, length delimited. Does not implicitly {@link common.BooleanValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.BooleanValue
         * @static
         * @param {common.IBooleanValue} message BooleanValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BooleanValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a BooleanValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.BooleanValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.BooleanValue} BooleanValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BooleanValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BooleanValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.bool();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a BooleanValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.BooleanValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.BooleanValue} BooleanValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BooleanValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a BooleanValue message.
         * @function verify
         * @memberof common.BooleanValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        BooleanValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (typeof message.value !== "boolean")
                    return "value: boolean expected";
            return null;
        };

        /**
         * Creates a BooleanValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.BooleanValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.BooleanValue} BooleanValue
         */
        BooleanValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.BooleanValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.BooleanValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.BooleanValue();
            if (object.value != null)
                message.value = Boolean(object.value);
            return message;
        };

        /**
         * Creates a plain object from a BooleanValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.BooleanValue
         * @static
         * @param {common.BooleanValue} message BooleanValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        BooleanValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.value = false;
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = message.value;
            return object;
        };

        /**
         * Converts this BooleanValue to JSON.
         * @function toJSON
         * @memberof common.BooleanValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        BooleanValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for BooleanValue
         * @function getTypeUrl
         * @memberof common.BooleanValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        BooleanValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.BooleanValue";
        };

        return BooleanValue;
    })();

    common.StringArrayValue = (function() {

        /**
         * Properties of a StringArrayValue.
         * @memberof common
         * @interface IStringArrayValue
         * @property {Array.<string>|null} [values] StringArrayValue values
         */

        /**
         * Constructs a new StringArrayValue.
         * @memberof common
         * @classdesc Represents a StringArrayValue.
         * @implements IStringArrayValue
         * @constructor
         * @param {common.IStringArrayValue=} [properties] Properties to set
         */
        function StringArrayValue(properties) {
            this.values = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * StringArrayValue values.
         * @member {Array.<string>} values
         * @memberof common.StringArrayValue
         * @instance
         */
        StringArrayValue.prototype.values = $util.emptyArray;

        /**
         * Creates a new StringArrayValue instance using the specified properties.
         * @function create
         * @memberof common.StringArrayValue
         * @static
         * @param {common.IStringArrayValue=} [properties] Properties to set
         * @returns {common.StringArrayValue} StringArrayValue instance
         */
        StringArrayValue.create = function create(properties) {
            return new StringArrayValue(properties);
        };

        /**
         * Encodes the specified StringArrayValue message. Does not implicitly {@link common.StringArrayValue.verify|verify} messages.
         * @function encode
         * @memberof common.StringArrayValue
         * @static
         * @param {common.IStringArrayValue} message StringArrayValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringArrayValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.values != null && message.values.length)
                for (var i = 0; i < message.values.length; ++i)
                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.values[i]);
            return writer;
        };

        /**
         * Encodes the specified StringArrayValue message, length delimited. Does not implicitly {@link common.StringArrayValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.StringArrayValue
         * @static
         * @param {common.IStringArrayValue} message StringArrayValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringArrayValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a StringArrayValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.StringArrayValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.StringArrayValue} StringArrayValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringArrayValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringArrayValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.values && message.values.length))
                            message.values = [];
                        message.values.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a StringArrayValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.StringArrayValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.StringArrayValue} StringArrayValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringArrayValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a StringArrayValue message.
         * @function verify
         * @memberof common.StringArrayValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        StringArrayValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.values != null && Object.hasOwnProperty.call(message, "values")) {
                if (!Array.isArray(message.values))
                    return "values: array expected";
                for (var i = 0; i < message.values.length; ++i)
                    if (!$util.isString(message.values[i]))
                        return "values: string[] expected";
            }
            return null;
        };

        /**
         * Creates a StringArrayValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.StringArrayValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.StringArrayValue} StringArrayValue
         */
        StringArrayValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.StringArrayValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.StringArrayValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.StringArrayValue();
            if (object.values) {
                if (!Array.isArray(object.values))
                    throw TypeError(".common.StringArrayValue.values: array expected");
                message.values = [];
                for (var i = 0; i < object.values.length; ++i)
                    message.values[i] = String(object.values[i]);
            }
            return message;
        };

        /**
         * Creates a plain object from a StringArrayValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.StringArrayValue
         * @static
         * @param {common.StringArrayValue} message StringArrayValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        StringArrayValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.values = [];
            if (message.values && message.values.length) {
                object.values = [];
                for (var j = 0; j < message.values.length; ++j)
                    object.values[j] = message.values[j];
            }
            return object;
        };

        /**
         * Converts this StringArrayValue to JSON.
         * @function toJSON
         * @memberof common.StringArrayValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        StringArrayValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for StringArrayValue
         * @function getTypeUrl
         * @memberof common.StringArrayValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        StringArrayValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.StringArrayValue";
        };

        return StringArrayValue;
    })();

    common.UInt64Value = (function() {

        /**
         * Properties of a UInt64Value.
         * @memberof common
         * @interface IUInt64Value
         * @property {number|Long|null} [value] UInt64Value value
         */

        /**
         * Constructs a new UInt64Value.
         * @memberof common
         * @classdesc Represents a UInt64Value.
         * @implements IUInt64Value
         * @constructor
         * @param {common.IUInt64Value=} [properties] Properties to set
         */
        function UInt64Value(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * UInt64Value value.
         * @member {number|Long} value
         * @memberof common.UInt64Value
         * @instance
         */
        UInt64Value.prototype.value = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new UInt64Value instance using the specified properties.
         * @function create
         * @memberof common.UInt64Value
         * @static
         * @param {common.IUInt64Value=} [properties] Properties to set
         * @returns {common.UInt64Value} UInt64Value instance
         */
        UInt64Value.create = function create(properties) {
            return new UInt64Value(properties);
        };

        /**
         * Encodes the specified UInt64Value message. Does not implicitly {@link common.UInt64Value.verify|verify} messages.
         * @function encode
         * @memberof common.UInt64Value
         * @static
         * @param {common.IUInt64Value} message UInt64Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt64Value.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.value);
            return writer;
        };

        /**
         * Encodes the specified UInt64Value message, length delimited. Does not implicitly {@link common.UInt64Value.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.UInt64Value
         * @static
         * @param {common.IUInt64Value} message UInt64Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt64Value.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a UInt64Value message from the specified reader or buffer.
         * @function decode
         * @memberof common.UInt64Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.UInt64Value} UInt64Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt64Value.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt64Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a UInt64Value message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.UInt64Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.UInt64Value} UInt64Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt64Value.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a UInt64Value message.
         * @function verify
         * @memberof common.UInt64Value
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        UInt64Value.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!$util.isInteger(message.value) && !(message.value && $util.isInteger(message.value.low) && $util.isInteger(message.value.high)))
                    return "value: integer|Long expected";
            return null;
        };

        /**
         * Creates a UInt64Value message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.UInt64Value
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.UInt64Value} UInt64Value
         */
        UInt64Value.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.UInt64Value)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.UInt64Value: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.UInt64Value();
            if (object.value != null)
                if ($util.Long)
                    message.value = $util.Long.fromValue(object.value, true);
                else if (typeof object.value === "string")
                    message.value = parseInt(object.value, 10);
                else if (typeof object.value === "number")
                    message.value = object.value;
                else if (typeof object.value === "object")
                    message.value = new $util.LongBits(object.value.low >>> 0, object.value.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from a UInt64Value message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.UInt64Value
         * @static
         * @param {common.UInt64Value} message UInt64Value
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        UInt64Value.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.value = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.value = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.value = typeof message.value === "number" ? BigInt(message.value) : $util.Long.fromBits(message.value.low >>> 0, message.value.high >>> 0, true).toBigInt();
                else if (typeof message.value === "number")
                    object.value = options.longs === String ? String(message.value) : message.value;
                else
                    object.value = options.longs === String ? $util.Long.prototype.toString.call(message.value) : options.longs === Number ? new $util.LongBits(message.value.low >>> 0, message.value.high >>> 0).toNumber(true) : message.value;
            return object;
        };

        /**
         * Converts this UInt64Value to JSON.
         * @function toJSON
         * @memberof common.UInt64Value
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        UInt64Value.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for UInt64Value
         * @function getTypeUrl
         * @memberof common.UInt64Value
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        UInt64Value.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.UInt64Value";
        };

        return UInt64Value;
    })();

    common.UInt32Value = (function() {

        /**
         * Properties of a UInt32Value.
         * @memberof common
         * @interface IUInt32Value
         * @property {number|null} [value] UInt32Value value
         */

        /**
         * Constructs a new UInt32Value.
         * @memberof common
         * @classdesc Represents a UInt32Value.
         * @implements IUInt32Value
         * @constructor
         * @param {common.IUInt32Value=} [properties] Properties to set
         */
        function UInt32Value(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * UInt32Value value.
         * @member {number} value
         * @memberof common.UInt32Value
         * @instance
         */
        UInt32Value.prototype.value = 0;

        /**
         * Creates a new UInt32Value instance using the specified properties.
         * @function create
         * @memberof common.UInt32Value
         * @static
         * @param {common.IUInt32Value=} [properties] Properties to set
         * @returns {common.UInt32Value} UInt32Value instance
         */
        UInt32Value.create = function create(properties) {
            return new UInt32Value(properties);
        };

        /**
         * Encodes the specified UInt32Value message. Does not implicitly {@link common.UInt32Value.verify|verify} messages.
         * @function encode
         * @memberof common.UInt32Value
         * @static
         * @param {common.IUInt32Value} message UInt32Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt32Value.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.value);
            return writer;
        };

        /**
         * Encodes the specified UInt32Value message, length delimited. Does not implicitly {@link common.UInt32Value.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.UInt32Value
         * @static
         * @param {common.IUInt32Value} message UInt32Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt32Value.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a UInt32Value message from the specified reader or buffer.
         * @function decode
         * @memberof common.UInt32Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.UInt32Value} UInt32Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt32Value.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt32Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.uint32();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a UInt32Value message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.UInt32Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.UInt32Value} UInt32Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt32Value.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a UInt32Value message.
         * @function verify
         * @memberof common.UInt32Value
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        UInt32Value.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!$util.isInteger(message.value))
                    return "value: integer expected";
            return null;
        };

        /**
         * Creates a UInt32Value message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.UInt32Value
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.UInt32Value} UInt32Value
         */
        UInt32Value.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.UInt32Value)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.UInt32Value: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.UInt32Value();
            if (object.value != null)
                message.value = object.value >>> 0;
            return message;
        };

        /**
         * Creates a plain object from a UInt32Value message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.UInt32Value
         * @static
         * @param {common.UInt32Value} message UInt32Value
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        UInt32Value.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.value = 0;
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = message.value;
            return object;
        };

        /**
         * Converts this UInt32Value to JSON.
         * @function toJSON
         * @memberof common.UInt32Value
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        UInt32Value.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for UInt32Value
         * @function getTypeUrl
         * @memberof common.UInt32Value
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        UInt32Value.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.UInt32Value";
        };

        return UInt32Value;
    })();

    common.StringValue = (function() {

        /**
         * Properties of a StringValue.
         * @memberof common
         * @interface IStringValue
         * @property {string|null} [value] StringValue value
         */

        /**
         * Constructs a new StringValue.
         * @memberof common
         * @classdesc Represents a StringValue.
         * @implements IStringValue
         * @constructor
         * @param {common.IStringValue=} [properties] Properties to set
         */
        function StringValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * StringValue value.
         * @member {string} value
         * @memberof common.StringValue
         * @instance
         */
        StringValue.prototype.value = "";

        /**
         * Creates a new StringValue instance using the specified properties.
         * @function create
         * @memberof common.StringValue
         * @static
         * @param {common.IStringValue=} [properties] Properties to set
         * @returns {common.StringValue} StringValue instance
         */
        StringValue.create = function create(properties) {
            return new StringValue(properties);
        };

        /**
         * Encodes the specified StringValue message. Does not implicitly {@link common.StringValue.verify|verify} messages.
         * @function encode
         * @memberof common.StringValue
         * @static
         * @param {common.IStringValue} message StringValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.value);
            return writer;
        };

        /**
         * Encodes the specified StringValue message, length delimited. Does not implicitly {@link common.StringValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.StringValue
         * @static
         * @param {common.IStringValue} message StringValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a StringValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.StringValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.StringValue} StringValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a StringValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.StringValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.StringValue} StringValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a StringValue message.
         * @function verify
         * @memberof common.StringValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        StringValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!$util.isString(message.value))
                    return "value: string expected";
            return null;
        };

        /**
         * Creates a StringValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.StringValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.StringValue} StringValue
         */
        StringValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.StringValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.StringValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.StringValue();
            if (object.value != null)
                message.value = String(object.value);
            return message;
        };

        /**
         * Creates a plain object from a StringValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.StringValue
         * @static
         * @param {common.StringValue} message StringValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        StringValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.value = "";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = message.value;
            return object;
        };

        /**
         * Converts this StringValue to JSON.
         * @function toJSON
         * @memberof common.StringValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        StringValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for StringValue
         * @function getTypeUrl
         * @memberof common.StringValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        StringValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.StringValue";
        };

        return StringValue;
    })();

    common.BytesValue = (function() {

        /**
         * Properties of a BytesValue.
         * @memberof common
         * @interface IBytesValue
         * @property {Uint8Array|null} [value] BytesValue value
         */

        /**
         * Constructs a new BytesValue.
         * @memberof common
         * @classdesc Represents a BytesValue.
         * @implements IBytesValue
         * @constructor
         * @param {common.IBytesValue=} [properties] Properties to set
         */
        function BytesValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * BytesValue value.
         * @member {Uint8Array} value
         * @memberof common.BytesValue
         * @instance
         */
        BytesValue.prototype.value = $util.newBuffer([]);

        /**
         * Creates a new BytesValue instance using the specified properties.
         * @function create
         * @memberof common.BytesValue
         * @static
         * @param {common.IBytesValue=} [properties] Properties to set
         * @returns {common.BytesValue} BytesValue instance
         */
        BytesValue.create = function create(properties) {
            return new BytesValue(properties);
        };

        /**
         * Encodes the specified BytesValue message. Does not implicitly {@link common.BytesValue.verify|verify} messages.
         * @function encode
         * @memberof common.BytesValue
         * @static
         * @param {common.IBytesValue} message BytesValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BytesValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.value);
            return writer;
        };

        /**
         * Encodes the specified BytesValue message, length delimited. Does not implicitly {@link common.BytesValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.BytesValue
         * @static
         * @param {common.IBytesValue} message BytesValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BytesValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a BytesValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.BytesValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.BytesValue} BytesValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BytesValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BytesValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.bytes();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a BytesValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.BytesValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.BytesValue} BytesValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BytesValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a BytesValue message.
         * @function verify
         * @memberof common.BytesValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        BytesValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!(message.value && typeof message.value.length === "number" || $util.isString(message.value)))
                    return "value: buffer expected";
            return null;
        };

        /**
         * Creates a BytesValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.BytesValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.BytesValue} BytesValue
         */
        BytesValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.BytesValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.BytesValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.BytesValue();
            if (object.value != null)
                if (typeof object.value === "string")
                    $util.base64.decode(object.value, message.value = $util.newBuffer($util.base64.length(object.value)), 0);
                else if (object.value.length >= 0)
                    message.value = object.value;
            return message;
        };

        /**
         * Creates a plain object from a BytesValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.BytesValue
         * @static
         * @param {common.BytesValue} message BytesValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        BytesValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if (options.bytes === String)
                    object.value = "";
                else {
                    object.value = [];
                    if (options.bytes !== Array)
                        object.value = $util.newBuffer(object.value);
                }
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = options.bytes === String ? $util.base64.encode(message.value, 0, message.value.length) : options.bytes === Array ? Array.prototype.slice.call(message.value) : message.value;
            return object;
        };

        /**
         * Converts this BytesValue to JSON.
         * @function toJSON
         * @memberof common.BytesValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        BytesValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for BytesValue
         * @function getTypeUrl
         * @memberof common.BytesValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        BytesValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.BytesValue";
        };

        return BytesValue;
    })();

    common.ErrorValue = (function() {

        /**
         * Properties of an ErrorValue.
         * @memberof common
         * @interface IErrorValue
         * @property {string|null} [runtimeExcJson] ErrorValue runtimeExcJson
         * @property {string|null} [err] ErrorValue err
         */

        /**
         * Constructs a new ErrorValue.
         * @memberof common
         * @classdesc Represents an ErrorValue.
         * @implements IErrorValue
         * @constructor
         * @param {common.IErrorValue=} [properties] Properties to set
         */
        function ErrorValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ErrorValue runtimeExcJson.
         * @member {string} runtimeExcJson
         * @memberof common.ErrorValue
         * @instance
         */
        ErrorValue.prototype.runtimeExcJson = "";

        /**
         * ErrorValue err.
         * @member {string} err
         * @memberof common.ErrorValue
         * @instance
         */
        ErrorValue.prototype.err = "";

        /**
         * Creates a new ErrorValue instance using the specified properties.
         * @function create
         * @memberof common.ErrorValue
         * @static
         * @param {common.IErrorValue=} [properties] Properties to set
         * @returns {common.ErrorValue} ErrorValue instance
         */
        ErrorValue.create = function create(properties) {
            return new ErrorValue(properties);
        };

        /**
         * Encodes the specified ErrorValue message. Does not implicitly {@link common.ErrorValue.verify|verify} messages.
         * @function encode
         * @memberof common.ErrorValue
         * @static
         * @param {common.IErrorValue} message ErrorValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ErrorValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.runtimeExcJson != null && Object.hasOwnProperty.call(message, "runtimeExcJson"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.runtimeExcJson);
            if (message.err != null && Object.hasOwnProperty.call(message, "err"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.err);
            return writer;
        };

        /**
         * Encodes the specified ErrorValue message, length delimited. Does not implicitly {@link common.ErrorValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.ErrorValue
         * @static
         * @param {common.IErrorValue} message ErrorValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ErrorValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an ErrorValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.ErrorValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.ErrorValue} ErrorValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ErrorValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ErrorValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.runtimeExcJson = reader.string();
                        break;
                    }
                case 2: {
                        message.err = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an ErrorValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.ErrorValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.ErrorValue} ErrorValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ErrorValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an ErrorValue message.
         * @function verify
         * @memberof common.ErrorValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ErrorValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.runtimeExcJson != null && Object.hasOwnProperty.call(message, "runtimeExcJson"))
                if (!$util.isString(message.runtimeExcJson))
                    return "runtimeExcJson: string expected";
            if (message.err != null && Object.hasOwnProperty.call(message, "err"))
                if (!$util.isString(message.err))
                    return "err: string expected";
            return null;
        };

        /**
         * Creates an ErrorValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.ErrorValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.ErrorValue} ErrorValue
         */
        ErrorValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.ErrorValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.ErrorValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.ErrorValue();
            if (object.runtimeExcJson != null)
                message.runtimeExcJson = String(object.runtimeExcJson);
            if (object.err != null)
                message.err = String(object.err);
            return message;
        };

        /**
         * Creates a plain object from an ErrorValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.ErrorValue
         * @static
         * @param {common.ErrorValue} message ErrorValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ErrorValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.runtimeExcJson = "";
                object.err = "";
            }
            if (message.runtimeExcJson != null && Object.hasOwnProperty.call(message, "runtimeExcJson"))
                object.runtimeExcJson = message.runtimeExcJson;
            if (message.err != null && Object.hasOwnProperty.call(message, "err"))
                object.err = message.err;
            return object;
        };

        /**
         * Converts this ErrorValue to JSON.
         * @function toJSON
         * @memberof common.ErrorValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ErrorValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ErrorValue
         * @function getTypeUrl
         * @memberof common.ErrorValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ErrorValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.ErrorValue";
        };

        return ErrorValue;
    })();

    common.AnyValue = (function() {

        /**
         * Properties of an AnyValue.
         * @memberof common
         * @interface IAnyValue
         * @property {string|null} [type] AnyValue type
         * @property {common.IStringValue|null} [json] AnyValue json
         * @property {common.IBytesValue|null} [bytes] AnyValue bytes
         */

        /**
         * Constructs a new AnyValue.
         * @memberof common
         * @classdesc Represents an AnyValue.
         * @implements IAnyValue
         * @constructor
         * @param {common.IAnyValue=} [properties] Properties to set
         */
        function AnyValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * AnyValue type.
         * @member {string} type
         * @memberof common.AnyValue
         * @instance
         */
        AnyValue.prototype.type = "";

        /**
         * AnyValue json.
         * @member {common.IStringValue|null|undefined} json
         * @memberof common.AnyValue
         * @instance
         */
        AnyValue.prototype.json = null;

        /**
         * AnyValue bytes.
         * @member {common.IBytesValue|null|undefined} bytes
         * @memberof common.AnyValue
         * @instance
         */
        AnyValue.prototype.bytes = null;

        /**
         * Creates a new AnyValue instance using the specified properties.
         * @function create
         * @memberof common.AnyValue
         * @static
         * @param {common.IAnyValue=} [properties] Properties to set
         * @returns {common.AnyValue} AnyValue instance
         */
        AnyValue.create = function create(properties) {
            return new AnyValue(properties);
        };

        /**
         * Encodes the specified AnyValue message. Does not implicitly {@link common.AnyValue.verify|verify} messages.
         * @function encode
         * @memberof common.AnyValue
         * @static
         * @param {common.IAnyValue} message AnyValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AnyValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.type);
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified AnyValue message, length delimited. Does not implicitly {@link common.AnyValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.AnyValue
         * @static
         * @param {common.IAnyValue} message AnyValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AnyValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an AnyValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.AnyValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.AnyValue} AnyValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AnyValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.AnyValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.type = reader.string();
                        break;
                    }
                case 2: {
                        message.json = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an AnyValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.AnyValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.AnyValue} AnyValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AnyValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an AnyValue message.
         * @function verify
         * @memberof common.AnyValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        AnyValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.json != null && Object.hasOwnProperty.call(message, "json")) {
                var error = $root.common.StringValue.verify(message.json, long + 1);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes, long + 1);
                if (error)
                    return "bytes." + error;
            }
            return null;
        };

        /**
         * Creates an AnyValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.AnyValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.AnyValue} AnyValue
         */
        AnyValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.AnyValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.AnyValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.AnyValue();
            if (object.type != null)
                message.type = String(object.type);
            if (object.json != null) {
                if (!$util.isObject(object.json))
                    throw TypeError(".common.AnyValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json, long + 1);
            }
            if (object.bytes != null) {
                if (!$util.isObject(object.bytes))
                    throw TypeError(".common.AnyValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an AnyValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.AnyValue
         * @static
         * @param {common.AnyValue} message AnyValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        AnyValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.json = null;
                object.bytes = null;
            }
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                object.type = message.type;
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = $root.common.StringValue.toObject(message.json, options, q + 1);
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options, q + 1);
            return object;
        };

        /**
         * Converts this AnyValue to JSON.
         * @function toJSON
         * @memberof common.AnyValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        AnyValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for AnyValue
         * @function getTypeUrl
         * @memberof common.AnyValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        AnyValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.AnyValue";
        };

        return AnyValue;
    })();

    return common;
})();

$root.file = (function() {

    /**
     * Namespace file.
     * @exports file
     * @namespace
     */
    var file = {};

    file.File = (function() {

        /**
         * Properties of a File.
         * @memberof file
         * @interface IFile
         * @property {boolean|null} [writable] File writable
         * @property {boolean|null} [isVersioned] File isVersioned
         * @property {string|null} [name] File name
         * @property {boolean|null} [isNew] File isNew
         * @property {common.IObjectReference|null} [impl] File impl
         * @property {boolean|null} [isSynced] File isSynced
         */

        /**
         * Constructs a new File.
         * @memberof file
         * @classdesc Represents a File.
         * @implements IFile
         * @constructor
         * @param {file.IFile=} [properties] Properties to set
         */
        function File(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * File writable.
         * @member {boolean} writable
         * @memberof file.File
         * @instance
         */
        File.prototype.writable = false;

        /**
         * File isVersioned.
         * @member {boolean} isVersioned
         * @memberof file.File
         * @instance
         */
        File.prototype.isVersioned = false;

        /**
         * File name.
         * @member {string} name
         * @memberof file.File
         * @instance
         */
        File.prototype.name = "";

        /**
         * File isNew.
         * @member {boolean} isNew
         * @memberof file.File
         * @instance
         */
        File.prototype.isNew = false;

        /**
         * File impl.
         * @member {common.IObjectReference|null|undefined} impl
         * @memberof file.File
         * @instance
         */
        File.prototype.impl = null;

        /**
         * File isSynced.
         * @member {boolean} isSynced
         * @memberof file.File
         * @instance
         */
        File.prototype.isSynced = false;

        /**
         * Creates a new File instance using the specified properties.
         * @function create
         * @memberof file.File
         * @static
         * @param {file.IFile=} [properties] Properties to set
         * @returns {file.File} File instance
         */
        File.create = function create(properties) {
            return new File(properties);
        };

        /**
         * Encodes the specified File message. Does not implicitly {@link file.File.verify|verify} messages.
         * @function encode
         * @memberof file.File
         * @static
         * @param {file.IFile} message File message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        File.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.writable != null && Object.hasOwnProperty.call(message, "writable"))
                writer.uint32(/* id 1, wireType 0 =*/8).bool(message.writable);
            if (message.isVersioned != null && Object.hasOwnProperty.call(message, "isVersioned"))
                writer.uint32(/* id 2, wireType 0 =*/16).bool(message.isVersioned);
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                writer.uint32(/* id 3, wireType 2 =*/26).string(message.name);
            if (message.isNew != null && Object.hasOwnProperty.call(message, "isNew"))
                writer.uint32(/* id 4, wireType 0 =*/32).bool(message.isNew);
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl"))
                $root.common.ObjectReference.encode(message.impl, writer.uint32(/* id 5, wireType 2 =*/42).fork(), q + 1).ldelim();
            if (message.isSynced != null && Object.hasOwnProperty.call(message, "isSynced"))
                writer.uint32(/* id 6, wireType 0 =*/48).bool(message.isSynced);
            return writer;
        };

        /**
         * Encodes the specified File message, length delimited. Does not implicitly {@link file.File.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.File
         * @static
         * @param {file.IFile} message File message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        File.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a File message from the specified reader or buffer.
         * @function decode
         * @memberof file.File
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.File} File
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        File.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.File();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.writable = reader.bool();
                        break;
                    }
                case 2: {
                        message.isVersioned = reader.bool();
                        break;
                    }
                case 3: {
                        message.name = reader.string();
                        break;
                    }
                case 4: {
                        message.isNew = reader.bool();
                        break;
                    }
                case 5: {
                        message.impl = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 6: {
                        message.isSynced = reader.bool();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a File message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.File
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.File} File
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        File.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a File message.
         * @function verify
         * @memberof file.File
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        File.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.writable != null && Object.hasOwnProperty.call(message, "writable"))
                if (typeof message.writable !== "boolean")
                    return "writable: boolean expected";
            if (message.isVersioned != null && Object.hasOwnProperty.call(message, "isVersioned"))
                if (typeof message.isVersioned !== "boolean")
                    return "isVersioned: boolean expected";
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.isNew != null && Object.hasOwnProperty.call(message, "isNew"))
                if (typeof message.isNew !== "boolean")
                    return "isNew: boolean expected";
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl")) {
                var error = $root.common.ObjectReference.verify(message.impl, long + 1);
                if (error)
                    return "impl." + error;
            }
            if (message.isSynced != null && Object.hasOwnProperty.call(message, "isSynced"))
                if (typeof message.isSynced !== "boolean")
                    return "isSynced: boolean expected";
            return null;
        };

        /**
         * Creates a File message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.File
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.File} File
         */
        File.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.File)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.File: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.File();
            if (object.writable != null)
                message.writable = Boolean(object.writable);
            if (object.isVersioned != null)
                message.isVersioned = Boolean(object.isVersioned);
            if (object.name != null)
                message.name = String(object.name);
            if (object.isNew != null)
                message.isNew = Boolean(object.isNew);
            if (object.impl != null) {
                if (!$util.isObject(object.impl))
                    throw TypeError(".file.File.impl: object expected");
                message.impl = $root.common.ObjectReference.fromObject(object.impl, long + 1);
            }
            if (object.isSynced != null)
                message.isSynced = Boolean(object.isSynced);
            return message;
        };

        /**
         * Creates a plain object from a File message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.File
         * @static
         * @param {file.File} message File
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        File.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.writable = false;
                object.isVersioned = false;
                object.name = "";
                object.isNew = false;
                object.impl = null;
                object.isSynced = false;
            }
            if (message.writable != null && Object.hasOwnProperty.call(message, "writable"))
                object.writable = message.writable;
            if (message.isVersioned != null && Object.hasOwnProperty.call(message, "isVersioned"))
                object.isVersioned = message.isVersioned;
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                object.name = message.name;
            if (message.isNew != null && Object.hasOwnProperty.call(message, "isNew"))
                object.isNew = message.isNew;
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl"))
                object.impl = $root.common.ObjectReference.toObject(message.impl, options, q + 1);
            if (message.isSynced != null && Object.hasOwnProperty.call(message, "isSynced"))
                object.isSynced = message.isSynced;
            return object;
        };

        /**
         * Converts this File to JSON.
         * @function toJSON
         * @memberof file.File
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        File.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for File
         * @function getTypeUrl
         * @memberof file.File
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        File.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.File";
        };

        return File;
    })();

    file.SyncStatusMsg = (function() {

        /**
         * Properties of a SyncStatusMsg.
         * @memberof file
         * @interface ISyncStatusMsg
         * @property {string|null} [state] SyncStatusMsg state
         * @property {file.ISyncVersionsBranchMsg|null} [local] SyncStatusMsg local
         * @property {file.ISyncVersionsBranchMsg|null} [synced] SyncStatusMsg synced
         * @property {file.ISyncVersionsBranchMsg|null} [remote] SyncStatusMsg remote
         * @property {common.IBooleanValue|null} [existsInSyncedParent] SyncStatusMsg existsInSyncedParent
         * @property {file.IUploadingStateMsg|null} [uploading] SyncStatusMsg uploading
         */

        /**
         * Constructs a new SyncStatusMsg.
         * @memberof file
         * @classdesc Represents a SyncStatusMsg.
         * @implements ISyncStatusMsg
         * @constructor
         * @param {file.ISyncStatusMsg=} [properties] Properties to set
         */
        function SyncStatusMsg(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * SyncStatusMsg state.
         * @member {string} state
         * @memberof file.SyncStatusMsg
         * @instance
         */
        SyncStatusMsg.prototype.state = "";

        /**
         * SyncStatusMsg local.
         * @member {file.ISyncVersionsBranchMsg|null|undefined} local
         * @memberof file.SyncStatusMsg
         * @instance
         */
        SyncStatusMsg.prototype.local = null;

        /**
         * SyncStatusMsg synced.
         * @member {file.ISyncVersionsBranchMsg|null|undefined} synced
         * @memberof file.SyncStatusMsg
         * @instance
         */
        SyncStatusMsg.prototype.synced = null;

        /**
         * SyncStatusMsg remote.
         * @member {file.ISyncVersionsBranchMsg|null|undefined} remote
         * @memberof file.SyncStatusMsg
         * @instance
         */
        SyncStatusMsg.prototype.remote = null;

        /**
         * SyncStatusMsg existsInSyncedParent.
         * @member {common.IBooleanValue|null|undefined} existsInSyncedParent
         * @memberof file.SyncStatusMsg
         * @instance
         */
        SyncStatusMsg.prototype.existsInSyncedParent = null;

        /**
         * SyncStatusMsg uploading.
         * @member {file.IUploadingStateMsg|null|undefined} uploading
         * @memberof file.SyncStatusMsg
         * @instance
         */
        SyncStatusMsg.prototype.uploading = null;

        /**
         * Creates a new SyncStatusMsg instance using the specified properties.
         * @function create
         * @memberof file.SyncStatusMsg
         * @static
         * @param {file.ISyncStatusMsg=} [properties] Properties to set
         * @returns {file.SyncStatusMsg} SyncStatusMsg instance
         */
        SyncStatusMsg.create = function create(properties) {
            return new SyncStatusMsg(properties);
        };

        /**
         * Encodes the specified SyncStatusMsg message. Does not implicitly {@link file.SyncStatusMsg.verify|verify} messages.
         * @function encode
         * @memberof file.SyncStatusMsg
         * @static
         * @param {file.ISyncStatusMsg} message SyncStatusMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SyncStatusMsg.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.state != null && Object.hasOwnProperty.call(message, "state"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.state);
            if (message.local != null && Object.hasOwnProperty.call(message, "local"))
                $root.file.SyncVersionsBranchMsg.encode(message.local, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.synced != null && Object.hasOwnProperty.call(message, "synced"))
                $root.file.SyncVersionsBranchMsg.encode(message.synced, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                $root.file.SyncVersionsBranchMsg.encode(message.remote, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            if (message.existsInSyncedParent != null && Object.hasOwnProperty.call(message, "existsInSyncedParent"))
                $root.common.BooleanValue.encode(message.existsInSyncedParent, writer.uint32(/* id 5, wireType 2 =*/42).fork(), q + 1).ldelim();
            if (message.uploading != null && Object.hasOwnProperty.call(message, "uploading"))
                $root.file.UploadingStateMsg.encode(message.uploading, writer.uint32(/* id 6, wireType 2 =*/50).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified SyncStatusMsg message, length delimited. Does not implicitly {@link file.SyncStatusMsg.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.SyncStatusMsg
         * @static
         * @param {file.ISyncStatusMsg} message SyncStatusMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SyncStatusMsg.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a SyncStatusMsg message from the specified reader or buffer.
         * @function decode
         * @memberof file.SyncStatusMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.SyncStatusMsg} SyncStatusMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SyncStatusMsg.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.SyncStatusMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.state = reader.string();
                        break;
                    }
                case 2: {
                        message.local = $root.file.SyncVersionsBranchMsg.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.synced = $root.file.SyncVersionsBranchMsg.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.remote = $root.file.SyncVersionsBranchMsg.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 5: {
                        message.existsInSyncedParent = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 6: {
                        message.uploading = $root.file.UploadingStateMsg.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a SyncStatusMsg message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.SyncStatusMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.SyncStatusMsg} SyncStatusMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SyncStatusMsg.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a SyncStatusMsg message.
         * @function verify
         * @memberof file.SyncStatusMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        SyncStatusMsg.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.state != null && Object.hasOwnProperty.call(message, "state"))
                if (!$util.isString(message.state))
                    return "state: string expected";
            if (message.local != null && Object.hasOwnProperty.call(message, "local")) {
                var error = $root.file.SyncVersionsBranchMsg.verify(message.local, long + 1);
                if (error)
                    return "local." + error;
            }
            if (message.synced != null && Object.hasOwnProperty.call(message, "synced")) {
                var error = $root.file.SyncVersionsBranchMsg.verify(message.synced, long + 1);
                if (error)
                    return "synced." + error;
            }
            if (message.remote != null && Object.hasOwnProperty.call(message, "remote")) {
                var error = $root.file.SyncVersionsBranchMsg.verify(message.remote, long + 1);
                if (error)
                    return "remote." + error;
            }
            if (message.existsInSyncedParent != null && Object.hasOwnProperty.call(message, "existsInSyncedParent")) {
                var error = $root.common.BooleanValue.verify(message.existsInSyncedParent, long + 1);
                if (error)
                    return "existsInSyncedParent." + error;
            }
            if (message.uploading != null && Object.hasOwnProperty.call(message, "uploading")) {
                var error = $root.file.UploadingStateMsg.verify(message.uploading, long + 1);
                if (error)
                    return "uploading." + error;
            }
            return null;
        };

        /**
         * Creates a SyncStatusMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.SyncStatusMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.SyncStatusMsg} SyncStatusMsg
         */
        SyncStatusMsg.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.SyncStatusMsg)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.SyncStatusMsg: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.SyncStatusMsg();
            if (object.state != null)
                message.state = String(object.state);
            if (object.local != null) {
                if (!$util.isObject(object.local))
                    throw TypeError(".file.SyncStatusMsg.local: object expected");
                message.local = $root.file.SyncVersionsBranchMsg.fromObject(object.local, long + 1);
            }
            if (object.synced != null) {
                if (!$util.isObject(object.synced))
                    throw TypeError(".file.SyncStatusMsg.synced: object expected");
                message.synced = $root.file.SyncVersionsBranchMsg.fromObject(object.synced, long + 1);
            }
            if (object.remote != null) {
                if (!$util.isObject(object.remote))
                    throw TypeError(".file.SyncStatusMsg.remote: object expected");
                message.remote = $root.file.SyncVersionsBranchMsg.fromObject(object.remote, long + 1);
            }
            if (object.existsInSyncedParent != null) {
                if (!$util.isObject(object.existsInSyncedParent))
                    throw TypeError(".file.SyncStatusMsg.existsInSyncedParent: object expected");
                message.existsInSyncedParent = $root.common.BooleanValue.fromObject(object.existsInSyncedParent, long + 1);
            }
            if (object.uploading != null) {
                if (!$util.isObject(object.uploading))
                    throw TypeError(".file.SyncStatusMsg.uploading: object expected");
                message.uploading = $root.file.UploadingStateMsg.fromObject(object.uploading, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a SyncStatusMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.SyncStatusMsg
         * @static
         * @param {file.SyncStatusMsg} message SyncStatusMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        SyncStatusMsg.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.state = "";
                object.local = null;
                object.synced = null;
                object.remote = null;
                object.existsInSyncedParent = null;
                object.uploading = null;
            }
            if (message.state != null && Object.hasOwnProperty.call(message, "state"))
                object.state = message.state;
            if (message.local != null && Object.hasOwnProperty.call(message, "local"))
                object.local = $root.file.SyncVersionsBranchMsg.toObject(message.local, options, q + 1);
            if (message.synced != null && Object.hasOwnProperty.call(message, "synced"))
                object.synced = $root.file.SyncVersionsBranchMsg.toObject(message.synced, options, q + 1);
            if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                object.remote = $root.file.SyncVersionsBranchMsg.toObject(message.remote, options, q + 1);
            if (message.existsInSyncedParent != null && Object.hasOwnProperty.call(message, "existsInSyncedParent"))
                object.existsInSyncedParent = $root.common.BooleanValue.toObject(message.existsInSyncedParent, options, q + 1);
            if (message.uploading != null && Object.hasOwnProperty.call(message, "uploading"))
                object.uploading = $root.file.UploadingStateMsg.toObject(message.uploading, options, q + 1);
            return object;
        };

        /**
         * Converts this SyncStatusMsg to JSON.
         * @function toJSON
         * @memberof file.SyncStatusMsg
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        SyncStatusMsg.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for SyncStatusMsg
         * @function getTypeUrl
         * @memberof file.SyncStatusMsg
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        SyncStatusMsg.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.SyncStatusMsg";
        };

        return SyncStatusMsg;
    })();

    file.SyncVersionsBranchMsg = (function() {

        /**
         * Properties of a SyncVersionsBranchMsg.
         * @memberof file
         * @interface ISyncVersionsBranchMsg
         * @property {common.IUInt64Value|null} [latest] SyncVersionsBranchMsg latest
         * @property {Array.<number|Long>|null} [archived] SyncVersionsBranchMsg archived
         * @property {common.IBooleanValue|null} [isArchived] SyncVersionsBranchMsg isArchived
         */

        /**
         * Constructs a new SyncVersionsBranchMsg.
         * @memberof file
         * @classdesc Represents a SyncVersionsBranchMsg.
         * @implements ISyncVersionsBranchMsg
         * @constructor
         * @param {file.ISyncVersionsBranchMsg=} [properties] Properties to set
         */
        function SyncVersionsBranchMsg(properties) {
            this.archived = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * SyncVersionsBranchMsg latest.
         * @member {common.IUInt64Value|null|undefined} latest
         * @memberof file.SyncVersionsBranchMsg
         * @instance
         */
        SyncVersionsBranchMsg.prototype.latest = null;

        /**
         * SyncVersionsBranchMsg archived.
         * @member {Array.<number|Long>} archived
         * @memberof file.SyncVersionsBranchMsg
         * @instance
         */
        SyncVersionsBranchMsg.prototype.archived = $util.emptyArray;

        /**
         * SyncVersionsBranchMsg isArchived.
         * @member {common.IBooleanValue|null|undefined} isArchived
         * @memberof file.SyncVersionsBranchMsg
         * @instance
         */
        SyncVersionsBranchMsg.prototype.isArchived = null;

        /**
         * Creates a new SyncVersionsBranchMsg instance using the specified properties.
         * @function create
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {file.ISyncVersionsBranchMsg=} [properties] Properties to set
         * @returns {file.SyncVersionsBranchMsg} SyncVersionsBranchMsg instance
         */
        SyncVersionsBranchMsg.create = function create(properties) {
            return new SyncVersionsBranchMsg(properties);
        };

        /**
         * Encodes the specified SyncVersionsBranchMsg message. Does not implicitly {@link file.SyncVersionsBranchMsg.verify|verify} messages.
         * @function encode
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {file.ISyncVersionsBranchMsg} message SyncVersionsBranchMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SyncVersionsBranchMsg.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.latest != null && Object.hasOwnProperty.call(message, "latest"))
                $root.common.UInt64Value.encode(message.latest, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.archived != null && message.archived.length) {
                writer.uint32(/* id 2, wireType 2 =*/18).fork();
                for (var i = 0; i < message.archived.length; ++i)
                    writer.uint64(message.archived[i]);
                writer.ldelim();
            }
            if (message.isArchived != null && Object.hasOwnProperty.call(message, "isArchived"))
                $root.common.BooleanValue.encode(message.isArchived, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified SyncVersionsBranchMsg message, length delimited. Does not implicitly {@link file.SyncVersionsBranchMsg.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {file.ISyncVersionsBranchMsg} message SyncVersionsBranchMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SyncVersionsBranchMsg.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a SyncVersionsBranchMsg message from the specified reader or buffer.
         * @function decode
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.SyncVersionsBranchMsg} SyncVersionsBranchMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SyncVersionsBranchMsg.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.SyncVersionsBranchMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.latest = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        if (!(message.archived && message.archived.length))
                            message.archived = [];
                        if ((tag & 7) === 2) {
                            var end2 = reader.uint32() + reader.pos;
                            while (reader.pos < end2)
                                message.archived.push(reader.uint64());
                        } else
                            message.archived.push(reader.uint64());
                        break;
                    }
                case 3: {
                        message.isArchived = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a SyncVersionsBranchMsg message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.SyncVersionsBranchMsg} SyncVersionsBranchMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SyncVersionsBranchMsg.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a SyncVersionsBranchMsg message.
         * @function verify
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        SyncVersionsBranchMsg.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.latest != null && Object.hasOwnProperty.call(message, "latest")) {
                var error = $root.common.UInt64Value.verify(message.latest, long + 1);
                if (error)
                    return "latest." + error;
            }
            if (message.archived != null && Object.hasOwnProperty.call(message, "archived")) {
                if (!Array.isArray(message.archived))
                    return "archived: array expected";
                for (var i = 0; i < message.archived.length; ++i)
                    if (!$util.isInteger(message.archived[i]) && !(message.archived[i] && $util.isInteger(message.archived[i].low) && $util.isInteger(message.archived[i].high)))
                        return "archived: integer|Long[] expected";
            }
            if (message.isArchived != null && Object.hasOwnProperty.call(message, "isArchived")) {
                var error = $root.common.BooleanValue.verify(message.isArchived, long + 1);
                if (error)
                    return "isArchived." + error;
            }
            return null;
        };

        /**
         * Creates a SyncVersionsBranchMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.SyncVersionsBranchMsg} SyncVersionsBranchMsg
         */
        SyncVersionsBranchMsg.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.SyncVersionsBranchMsg)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.SyncVersionsBranchMsg: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.SyncVersionsBranchMsg();
            if (object.latest != null) {
                if (!$util.isObject(object.latest))
                    throw TypeError(".file.SyncVersionsBranchMsg.latest: object expected");
                message.latest = $root.common.UInt64Value.fromObject(object.latest, long + 1);
            }
            if (object.archived) {
                if (!Array.isArray(object.archived))
                    throw TypeError(".file.SyncVersionsBranchMsg.archived: array expected");
                message.archived = [];
                for (var i = 0; i < object.archived.length; ++i)
                    if ($util.Long)
                        message.archived[i] = $util.Long.fromValue(object.archived[i], true);
                    else if (typeof object.archived[i] === "string")
                        message.archived[i] = parseInt(object.archived[i], 10);
                    else if (typeof object.archived[i] === "number")
                        message.archived[i] = object.archived[i];
                    else if (typeof object.archived[i] === "object")
                        message.archived[i] = new $util.LongBits(object.archived[i].low >>> 0, object.archived[i].high >>> 0).toNumber(true);
            }
            if (object.isArchived != null) {
                if (!$util.isObject(object.isArchived))
                    throw TypeError(".file.SyncVersionsBranchMsg.isArchived: object expected");
                message.isArchived = $root.common.BooleanValue.fromObject(object.isArchived, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a SyncVersionsBranchMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {file.SyncVersionsBranchMsg} message SyncVersionsBranchMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        SyncVersionsBranchMsg.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.archived = [];
            if (options.defaults) {
                object.latest = null;
                object.isArchived = null;
            }
            if (message.latest != null && Object.hasOwnProperty.call(message, "latest"))
                object.latest = $root.common.UInt64Value.toObject(message.latest, options, q + 1);
            if (message.archived && message.archived.length) {
                object.archived = [];
                for (var j = 0; j < message.archived.length; ++j)
                    if (typeof BigInt !== "undefined" && options.longs === BigInt)
                        object.archived[j] = typeof message.archived[j] === "number" ? BigInt(message.archived[j]) : $util.Long.fromBits(message.archived[j].low >>> 0, message.archived[j].high >>> 0, true).toBigInt();
                    else if (typeof message.archived[j] === "number")
                        object.archived[j] = options.longs === String ? String(message.archived[j]) : message.archived[j];
                    else
                        object.archived[j] = options.longs === String ? $util.Long.prototype.toString.call(message.archived[j]) : options.longs === Number ? new $util.LongBits(message.archived[j].low >>> 0, message.archived[j].high >>> 0).toNumber(true) : message.archived[j];
            }
            if (message.isArchived != null && Object.hasOwnProperty.call(message, "isArchived"))
                object.isArchived = $root.common.BooleanValue.toObject(message.isArchived, options, q + 1);
            return object;
        };

        /**
         * Converts this SyncVersionsBranchMsg to JSON.
         * @function toJSON
         * @memberof file.SyncVersionsBranchMsg
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        SyncVersionsBranchMsg.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for SyncVersionsBranchMsg
         * @function getTypeUrl
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        SyncVersionsBranchMsg.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.SyncVersionsBranchMsg";
        };

        return SyncVersionsBranchMsg;
    })();

    file.UploadingStateMsg = (function() {

        /**
         * Properties of an UploadingStateMsg.
         * @memberof file
         * @interface IUploadingStateMsg
         * @property {number|Long|null} [localVersion] UploadingStateMsg localVersion
         * @property {number|Long|null} [remoteVersion] UploadingStateMsg remoteVersion
         * @property {number|Long|null} [bytesLeftToUpload] UploadingStateMsg bytesLeftToUpload
         * @property {boolean|null} [uploadStarted] UploadingStateMsg uploadStarted
         */

        /**
         * Constructs a new UploadingStateMsg.
         * @memberof file
         * @classdesc Represents an UploadingStateMsg.
         * @implements IUploadingStateMsg
         * @constructor
         * @param {file.IUploadingStateMsg=} [properties] Properties to set
         */
        function UploadingStateMsg(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * UploadingStateMsg localVersion.
         * @member {number|Long} localVersion
         * @memberof file.UploadingStateMsg
         * @instance
         */
        UploadingStateMsg.prototype.localVersion = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * UploadingStateMsg remoteVersion.
         * @member {number|Long} remoteVersion
         * @memberof file.UploadingStateMsg
         * @instance
         */
        UploadingStateMsg.prototype.remoteVersion = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * UploadingStateMsg bytesLeftToUpload.
         * @member {number|Long} bytesLeftToUpload
         * @memberof file.UploadingStateMsg
         * @instance
         */
        UploadingStateMsg.prototype.bytesLeftToUpload = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * UploadingStateMsg uploadStarted.
         * @member {boolean} uploadStarted
         * @memberof file.UploadingStateMsg
         * @instance
         */
        UploadingStateMsg.prototype.uploadStarted = false;

        /**
         * Creates a new UploadingStateMsg instance using the specified properties.
         * @function create
         * @memberof file.UploadingStateMsg
         * @static
         * @param {file.IUploadingStateMsg=} [properties] Properties to set
         * @returns {file.UploadingStateMsg} UploadingStateMsg instance
         */
        UploadingStateMsg.create = function create(properties) {
            return new UploadingStateMsg(properties);
        };

        /**
         * Encodes the specified UploadingStateMsg message. Does not implicitly {@link file.UploadingStateMsg.verify|verify} messages.
         * @function encode
         * @memberof file.UploadingStateMsg
         * @static
         * @param {file.IUploadingStateMsg} message UploadingStateMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UploadingStateMsg.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.localVersion);
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.remoteVersion);
            if (message.bytesLeftToUpload != null && Object.hasOwnProperty.call(message, "bytesLeftToUpload"))
                writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.bytesLeftToUpload);
            if (message.uploadStarted != null && Object.hasOwnProperty.call(message, "uploadStarted"))
                writer.uint32(/* id 4, wireType 0 =*/32).bool(message.uploadStarted);
            return writer;
        };

        /**
         * Encodes the specified UploadingStateMsg message, length delimited. Does not implicitly {@link file.UploadingStateMsg.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.UploadingStateMsg
         * @static
         * @param {file.IUploadingStateMsg} message UploadingStateMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UploadingStateMsg.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an UploadingStateMsg message from the specified reader or buffer.
         * @function decode
         * @memberof file.UploadingStateMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.UploadingStateMsg} UploadingStateMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UploadingStateMsg.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.UploadingStateMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.localVersion = reader.uint64();
                        break;
                    }
                case 2: {
                        message.remoteVersion = reader.uint64();
                        break;
                    }
                case 3: {
                        message.bytesLeftToUpload = reader.uint64();
                        break;
                    }
                case 4: {
                        message.uploadStarted = reader.bool();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an UploadingStateMsg message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.UploadingStateMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.UploadingStateMsg} UploadingStateMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UploadingStateMsg.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an UploadingStateMsg message.
         * @function verify
         * @memberof file.UploadingStateMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        UploadingStateMsg.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                if (!$util.isInteger(message.localVersion) && !(message.localVersion && $util.isInteger(message.localVersion.low) && $util.isInteger(message.localVersion.high)))
                    return "localVersion: integer|Long expected";
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                if (!$util.isInteger(message.remoteVersion) && !(message.remoteVersion && $util.isInteger(message.remoteVersion.low) && $util.isInteger(message.remoteVersion.high)))
                    return "remoteVersion: integer|Long expected";
            if (message.bytesLeftToUpload != null && Object.hasOwnProperty.call(message, "bytesLeftToUpload"))
                if (!$util.isInteger(message.bytesLeftToUpload) && !(message.bytesLeftToUpload && $util.isInteger(message.bytesLeftToUpload.low) && $util.isInteger(message.bytesLeftToUpload.high)))
                    return "bytesLeftToUpload: integer|Long expected";
            if (message.uploadStarted != null && Object.hasOwnProperty.call(message, "uploadStarted"))
                if (typeof message.uploadStarted !== "boolean")
                    return "uploadStarted: boolean expected";
            return null;
        };

        /**
         * Creates an UploadingStateMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.UploadingStateMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.UploadingStateMsg} UploadingStateMsg
         */
        UploadingStateMsg.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.UploadingStateMsg)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.UploadingStateMsg: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.UploadingStateMsg();
            if (object.localVersion != null)
                if ($util.Long)
                    message.localVersion = $util.Long.fromValue(object.localVersion, true);
                else if (typeof object.localVersion === "string")
                    message.localVersion = parseInt(object.localVersion, 10);
                else if (typeof object.localVersion === "number")
                    message.localVersion = object.localVersion;
                else if (typeof object.localVersion === "object")
                    message.localVersion = new $util.LongBits(object.localVersion.low >>> 0, object.localVersion.high >>> 0).toNumber(true);
            if (object.remoteVersion != null)
                if ($util.Long)
                    message.remoteVersion = $util.Long.fromValue(object.remoteVersion, true);
                else if (typeof object.remoteVersion === "string")
                    message.remoteVersion = parseInt(object.remoteVersion, 10);
                else if (typeof object.remoteVersion === "number")
                    message.remoteVersion = object.remoteVersion;
                else if (typeof object.remoteVersion === "object")
                    message.remoteVersion = new $util.LongBits(object.remoteVersion.low >>> 0, object.remoteVersion.high >>> 0).toNumber(true);
            if (object.bytesLeftToUpload != null)
                if ($util.Long)
                    message.bytesLeftToUpload = $util.Long.fromValue(object.bytesLeftToUpload, true);
                else if (typeof object.bytesLeftToUpload === "string")
                    message.bytesLeftToUpload = parseInt(object.bytesLeftToUpload, 10);
                else if (typeof object.bytesLeftToUpload === "number")
                    message.bytesLeftToUpload = object.bytesLeftToUpload;
                else if (typeof object.bytesLeftToUpload === "object")
                    message.bytesLeftToUpload = new $util.LongBits(object.bytesLeftToUpload.low >>> 0, object.bytesLeftToUpload.high >>> 0).toNumber(true);
            if (object.uploadStarted != null)
                message.uploadStarted = Boolean(object.uploadStarted);
            return message;
        };

        /**
         * Creates a plain object from an UploadingStateMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.UploadingStateMsg
         * @static
         * @param {file.UploadingStateMsg} message UploadingStateMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        UploadingStateMsg.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.localVersion = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.localVersion = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.remoteVersion = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.remoteVersion = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.bytesLeftToUpload = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.bytesLeftToUpload = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.uploadStarted = false;
            }
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.localVersion = typeof message.localVersion === "number" ? BigInt(message.localVersion) : $util.Long.fromBits(message.localVersion.low >>> 0, message.localVersion.high >>> 0, true).toBigInt();
                else if (typeof message.localVersion === "number")
                    object.localVersion = options.longs === String ? String(message.localVersion) : message.localVersion;
                else
                    object.localVersion = options.longs === String ? $util.Long.prototype.toString.call(message.localVersion) : options.longs === Number ? new $util.LongBits(message.localVersion.low >>> 0, message.localVersion.high >>> 0).toNumber(true) : message.localVersion;
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.remoteVersion = typeof message.remoteVersion === "number" ? BigInt(message.remoteVersion) : $util.Long.fromBits(message.remoteVersion.low >>> 0, message.remoteVersion.high >>> 0, true).toBigInt();
                else if (typeof message.remoteVersion === "number")
                    object.remoteVersion = options.longs === String ? String(message.remoteVersion) : message.remoteVersion;
                else
                    object.remoteVersion = options.longs === String ? $util.Long.prototype.toString.call(message.remoteVersion) : options.longs === Number ? new $util.LongBits(message.remoteVersion.low >>> 0, message.remoteVersion.high >>> 0).toNumber(true) : message.remoteVersion;
            if (message.bytesLeftToUpload != null && Object.hasOwnProperty.call(message, "bytesLeftToUpload"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.bytesLeftToUpload = typeof message.bytesLeftToUpload === "number" ? BigInt(message.bytesLeftToUpload) : $util.Long.fromBits(message.bytesLeftToUpload.low >>> 0, message.bytesLeftToUpload.high >>> 0, true).toBigInt();
                else if (typeof message.bytesLeftToUpload === "number")
                    object.bytesLeftToUpload = options.longs === String ? String(message.bytesLeftToUpload) : message.bytesLeftToUpload;
                else
                    object.bytesLeftToUpload = options.longs === String ? $util.Long.prototype.toString.call(message.bytesLeftToUpload) : options.longs === Number ? new $util.LongBits(message.bytesLeftToUpload.low >>> 0, message.bytesLeftToUpload.high >>> 0).toNumber(true) : message.bytesLeftToUpload;
            if (message.uploadStarted != null && Object.hasOwnProperty.call(message, "uploadStarted"))
                object.uploadStarted = message.uploadStarted;
            return object;
        };

        /**
         * Converts this UploadingStateMsg to JSON.
         * @function toJSON
         * @memberof file.UploadingStateMsg
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        UploadingStateMsg.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for UploadingStateMsg
         * @function getTypeUrl
         * @memberof file.UploadingStateMsg
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        UploadingStateMsg.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.UploadingStateMsg";
        };

        return UploadingStateMsg;
    })();

    file.StatsMsg = (function() {

        /**
         * Properties of a StatsMsg.
         * @memberof file
         * @interface IStatsMsg
         * @property {common.IBooleanValue|null} [isFile] StatsMsg isFile
         * @property {common.IBooleanValue|null} [isFolder] StatsMsg isFolder
         * @property {common.IBooleanValue|null} [isLink] StatsMsg isLink
         * @property {boolean|null} [writable] StatsMsg writable
         * @property {common.IUInt64Value|null} [size] StatsMsg size
         * @property {common.IUInt64Value|null} [mtime] StatsMsg mtime
         * @property {common.IUInt64Value|null} [ctime] StatsMsg ctime
         * @property {common.IUInt64Value|null} [version] StatsMsg version
         * @property {common.IUInt64Value|null} [bytesNeedDownload] StatsMsg bytesNeedDownload
         * @property {common.IStringValue|null} [versionSyncBranch] StatsMsg versionSyncBranch
         */

        /**
         * Constructs a new StatsMsg.
         * @memberof file
         * @classdesc Represents a StatsMsg.
         * @implements IStatsMsg
         * @constructor
         * @param {file.IStatsMsg=} [properties] Properties to set
         */
        function StatsMsg(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * StatsMsg isFile.
         * @member {common.IBooleanValue|null|undefined} isFile
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.isFile = null;

        /**
         * StatsMsg isFolder.
         * @member {common.IBooleanValue|null|undefined} isFolder
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.isFolder = null;

        /**
         * StatsMsg isLink.
         * @member {common.IBooleanValue|null|undefined} isLink
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.isLink = null;

        /**
         * StatsMsg writable.
         * @member {boolean} writable
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.writable = false;

        /**
         * StatsMsg size.
         * @member {common.IUInt64Value|null|undefined} size
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.size = null;

        /**
         * StatsMsg mtime.
         * @member {common.IUInt64Value|null|undefined} mtime
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.mtime = null;

        /**
         * StatsMsg ctime.
         * @member {common.IUInt64Value|null|undefined} ctime
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.ctime = null;

        /**
         * StatsMsg version.
         * @member {common.IUInt64Value|null|undefined} version
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.version = null;

        /**
         * StatsMsg bytesNeedDownload.
         * @member {common.IUInt64Value|null|undefined} bytesNeedDownload
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.bytesNeedDownload = null;

        /**
         * StatsMsg versionSyncBranch.
         * @member {common.IStringValue|null|undefined} versionSyncBranch
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.versionSyncBranch = null;

        /**
         * Creates a new StatsMsg instance using the specified properties.
         * @function create
         * @memberof file.StatsMsg
         * @static
         * @param {file.IStatsMsg=} [properties] Properties to set
         * @returns {file.StatsMsg} StatsMsg instance
         */
        StatsMsg.create = function create(properties) {
            return new StatsMsg(properties);
        };

        /**
         * Encodes the specified StatsMsg message. Does not implicitly {@link file.StatsMsg.verify|verify} messages.
         * @function encode
         * @memberof file.StatsMsg
         * @static
         * @param {file.IStatsMsg} message StatsMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StatsMsg.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                $root.common.BooleanValue.encode(message.isFile, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                $root.common.BooleanValue.encode(message.isFolder, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink"))
                $root.common.BooleanValue.encode(message.isLink, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.writable != null && Object.hasOwnProperty.call(message, "writable"))
                writer.uint32(/* id 4, wireType 0 =*/32).bool(message.writable);
            if (message.size != null && Object.hasOwnProperty.call(message, "size"))
                $root.common.UInt64Value.encode(message.size, writer.uint32(/* id 5, wireType 2 =*/42).fork(), q + 1).ldelim();
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime"))
                $root.common.UInt64Value.encode(message.mtime, writer.uint32(/* id 6, wireType 2 =*/50).fork(), q + 1).ldelim();
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime"))
                $root.common.UInt64Value.encode(message.ctime, writer.uint32(/* id 7, wireType 2 =*/58).fork(), q + 1).ldelim();
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                $root.common.UInt64Value.encode(message.version, writer.uint32(/* id 8, wireType 2 =*/66).fork(), q + 1).ldelim();
            if (message.bytesNeedDownload != null && Object.hasOwnProperty.call(message, "bytesNeedDownload"))
                $root.common.UInt64Value.encode(message.bytesNeedDownload, writer.uint32(/* id 9, wireType 2 =*/74).fork(), q + 1).ldelim();
            if (message.versionSyncBranch != null && Object.hasOwnProperty.call(message, "versionSyncBranch"))
                $root.common.StringValue.encode(message.versionSyncBranch, writer.uint32(/* id 10, wireType 2 =*/82).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified StatsMsg message, length delimited. Does not implicitly {@link file.StatsMsg.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.StatsMsg
         * @static
         * @param {file.IStatsMsg} message StatsMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StatsMsg.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a StatsMsg message from the specified reader or buffer.
         * @function decode
         * @memberof file.StatsMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.StatsMsg} StatsMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StatsMsg.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.StatsMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.isFile = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.isFolder = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.isLink = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.writable = reader.bool();
                        break;
                    }
                case 5: {
                        message.size = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 6: {
                        message.mtime = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 7: {
                        message.ctime = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 8: {
                        message.version = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 9: {
                        message.bytesNeedDownload = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 10: {
                        message.versionSyncBranch = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a StatsMsg message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.StatsMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.StatsMsg} StatsMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StatsMsg.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a StatsMsg message.
         * @function verify
         * @memberof file.StatsMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        StatsMsg.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile")) {
                var error = $root.common.BooleanValue.verify(message.isFile, long + 1);
                if (error)
                    return "isFile." + error;
            }
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder")) {
                var error = $root.common.BooleanValue.verify(message.isFolder, long + 1);
                if (error)
                    return "isFolder." + error;
            }
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink")) {
                var error = $root.common.BooleanValue.verify(message.isLink, long + 1);
                if (error)
                    return "isLink." + error;
            }
            if (message.writable != null && Object.hasOwnProperty.call(message, "writable"))
                if (typeof message.writable !== "boolean")
                    return "writable: boolean expected";
            if (message.size != null && Object.hasOwnProperty.call(message, "size")) {
                var error = $root.common.UInt64Value.verify(message.size, long + 1);
                if (error)
                    return "size." + error;
            }
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime")) {
                var error = $root.common.UInt64Value.verify(message.mtime, long + 1);
                if (error)
                    return "mtime." + error;
            }
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime")) {
                var error = $root.common.UInt64Value.verify(message.ctime, long + 1);
                if (error)
                    return "ctime." + error;
            }
            if (message.version != null && Object.hasOwnProperty.call(message, "version")) {
                var error = $root.common.UInt64Value.verify(message.version, long + 1);
                if (error)
                    return "version." + error;
            }
            if (message.bytesNeedDownload != null && Object.hasOwnProperty.call(message, "bytesNeedDownload")) {
                var error = $root.common.UInt64Value.verify(message.bytesNeedDownload, long + 1);
                if (error)
                    return "bytesNeedDownload." + error;
            }
            if (message.versionSyncBranch != null && Object.hasOwnProperty.call(message, "versionSyncBranch")) {
                var error = $root.common.StringValue.verify(message.versionSyncBranch, long + 1);
                if (error)
                    return "versionSyncBranch." + error;
            }
            return null;
        };

        /**
         * Creates a StatsMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.StatsMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.StatsMsg} StatsMsg
         */
        StatsMsg.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.StatsMsg)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.StatsMsg: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.StatsMsg();
            if (object.isFile != null) {
                if (!$util.isObject(object.isFile))
                    throw TypeError(".file.StatsMsg.isFile: object expected");
                message.isFile = $root.common.BooleanValue.fromObject(object.isFile, long + 1);
            }
            if (object.isFolder != null) {
                if (!$util.isObject(object.isFolder))
                    throw TypeError(".file.StatsMsg.isFolder: object expected");
                message.isFolder = $root.common.BooleanValue.fromObject(object.isFolder, long + 1);
            }
            if (object.isLink != null) {
                if (!$util.isObject(object.isLink))
                    throw TypeError(".file.StatsMsg.isLink: object expected");
                message.isLink = $root.common.BooleanValue.fromObject(object.isLink, long + 1);
            }
            if (object.writable != null)
                message.writable = Boolean(object.writable);
            if (object.size != null) {
                if (!$util.isObject(object.size))
                    throw TypeError(".file.StatsMsg.size: object expected");
                message.size = $root.common.UInt64Value.fromObject(object.size, long + 1);
            }
            if (object.mtime != null) {
                if (!$util.isObject(object.mtime))
                    throw TypeError(".file.StatsMsg.mtime: object expected");
                message.mtime = $root.common.UInt64Value.fromObject(object.mtime, long + 1);
            }
            if (object.ctime != null) {
                if (!$util.isObject(object.ctime))
                    throw TypeError(".file.StatsMsg.ctime: object expected");
                message.ctime = $root.common.UInt64Value.fromObject(object.ctime, long + 1);
            }
            if (object.version != null) {
                if (!$util.isObject(object.version))
                    throw TypeError(".file.StatsMsg.version: object expected");
                message.version = $root.common.UInt64Value.fromObject(object.version, long + 1);
            }
            if (object.bytesNeedDownload != null) {
                if (!$util.isObject(object.bytesNeedDownload))
                    throw TypeError(".file.StatsMsg.bytesNeedDownload: object expected");
                message.bytesNeedDownload = $root.common.UInt64Value.fromObject(object.bytesNeedDownload, long + 1);
            }
            if (object.versionSyncBranch != null) {
                if (!$util.isObject(object.versionSyncBranch))
                    throw TypeError(".file.StatsMsg.versionSyncBranch: object expected");
                message.versionSyncBranch = $root.common.StringValue.fromObject(object.versionSyncBranch, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a StatsMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.StatsMsg
         * @static
         * @param {file.StatsMsg} message StatsMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        StatsMsg.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.isFile = null;
                object.isFolder = null;
                object.isLink = null;
                object.writable = false;
                object.size = null;
                object.mtime = null;
                object.ctime = null;
                object.version = null;
                object.bytesNeedDownload = null;
                object.versionSyncBranch = null;
            }
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                object.isFile = $root.common.BooleanValue.toObject(message.isFile, options, q + 1);
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                object.isFolder = $root.common.BooleanValue.toObject(message.isFolder, options, q + 1);
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink"))
                object.isLink = $root.common.BooleanValue.toObject(message.isLink, options, q + 1);
            if (message.writable != null && Object.hasOwnProperty.call(message, "writable"))
                object.writable = message.writable;
            if (message.size != null && Object.hasOwnProperty.call(message, "size"))
                object.size = $root.common.UInt64Value.toObject(message.size, options, q + 1);
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime"))
                object.mtime = $root.common.UInt64Value.toObject(message.mtime, options, q + 1);
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime"))
                object.ctime = $root.common.UInt64Value.toObject(message.ctime, options, q + 1);
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                object.version = $root.common.UInt64Value.toObject(message.version, options, q + 1);
            if (message.bytesNeedDownload != null && Object.hasOwnProperty.call(message, "bytesNeedDownload"))
                object.bytesNeedDownload = $root.common.UInt64Value.toObject(message.bytesNeedDownload, options, q + 1);
            if (message.versionSyncBranch != null && Object.hasOwnProperty.call(message, "versionSyncBranch"))
                object.versionSyncBranch = $root.common.StringValue.toObject(message.versionSyncBranch, options, q + 1);
            return object;
        };

        /**
         * Converts this StatsMsg to JSON.
         * @function toJSON
         * @memberof file.StatsMsg
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        StatsMsg.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for StatsMsg
         * @function getTypeUrl
         * @memberof file.StatsMsg
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        StatsMsg.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.StatsMsg";
        };

        return StatsMsg;
    })();

    file.GetXAttrRequestBody = (function() {

        /**
         * Properties of a GetXAttrRequestBody.
         * @memberof file
         * @interface IGetXAttrRequestBody
         * @property {string|null} [xaName] GetXAttrRequestBody xaName
         */

        /**
         * Constructs a new GetXAttrRequestBody.
         * @memberof file
         * @classdesc Represents a GetXAttrRequestBody.
         * @implements IGetXAttrRequestBody
         * @constructor
         * @param {file.IGetXAttrRequestBody=} [properties] Properties to set
         */
        function GetXAttrRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * GetXAttrRequestBody xaName.
         * @member {string} xaName
         * @memberof file.GetXAttrRequestBody
         * @instance
         */
        GetXAttrRequestBody.prototype.xaName = "";

        /**
         * Creates a new GetXAttrRequestBody instance using the specified properties.
         * @function create
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {file.IGetXAttrRequestBody=} [properties] Properties to set
         * @returns {file.GetXAttrRequestBody} GetXAttrRequestBody instance
         */
        GetXAttrRequestBody.create = function create(properties) {
            return new GetXAttrRequestBody(properties);
        };

        /**
         * Encodes the specified GetXAttrRequestBody message. Does not implicitly {@link file.GetXAttrRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {file.IGetXAttrRequestBody} message GetXAttrRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        GetXAttrRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.xaName);
            return writer;
        };

        /**
         * Encodes the specified GetXAttrRequestBody message, length delimited. Does not implicitly {@link file.GetXAttrRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {file.IGetXAttrRequestBody} message GetXAttrRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        GetXAttrRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a GetXAttrRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.GetXAttrRequestBody} GetXAttrRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        GetXAttrRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.GetXAttrRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.xaName = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a GetXAttrRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.GetXAttrRequestBody} GetXAttrRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        GetXAttrRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a GetXAttrRequestBody message.
         * @function verify
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        GetXAttrRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                if (!$util.isString(message.xaName))
                    return "xaName: string expected";
            return null;
        };

        /**
         * Creates a GetXAttrRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.GetXAttrRequestBody} GetXAttrRequestBody
         */
        GetXAttrRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.GetXAttrRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.GetXAttrRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.GetXAttrRequestBody();
            if (object.xaName != null)
                message.xaName = String(object.xaName);
            return message;
        };

        /**
         * Creates a plain object from a GetXAttrRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {file.GetXAttrRequestBody} message GetXAttrRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        GetXAttrRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.xaName = "";
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                object.xaName = message.xaName;
            return object;
        };

        /**
         * Converts this GetXAttrRequestBody to JSON.
         * @function toJSON
         * @memberof file.GetXAttrRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        GetXAttrRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for GetXAttrRequestBody
         * @function getTypeUrl
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        GetXAttrRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.GetXAttrRequestBody";
        };

        return GetXAttrRequestBody;
    })();

    file.XAttrValue = (function() {

        /**
         * Properties of a XAttrValue.
         * @memberof file
         * @interface IXAttrValue
         * @property {common.IStringValue|null} [str] XAttrValue str
         * @property {common.IStringValue|null} [json] XAttrValue json
         * @property {common.IBytesValue|null} [bytes] XAttrValue bytes
         */

        /**
         * Constructs a new XAttrValue.
         * @memberof file
         * @classdesc Represents a XAttrValue.
         * @implements IXAttrValue
         * @constructor
         * @param {file.IXAttrValue=} [properties] Properties to set
         */
        function XAttrValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * XAttrValue str.
         * @member {common.IStringValue|null|undefined} str
         * @memberof file.XAttrValue
         * @instance
         */
        XAttrValue.prototype.str = null;

        /**
         * XAttrValue json.
         * @member {common.IStringValue|null|undefined} json
         * @memberof file.XAttrValue
         * @instance
         */
        XAttrValue.prototype.json = null;

        /**
         * XAttrValue bytes.
         * @member {common.IBytesValue|null|undefined} bytes
         * @memberof file.XAttrValue
         * @instance
         */
        XAttrValue.prototype.bytes = null;

        /**
         * Creates a new XAttrValue instance using the specified properties.
         * @function create
         * @memberof file.XAttrValue
         * @static
         * @param {file.IXAttrValue=} [properties] Properties to set
         * @returns {file.XAttrValue} XAttrValue instance
         */
        XAttrValue.create = function create(properties) {
            return new XAttrValue(properties);
        };

        /**
         * Encodes the specified XAttrValue message. Does not implicitly {@link file.XAttrValue.verify|verify} messages.
         * @function encode
         * @memberof file.XAttrValue
         * @static
         * @param {file.IXAttrValue} message XAttrValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        XAttrValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.str != null && Object.hasOwnProperty.call(message, "str"))
                $root.common.StringValue.encode(message.str, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified XAttrValue message, length delimited. Does not implicitly {@link file.XAttrValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.XAttrValue
         * @static
         * @param {file.IXAttrValue} message XAttrValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        XAttrValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a XAttrValue message from the specified reader or buffer.
         * @function decode
         * @memberof file.XAttrValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.XAttrValue} XAttrValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        XAttrValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.XAttrValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.str = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.json = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a XAttrValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.XAttrValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.XAttrValue} XAttrValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        XAttrValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a XAttrValue message.
         * @function verify
         * @memberof file.XAttrValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        XAttrValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.str != null && Object.hasOwnProperty.call(message, "str")) {
                var error = $root.common.StringValue.verify(message.str, long + 1);
                if (error)
                    return "str." + error;
            }
            if (message.json != null && Object.hasOwnProperty.call(message, "json")) {
                var error = $root.common.StringValue.verify(message.json, long + 1);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes, long + 1);
                if (error)
                    return "bytes." + error;
            }
            return null;
        };

        /**
         * Creates a XAttrValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.XAttrValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.XAttrValue} XAttrValue
         */
        XAttrValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.XAttrValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.XAttrValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.XAttrValue();
            if (object.str != null) {
                if (!$util.isObject(object.str))
                    throw TypeError(".file.XAttrValue.str: object expected");
                message.str = $root.common.StringValue.fromObject(object.str, long + 1);
            }
            if (object.json != null) {
                if (!$util.isObject(object.json))
                    throw TypeError(".file.XAttrValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json, long + 1);
            }
            if (object.bytes != null) {
                if (!$util.isObject(object.bytes))
                    throw TypeError(".file.XAttrValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a XAttrValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.XAttrValue
         * @static
         * @param {file.XAttrValue} message XAttrValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        XAttrValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.str = null;
                object.json = null;
                object.bytes = null;
            }
            if (message.str != null && Object.hasOwnProperty.call(message, "str"))
                object.str = $root.common.StringValue.toObject(message.str, options, q + 1);
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = $root.common.StringValue.toObject(message.json, options, q + 1);
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options, q + 1);
            return object;
        };

        /**
         * Converts this XAttrValue to JSON.
         * @function toJSON
         * @memberof file.XAttrValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        XAttrValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for XAttrValue
         * @function getTypeUrl
         * @memberof file.XAttrValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        XAttrValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.XAttrValue";
        };

        return XAttrValue;
    })();

    file.ReadBytesRequestBody = (function() {

        /**
         * Properties of a ReadBytesRequestBody.
         * @memberof file
         * @interface IReadBytesRequestBody
         * @property {common.IUInt64Value|null} [start] ReadBytesRequestBody start
         * @property {common.IUInt64Value|null} [end] ReadBytesRequestBody end
         */

        /**
         * Constructs a new ReadBytesRequestBody.
         * @memberof file
         * @classdesc Represents a ReadBytesRequestBody.
         * @implements IReadBytesRequestBody
         * @constructor
         * @param {file.IReadBytesRequestBody=} [properties] Properties to set
         */
        function ReadBytesRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ReadBytesRequestBody start.
         * @member {common.IUInt64Value|null|undefined} start
         * @memberof file.ReadBytesRequestBody
         * @instance
         */
        ReadBytesRequestBody.prototype.start = null;

        /**
         * ReadBytesRequestBody end.
         * @member {common.IUInt64Value|null|undefined} end
         * @memberof file.ReadBytesRequestBody
         * @instance
         */
        ReadBytesRequestBody.prototype.end = null;

        /**
         * Creates a new ReadBytesRequestBody instance using the specified properties.
         * @function create
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {file.IReadBytesRequestBody=} [properties] Properties to set
         * @returns {file.ReadBytesRequestBody} ReadBytesRequestBody instance
         */
        ReadBytesRequestBody.create = function create(properties) {
            return new ReadBytesRequestBody(properties);
        };

        /**
         * Encodes the specified ReadBytesRequestBody message. Does not implicitly {@link file.ReadBytesRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {file.IReadBytesRequestBody} message ReadBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ReadBytesRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                $root.common.UInt64Value.encode(message.start, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                $root.common.UInt64Value.encode(message.end, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified ReadBytesRequestBody message, length delimited. Does not implicitly {@link file.ReadBytesRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {file.IReadBytesRequestBody} message ReadBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ReadBytesRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a ReadBytesRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.ReadBytesRequestBody} ReadBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ReadBytesRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ReadBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.start = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.end = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a ReadBytesRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.ReadBytesRequestBody} ReadBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ReadBytesRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a ReadBytesRequestBody message.
         * @function verify
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ReadBytesRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.start != null && Object.hasOwnProperty.call(message, "start")) {
                var error = $root.common.UInt64Value.verify(message.start, long + 1);
                if (error)
                    return "start." + error;
            }
            if (message.end != null && Object.hasOwnProperty.call(message, "end")) {
                var error = $root.common.UInt64Value.verify(message.end, long + 1);
                if (error)
                    return "end." + error;
            }
            return null;
        };

        /**
         * Creates a ReadBytesRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.ReadBytesRequestBody} ReadBytesRequestBody
         */
        ReadBytesRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.ReadBytesRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.ReadBytesRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.ReadBytesRequestBody();
            if (object.start != null) {
                if (!$util.isObject(object.start))
                    throw TypeError(".file.ReadBytesRequestBody.start: object expected");
                message.start = $root.common.UInt64Value.fromObject(object.start, long + 1);
            }
            if (object.end != null) {
                if (!$util.isObject(object.end))
                    throw TypeError(".file.ReadBytesRequestBody.end: object expected");
                message.end = $root.common.UInt64Value.fromObject(object.end, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a ReadBytesRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {file.ReadBytesRequestBody} message ReadBytesRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ReadBytesRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.start = null;
                object.end = null;
            }
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                object.start = $root.common.UInt64Value.toObject(message.start, options, q + 1);
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                object.end = $root.common.UInt64Value.toObject(message.end, options, q + 1);
            return object;
        };

        /**
         * Converts this ReadBytesRequestBody to JSON.
         * @function toJSON
         * @memberof file.ReadBytesRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ReadBytesRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ReadBytesRequestBody
         * @function getTypeUrl
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ReadBytesRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.ReadBytesRequestBody";
        };

        return ReadBytesRequestBody;
    })();

    file.ReadBytesReplyBody = (function() {

        /**
         * Properties of a ReadBytesReplyBody.
         * @memberof file
         * @interface IReadBytesReplyBody
         * @property {common.IBytesValue|null} [bytes] ReadBytesReplyBody bytes
         */

        /**
         * Constructs a new ReadBytesReplyBody.
         * @memberof file
         * @classdesc Represents a ReadBytesReplyBody.
         * @implements IReadBytesReplyBody
         * @constructor
         * @param {file.IReadBytesReplyBody=} [properties] Properties to set
         */
        function ReadBytesReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ReadBytesReplyBody bytes.
         * @member {common.IBytesValue|null|undefined} bytes
         * @memberof file.ReadBytesReplyBody
         * @instance
         */
        ReadBytesReplyBody.prototype.bytes = null;

        /**
         * Creates a new ReadBytesReplyBody instance using the specified properties.
         * @function create
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {file.IReadBytesReplyBody=} [properties] Properties to set
         * @returns {file.ReadBytesReplyBody} ReadBytesReplyBody instance
         */
        ReadBytesReplyBody.create = function create(properties) {
            return new ReadBytesReplyBody(properties);
        };

        /**
         * Encodes the specified ReadBytesReplyBody message. Does not implicitly {@link file.ReadBytesReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {file.IReadBytesReplyBody} message ReadBytesReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ReadBytesReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified ReadBytesReplyBody message, length delimited. Does not implicitly {@link file.ReadBytesReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {file.IReadBytesReplyBody} message ReadBytesReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ReadBytesReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a ReadBytesReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.ReadBytesReplyBody} ReadBytesReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ReadBytesReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ReadBytesReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a ReadBytesReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.ReadBytesReplyBody} ReadBytesReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ReadBytesReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a ReadBytesReplyBody message.
         * @function verify
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ReadBytesReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes, long + 1);
                if (error)
                    return "bytes." + error;
            }
            return null;
        };

        /**
         * Creates a ReadBytesReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.ReadBytesReplyBody} ReadBytesReplyBody
         */
        ReadBytesReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.ReadBytesReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.ReadBytesReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.ReadBytesReplyBody();
            if (object.bytes != null) {
                if (!$util.isObject(object.bytes))
                    throw TypeError(".file.ReadBytesReplyBody.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a ReadBytesReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {file.ReadBytesReplyBody} message ReadBytesReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ReadBytesReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.bytes = null;
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options, q + 1);
            return object;
        };

        /**
         * Converts this ReadBytesReplyBody to JSON.
         * @function toJSON
         * @memberof file.ReadBytesReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ReadBytesReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ReadBytesReplyBody
         * @function getTypeUrl
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ReadBytesReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.ReadBytesReplyBody";
        };

        return ReadBytesReplyBody;
    })();

    file.VersionedReadFlags = (function() {

        /**
         * Properties of a VersionedReadFlags.
         * @memberof file
         * @interface IVersionedReadFlags
         * @property {common.IUInt64Value|null} [archivedVersion] VersionedReadFlags archivedVersion
         * @property {common.IUInt64Value|null} [remoteVersion] VersionedReadFlags remoteVersion
         */

        /**
         * Constructs a new VersionedReadFlags.
         * @memberof file
         * @classdesc Represents a VersionedReadFlags.
         * @implements IVersionedReadFlags
         * @constructor
         * @param {file.IVersionedReadFlags=} [properties] Properties to set
         */
        function VersionedReadFlags(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedReadFlags archivedVersion.
         * @member {common.IUInt64Value|null|undefined} archivedVersion
         * @memberof file.VersionedReadFlags
         * @instance
         */
        VersionedReadFlags.prototype.archivedVersion = null;

        /**
         * VersionedReadFlags remoteVersion.
         * @member {common.IUInt64Value|null|undefined} remoteVersion
         * @memberof file.VersionedReadFlags
         * @instance
         */
        VersionedReadFlags.prototype.remoteVersion = null;

        /**
         * Creates a new VersionedReadFlags instance using the specified properties.
         * @function create
         * @memberof file.VersionedReadFlags
         * @static
         * @param {file.IVersionedReadFlags=} [properties] Properties to set
         * @returns {file.VersionedReadFlags} VersionedReadFlags instance
         */
        VersionedReadFlags.create = function create(properties) {
            return new VersionedReadFlags(properties);
        };

        /**
         * Encodes the specified VersionedReadFlags message. Does not implicitly {@link file.VersionedReadFlags.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedReadFlags
         * @static
         * @param {file.IVersionedReadFlags} message VersionedReadFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadFlags.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.archivedVersion != null && Object.hasOwnProperty.call(message, "archivedVersion"))
                $root.common.UInt64Value.encode(message.archivedVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedReadFlags message, length delimited. Does not implicitly {@link file.VersionedReadFlags.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedReadFlags
         * @static
         * @param {file.IVersionedReadFlags} message VersionedReadFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadFlags.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedReadFlags message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedReadFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedReadFlags} VersionedReadFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadFlags.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.archivedVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedReadFlags message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedReadFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedReadFlags} VersionedReadFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadFlags.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedReadFlags message.
         * @function verify
         * @memberof file.VersionedReadFlags
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedReadFlags.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.archivedVersion != null && Object.hasOwnProperty.call(message, "archivedVersion")) {
                var error = $root.common.UInt64Value.verify(message.archivedVersion, long + 1);
                if (error)
                    return "archivedVersion." + error;
            }
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion, long + 1);
                if (error)
                    return "remoteVersion." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedReadFlags message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedReadFlags
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedReadFlags} VersionedReadFlags
         */
        VersionedReadFlags.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedReadFlags)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedReadFlags: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedReadFlags();
            if (object.archivedVersion != null) {
                if (!$util.isObject(object.archivedVersion))
                    throw TypeError(".file.VersionedReadFlags.archivedVersion: object expected");
                message.archivedVersion = $root.common.UInt64Value.fromObject(object.archivedVersion, long + 1);
            }
            if (object.remoteVersion != null) {
                if (!$util.isObject(object.remoteVersion))
                    throw TypeError(".file.VersionedReadFlags.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedReadFlags message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedReadFlags
         * @static
         * @param {file.VersionedReadFlags} message VersionedReadFlags
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedReadFlags.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.archivedVersion = null;
                object.remoteVersion = null;
            }
            if (message.archivedVersion != null && Object.hasOwnProperty.call(message, "archivedVersion"))
                object.archivedVersion = $root.common.UInt64Value.toObject(message.archivedVersion, options, q + 1);
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedReadFlags to JSON.
         * @function toJSON
         * @memberof file.VersionedReadFlags
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedReadFlags.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedReadFlags
         * @function getTypeUrl
         * @memberof file.VersionedReadFlags
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedReadFlags.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedReadFlags";
        };

        return VersionedReadFlags;
    })();

    file.RequestWithVersionedReadFlags = (function() {

        /**
         * Properties of a RequestWithVersionedReadFlags.
         * @memberof file
         * @interface IRequestWithVersionedReadFlags
         * @property {file.IVersionedReadFlags|null} [flags] RequestWithVersionedReadFlags flags
         */

        /**
         * Constructs a new RequestWithVersionedReadFlags.
         * @memberof file
         * @classdesc Represents a RequestWithVersionedReadFlags.
         * @implements IRequestWithVersionedReadFlags
         * @constructor
         * @param {file.IRequestWithVersionedReadFlags=} [properties] Properties to set
         */
        function RequestWithVersionedReadFlags(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * RequestWithVersionedReadFlags flags.
         * @member {file.IVersionedReadFlags|null|undefined} flags
         * @memberof file.RequestWithVersionedReadFlags
         * @instance
         */
        RequestWithVersionedReadFlags.prototype.flags = null;

        /**
         * Creates a new RequestWithVersionedReadFlags instance using the specified properties.
         * @function create
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {file.IRequestWithVersionedReadFlags=} [properties] Properties to set
         * @returns {file.RequestWithVersionedReadFlags} RequestWithVersionedReadFlags instance
         */
        RequestWithVersionedReadFlags.create = function create(properties) {
            return new RequestWithVersionedReadFlags(properties);
        };

        /**
         * Encodes the specified RequestWithVersionedReadFlags message. Does not implicitly {@link file.RequestWithVersionedReadFlags.verify|verify} messages.
         * @function encode
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {file.IRequestWithVersionedReadFlags} message RequestWithVersionedReadFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        RequestWithVersionedReadFlags.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified RequestWithVersionedReadFlags message, length delimited. Does not implicitly {@link file.RequestWithVersionedReadFlags.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {file.IRequestWithVersionedReadFlags} message RequestWithVersionedReadFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        RequestWithVersionedReadFlags.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a RequestWithVersionedReadFlags message from the specified reader or buffer.
         * @function decode
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.RequestWithVersionedReadFlags} RequestWithVersionedReadFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        RequestWithVersionedReadFlags.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.RequestWithVersionedReadFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a RequestWithVersionedReadFlags message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.RequestWithVersionedReadFlags} RequestWithVersionedReadFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        RequestWithVersionedReadFlags.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a RequestWithVersionedReadFlags message.
         * @function verify
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        RequestWithVersionedReadFlags.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a RequestWithVersionedReadFlags message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.RequestWithVersionedReadFlags} RequestWithVersionedReadFlags
         */
        RequestWithVersionedReadFlags.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.RequestWithVersionedReadFlags)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.RequestWithVersionedReadFlags: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.RequestWithVersionedReadFlags();
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".file.RequestWithVersionedReadFlags.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a RequestWithVersionedReadFlags message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {file.RequestWithVersionedReadFlags} message RequestWithVersionedReadFlags
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        RequestWithVersionedReadFlags.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.flags = null;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this RequestWithVersionedReadFlags to JSON.
         * @function toJSON
         * @memberof file.RequestWithVersionedReadFlags
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        RequestWithVersionedReadFlags.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for RequestWithVersionedReadFlags
         * @function getTypeUrl
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        RequestWithVersionedReadFlags.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.RequestWithVersionedReadFlags";
        };

        return RequestWithVersionedReadFlags;
    })();

    file.VersionedGetXAttrRequestBody = (function() {

        /**
         * Properties of a VersionedGetXAttrRequestBody.
         * @memberof file
         * @interface IVersionedGetXAttrRequestBody
         * @property {string|null} [xaName] VersionedGetXAttrRequestBody xaName
         * @property {file.IVersionedReadFlags|null} [flags] VersionedGetXAttrRequestBody flags
         */

        /**
         * Constructs a new VersionedGetXAttrRequestBody.
         * @memberof file
         * @classdesc Represents a VersionedGetXAttrRequestBody.
         * @implements IVersionedGetXAttrRequestBody
         * @constructor
         * @param {file.IVersionedGetXAttrRequestBody=} [properties] Properties to set
         */
        function VersionedGetXAttrRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedGetXAttrRequestBody xaName.
         * @member {string} xaName
         * @memberof file.VersionedGetXAttrRequestBody
         * @instance
         */
        VersionedGetXAttrRequestBody.prototype.xaName = "";

        /**
         * VersionedGetXAttrRequestBody flags.
         * @member {file.IVersionedReadFlags|null|undefined} flags
         * @memberof file.VersionedGetXAttrRequestBody
         * @instance
         */
        VersionedGetXAttrRequestBody.prototype.flags = null;

        /**
         * Creates a new VersionedGetXAttrRequestBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {file.IVersionedGetXAttrRequestBody=} [properties] Properties to set
         * @returns {file.VersionedGetXAttrRequestBody} VersionedGetXAttrRequestBody instance
         */
        VersionedGetXAttrRequestBody.create = function create(properties) {
            return new VersionedGetXAttrRequestBody(properties);
        };

        /**
         * Encodes the specified VersionedGetXAttrRequestBody message. Does not implicitly {@link file.VersionedGetXAttrRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {file.IVersionedGetXAttrRequestBody} message VersionedGetXAttrRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetXAttrRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.xaName);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedGetXAttrRequestBody message, length delimited. Does not implicitly {@link file.VersionedGetXAttrRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {file.IVersionedGetXAttrRequestBody} message VersionedGetXAttrRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetXAttrRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedGetXAttrRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedGetXAttrRequestBody} VersionedGetXAttrRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetXAttrRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetXAttrRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.xaName = reader.string();
                        break;
                    }
                case 2: {
                        message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedGetXAttrRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedGetXAttrRequestBody} VersionedGetXAttrRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetXAttrRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedGetXAttrRequestBody message.
         * @function verify
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedGetXAttrRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                if (!$util.isString(message.xaName))
                    return "xaName: string expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedGetXAttrRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedGetXAttrRequestBody} VersionedGetXAttrRequestBody
         */
        VersionedGetXAttrRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedGetXAttrRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedGetXAttrRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedGetXAttrRequestBody();
            if (object.xaName != null)
                message.xaName = String(object.xaName);
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".file.VersionedGetXAttrRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedGetXAttrRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {file.VersionedGetXAttrRequestBody} message VersionedGetXAttrRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedGetXAttrRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.xaName = "";
                object.flags = null;
            }
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                object.xaName = message.xaName;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedGetXAttrRequestBody to JSON.
         * @function toJSON
         * @memberof file.VersionedGetXAttrRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedGetXAttrRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedGetXAttrRequestBody
         * @function getTypeUrl
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedGetXAttrRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedGetXAttrRequestBody";
        };

        return VersionedGetXAttrRequestBody;
    })();

    file.VersionedGetXAttrReplyBody = (function() {

        /**
         * Properties of a VersionedGetXAttrReplyBody.
         * @memberof file
         * @interface IVersionedGetXAttrReplyBody
         * @property {number|Long|null} [version] VersionedGetXAttrReplyBody version
         * @property {common.IStringValue|null} [str] VersionedGetXAttrReplyBody str
         * @property {common.IStringValue|null} [json] VersionedGetXAttrReplyBody json
         * @property {common.IBytesValue|null} [bytes] VersionedGetXAttrReplyBody bytes
         */

        /**
         * Constructs a new VersionedGetXAttrReplyBody.
         * @memberof file
         * @classdesc Represents a VersionedGetXAttrReplyBody.
         * @implements IVersionedGetXAttrReplyBody
         * @constructor
         * @param {file.IVersionedGetXAttrReplyBody=} [properties] Properties to set
         */
        function VersionedGetXAttrReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedGetXAttrReplyBody version.
         * @member {number|Long} version
         * @memberof file.VersionedGetXAttrReplyBody
         * @instance
         */
        VersionedGetXAttrReplyBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * VersionedGetXAttrReplyBody str.
         * @member {common.IStringValue|null|undefined} str
         * @memberof file.VersionedGetXAttrReplyBody
         * @instance
         */
        VersionedGetXAttrReplyBody.prototype.str = null;

        /**
         * VersionedGetXAttrReplyBody json.
         * @member {common.IStringValue|null|undefined} json
         * @memberof file.VersionedGetXAttrReplyBody
         * @instance
         */
        VersionedGetXAttrReplyBody.prototype.json = null;

        /**
         * VersionedGetXAttrReplyBody bytes.
         * @member {common.IBytesValue|null|undefined} bytes
         * @memberof file.VersionedGetXAttrReplyBody
         * @instance
         */
        VersionedGetXAttrReplyBody.prototype.bytes = null;

        /**
         * Creates a new VersionedGetXAttrReplyBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {file.IVersionedGetXAttrReplyBody=} [properties] Properties to set
         * @returns {file.VersionedGetXAttrReplyBody} VersionedGetXAttrReplyBody instance
         */
        VersionedGetXAttrReplyBody.create = function create(properties) {
            return new VersionedGetXAttrReplyBody(properties);
        };

        /**
         * Encodes the specified VersionedGetXAttrReplyBody message. Does not implicitly {@link file.VersionedGetXAttrReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {file.IVersionedGetXAttrReplyBody} message VersionedGetXAttrReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetXAttrReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            if (message.str != null && Object.hasOwnProperty.call(message, "str"))
                $root.common.StringValue.encode(message.str, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedGetXAttrReplyBody message, length delimited. Does not implicitly {@link file.VersionedGetXAttrReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {file.IVersionedGetXAttrReplyBody} message VersionedGetXAttrReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetXAttrReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedGetXAttrReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedGetXAttrReplyBody} VersionedGetXAttrReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetXAttrReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetXAttrReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.str = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.json = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedGetXAttrReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedGetXAttrReplyBody} VersionedGetXAttrReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetXAttrReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedGetXAttrReplyBody message.
         * @function verify
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedGetXAttrReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            if (message.str != null && Object.hasOwnProperty.call(message, "str")) {
                var error = $root.common.StringValue.verify(message.str, long + 1);
                if (error)
                    return "str." + error;
            }
            if (message.json != null && Object.hasOwnProperty.call(message, "json")) {
                var error = $root.common.StringValue.verify(message.json, long + 1);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes, long + 1);
                if (error)
                    return "bytes." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedGetXAttrReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedGetXAttrReplyBody} VersionedGetXAttrReplyBody
         */
        VersionedGetXAttrReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedGetXAttrReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedGetXAttrReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedGetXAttrReplyBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            if (object.str != null) {
                if (!$util.isObject(object.str))
                    throw TypeError(".file.VersionedGetXAttrReplyBody.str: object expected");
                message.str = $root.common.StringValue.fromObject(object.str, long + 1);
            }
            if (object.json != null) {
                if (!$util.isObject(object.json))
                    throw TypeError(".file.VersionedGetXAttrReplyBody.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json, long + 1);
            }
            if (object.bytes != null) {
                if (!$util.isObject(object.bytes))
                    throw TypeError(".file.VersionedGetXAttrReplyBody.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedGetXAttrReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {file.VersionedGetXAttrReplyBody} message VersionedGetXAttrReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedGetXAttrReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.str = null;
                object.json = null;
                object.bytes = null;
            }
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            if (message.str != null && Object.hasOwnProperty.call(message, "str"))
                object.str = $root.common.StringValue.toObject(message.str, options, q + 1);
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = $root.common.StringValue.toObject(message.json, options, q + 1);
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedGetXAttrReplyBody to JSON.
         * @function toJSON
         * @memberof file.VersionedGetXAttrReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedGetXAttrReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedGetXAttrReplyBody
         * @function getTypeUrl
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedGetXAttrReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedGetXAttrReplyBody";
        };

        return VersionedGetXAttrReplyBody;
    })();

    file.VersionedListXAttrsReplyBody = (function() {

        /**
         * Properties of a VersionedListXAttrsReplyBody.
         * @memberof file
         * @interface IVersionedListXAttrsReplyBody
         * @property {number|Long|null} [version] VersionedListXAttrsReplyBody version
         * @property {Array.<string>|null} [xaNames] VersionedListXAttrsReplyBody xaNames
         */

        /**
         * Constructs a new VersionedListXAttrsReplyBody.
         * @memberof file
         * @classdesc Represents a VersionedListXAttrsReplyBody.
         * @implements IVersionedListXAttrsReplyBody
         * @constructor
         * @param {file.IVersionedListXAttrsReplyBody=} [properties] Properties to set
         */
        function VersionedListXAttrsReplyBody(properties) {
            this.xaNames = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedListXAttrsReplyBody version.
         * @member {number|Long} version
         * @memberof file.VersionedListXAttrsReplyBody
         * @instance
         */
        VersionedListXAttrsReplyBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * VersionedListXAttrsReplyBody xaNames.
         * @member {Array.<string>} xaNames
         * @memberof file.VersionedListXAttrsReplyBody
         * @instance
         */
        VersionedListXAttrsReplyBody.prototype.xaNames = $util.emptyArray;

        /**
         * Creates a new VersionedListXAttrsReplyBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {file.IVersionedListXAttrsReplyBody=} [properties] Properties to set
         * @returns {file.VersionedListXAttrsReplyBody} VersionedListXAttrsReplyBody instance
         */
        VersionedListXAttrsReplyBody.create = function create(properties) {
            return new VersionedListXAttrsReplyBody(properties);
        };

        /**
         * Encodes the specified VersionedListXAttrsReplyBody message. Does not implicitly {@link file.VersionedListXAttrsReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {file.IVersionedListXAttrsReplyBody} message VersionedListXAttrsReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedListXAttrsReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            if (message.xaNames != null && message.xaNames.length)
                for (var i = 0; i < message.xaNames.length; ++i)
                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.xaNames[i]);
            return writer;
        };

        /**
         * Encodes the specified VersionedListXAttrsReplyBody message, length delimited. Does not implicitly {@link file.VersionedListXAttrsReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {file.IVersionedListXAttrsReplyBody} message VersionedListXAttrsReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedListXAttrsReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedListXAttrsReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedListXAttrsReplyBody} VersionedListXAttrsReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedListXAttrsReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedListXAttrsReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        if (!(message.xaNames && message.xaNames.length))
                            message.xaNames = [];
                        message.xaNames.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedListXAttrsReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedListXAttrsReplyBody} VersionedListXAttrsReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedListXAttrsReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedListXAttrsReplyBody message.
         * @function verify
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedListXAttrsReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            if (message.xaNames != null && Object.hasOwnProperty.call(message, "xaNames")) {
                if (!Array.isArray(message.xaNames))
                    return "xaNames: array expected";
                for (var i = 0; i < message.xaNames.length; ++i)
                    if (!$util.isString(message.xaNames[i]))
                        return "xaNames: string[] expected";
            }
            return null;
        };

        /**
         * Creates a VersionedListXAttrsReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedListXAttrsReplyBody} VersionedListXAttrsReplyBody
         */
        VersionedListXAttrsReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedListXAttrsReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedListXAttrsReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedListXAttrsReplyBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            if (object.xaNames) {
                if (!Array.isArray(object.xaNames))
                    throw TypeError(".file.VersionedListXAttrsReplyBody.xaNames: array expected");
                message.xaNames = [];
                for (var i = 0; i < object.xaNames.length; ++i)
                    message.xaNames[i] = String(object.xaNames[i]);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedListXAttrsReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {file.VersionedListXAttrsReplyBody} message VersionedListXAttrsReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedListXAttrsReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.xaNames = [];
            if (options.defaults)
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            if (message.xaNames && message.xaNames.length) {
                object.xaNames = [];
                for (var j = 0; j < message.xaNames.length; ++j)
                    object.xaNames[j] = message.xaNames[j];
            }
            return object;
        };

        /**
         * Converts this VersionedListXAttrsReplyBody to JSON.
         * @function toJSON
         * @memberof file.VersionedListXAttrsReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedListXAttrsReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedListXAttrsReplyBody
         * @function getTypeUrl
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedListXAttrsReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedListXAttrsReplyBody";
        };

        return VersionedListXAttrsReplyBody;
    })();

    file.VersionedReadBytesRequestBody = (function() {

        /**
         * Properties of a VersionedReadBytesRequestBody.
         * @memberof file
         * @interface IVersionedReadBytesRequestBody
         * @property {common.IUInt64Value|null} [start] VersionedReadBytesRequestBody start
         * @property {common.IUInt64Value|null} [end] VersionedReadBytesRequestBody end
         * @property {file.IVersionedReadFlags|null} [flags] VersionedReadBytesRequestBody flags
         */

        /**
         * Constructs a new VersionedReadBytesRequestBody.
         * @memberof file
         * @classdesc Represents a VersionedReadBytesRequestBody.
         * @implements IVersionedReadBytesRequestBody
         * @constructor
         * @param {file.IVersionedReadBytesRequestBody=} [properties] Properties to set
         */
        function VersionedReadBytesRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedReadBytesRequestBody start.
         * @member {common.IUInt64Value|null|undefined} start
         * @memberof file.VersionedReadBytesRequestBody
         * @instance
         */
        VersionedReadBytesRequestBody.prototype.start = null;

        /**
         * VersionedReadBytesRequestBody end.
         * @member {common.IUInt64Value|null|undefined} end
         * @memberof file.VersionedReadBytesRequestBody
         * @instance
         */
        VersionedReadBytesRequestBody.prototype.end = null;

        /**
         * VersionedReadBytesRequestBody flags.
         * @member {file.IVersionedReadFlags|null|undefined} flags
         * @memberof file.VersionedReadBytesRequestBody
         * @instance
         */
        VersionedReadBytesRequestBody.prototype.flags = null;

        /**
         * Creates a new VersionedReadBytesRequestBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {file.IVersionedReadBytesRequestBody=} [properties] Properties to set
         * @returns {file.VersionedReadBytesRequestBody} VersionedReadBytesRequestBody instance
         */
        VersionedReadBytesRequestBody.create = function create(properties) {
            return new VersionedReadBytesRequestBody(properties);
        };

        /**
         * Encodes the specified VersionedReadBytesRequestBody message. Does not implicitly {@link file.VersionedReadBytesRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {file.IVersionedReadBytesRequestBody} message VersionedReadBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadBytesRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                $root.common.UInt64Value.encode(message.start, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                $root.common.UInt64Value.encode(message.end, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 10, wireType 2 =*/82).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedReadBytesRequestBody message, length delimited. Does not implicitly {@link file.VersionedReadBytesRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {file.IVersionedReadBytesRequestBody} message VersionedReadBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadBytesRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedReadBytesRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedReadBytesRequestBody} VersionedReadBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadBytesRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.start = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.end = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 10: {
                        message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedReadBytesRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedReadBytesRequestBody} VersionedReadBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadBytesRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedReadBytesRequestBody message.
         * @function verify
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedReadBytesRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.start != null && Object.hasOwnProperty.call(message, "start")) {
                var error = $root.common.UInt64Value.verify(message.start, long + 1);
                if (error)
                    return "start." + error;
            }
            if (message.end != null && Object.hasOwnProperty.call(message, "end")) {
                var error = $root.common.UInt64Value.verify(message.end, long + 1);
                if (error)
                    return "end." + error;
            }
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedReadBytesRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedReadBytesRequestBody} VersionedReadBytesRequestBody
         */
        VersionedReadBytesRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedReadBytesRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedReadBytesRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedReadBytesRequestBody();
            if (object.start != null) {
                if (!$util.isObject(object.start))
                    throw TypeError(".file.VersionedReadBytesRequestBody.start: object expected");
                message.start = $root.common.UInt64Value.fromObject(object.start, long + 1);
            }
            if (object.end != null) {
                if (!$util.isObject(object.end))
                    throw TypeError(".file.VersionedReadBytesRequestBody.end: object expected");
                message.end = $root.common.UInt64Value.fromObject(object.end, long + 1);
            }
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".file.VersionedReadBytesRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedReadBytesRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {file.VersionedReadBytesRequestBody} message VersionedReadBytesRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedReadBytesRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.start = null;
                object.end = null;
                object.flags = null;
            }
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                object.start = $root.common.UInt64Value.toObject(message.start, options, q + 1);
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                object.end = $root.common.UInt64Value.toObject(message.end, options, q + 1);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedReadBytesRequestBody to JSON.
         * @function toJSON
         * @memberof file.VersionedReadBytesRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedReadBytesRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedReadBytesRequestBody
         * @function getTypeUrl
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedReadBytesRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedReadBytesRequestBody";
        };

        return VersionedReadBytesRequestBody;
    })();

    file.VersionedReadBytesReplyBody = (function() {

        /**
         * Properties of a VersionedReadBytesReplyBody.
         * @memberof file
         * @interface IVersionedReadBytesReplyBody
         * @property {number|Long|null} [version] VersionedReadBytesReplyBody version
         * @property {common.IBytesValue|null} [bytes] VersionedReadBytesReplyBody bytes
         */

        /**
         * Constructs a new VersionedReadBytesReplyBody.
         * @memberof file
         * @classdesc Represents a VersionedReadBytesReplyBody.
         * @implements IVersionedReadBytesReplyBody
         * @constructor
         * @param {file.IVersionedReadBytesReplyBody=} [properties] Properties to set
         */
        function VersionedReadBytesReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedReadBytesReplyBody version.
         * @member {number|Long} version
         * @memberof file.VersionedReadBytesReplyBody
         * @instance
         */
        VersionedReadBytesReplyBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * VersionedReadBytesReplyBody bytes.
         * @member {common.IBytesValue|null|undefined} bytes
         * @memberof file.VersionedReadBytesReplyBody
         * @instance
         */
        VersionedReadBytesReplyBody.prototype.bytes = null;

        /**
         * Creates a new VersionedReadBytesReplyBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {file.IVersionedReadBytesReplyBody=} [properties] Properties to set
         * @returns {file.VersionedReadBytesReplyBody} VersionedReadBytesReplyBody instance
         */
        VersionedReadBytesReplyBody.create = function create(properties) {
            return new VersionedReadBytesReplyBody(properties);
        };

        /**
         * Encodes the specified VersionedReadBytesReplyBody message. Does not implicitly {@link file.VersionedReadBytesReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {file.IVersionedReadBytesReplyBody} message VersionedReadBytesReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadBytesReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedReadBytesReplyBody message, length delimited. Does not implicitly {@link file.VersionedReadBytesReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {file.IVersionedReadBytesReplyBody} message VersionedReadBytesReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadBytesReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedReadBytesReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedReadBytesReplyBody} VersionedReadBytesReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadBytesReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadBytesReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedReadBytesReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedReadBytesReplyBody} VersionedReadBytesReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadBytesReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedReadBytesReplyBody message.
         * @function verify
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedReadBytesReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes, long + 1);
                if (error)
                    return "bytes." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedReadBytesReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedReadBytesReplyBody} VersionedReadBytesReplyBody
         */
        VersionedReadBytesReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedReadBytesReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedReadBytesReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedReadBytesReplyBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            if (object.bytes != null) {
                if (!$util.isObject(object.bytes))
                    throw TypeError(".file.VersionedReadBytesReplyBody.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedReadBytesReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {file.VersionedReadBytesReplyBody} message VersionedReadBytesReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedReadBytesReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.bytes = null;
            }
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedReadBytesReplyBody to JSON.
         * @function toJSON
         * @memberof file.VersionedReadBytesReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedReadBytesReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedReadBytesReplyBody
         * @function getTypeUrl
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedReadBytesReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedReadBytesReplyBody";
        };

        return VersionedReadBytesReplyBody;
    })();

    file.VersionedReadTxtReplyBody = (function() {

        /**
         * Properties of a VersionedReadTxtReplyBody.
         * @memberof file
         * @interface IVersionedReadTxtReplyBody
         * @property {number|Long|null} [version] VersionedReadTxtReplyBody version
         * @property {string|null} [txt] VersionedReadTxtReplyBody txt
         */

        /**
         * Constructs a new VersionedReadTxtReplyBody.
         * @memberof file
         * @classdesc Represents a VersionedReadTxtReplyBody.
         * @implements IVersionedReadTxtReplyBody
         * @constructor
         * @param {file.IVersionedReadTxtReplyBody=} [properties] Properties to set
         */
        function VersionedReadTxtReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedReadTxtReplyBody version.
         * @member {number|Long} version
         * @memberof file.VersionedReadTxtReplyBody
         * @instance
         */
        VersionedReadTxtReplyBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * VersionedReadTxtReplyBody txt.
         * @member {string} txt
         * @memberof file.VersionedReadTxtReplyBody
         * @instance
         */
        VersionedReadTxtReplyBody.prototype.txt = "";

        /**
         * Creates a new VersionedReadTxtReplyBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {file.IVersionedReadTxtReplyBody=} [properties] Properties to set
         * @returns {file.VersionedReadTxtReplyBody} VersionedReadTxtReplyBody instance
         */
        VersionedReadTxtReplyBody.create = function create(properties) {
            return new VersionedReadTxtReplyBody(properties);
        };

        /**
         * Encodes the specified VersionedReadTxtReplyBody message. Does not implicitly {@link file.VersionedReadTxtReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {file.IVersionedReadTxtReplyBody} message VersionedReadTxtReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadTxtReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.txt);
            return writer;
        };

        /**
         * Encodes the specified VersionedReadTxtReplyBody message, length delimited. Does not implicitly {@link file.VersionedReadTxtReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {file.IVersionedReadTxtReplyBody} message VersionedReadTxtReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadTxtReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedReadTxtReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedReadTxtReplyBody} VersionedReadTxtReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadTxtReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadTxtReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.txt = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedReadTxtReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedReadTxtReplyBody} VersionedReadTxtReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadTxtReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedReadTxtReplyBody message.
         * @function verify
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedReadTxtReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                if (!$util.isString(message.txt))
                    return "txt: string expected";
            return null;
        };

        /**
         * Creates a VersionedReadTxtReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedReadTxtReplyBody} VersionedReadTxtReplyBody
         */
        VersionedReadTxtReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedReadTxtReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedReadTxtReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedReadTxtReplyBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            if (object.txt != null)
                message.txt = String(object.txt);
            return message;
        };

        /**
         * Creates a plain object from a VersionedReadTxtReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {file.VersionedReadTxtReplyBody} message VersionedReadTxtReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedReadTxtReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.txt = "";
            }
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                object.txt = message.txt;
            return object;
        };

        /**
         * Converts this VersionedReadTxtReplyBody to JSON.
         * @function toJSON
         * @memberof file.VersionedReadTxtReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedReadTxtReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedReadTxtReplyBody
         * @function getTypeUrl
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedReadTxtReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedReadTxtReplyBody";
        };

        return VersionedReadTxtReplyBody;
    })();

    file.VersionedReadJsonReplyBody = (function() {

        /**
         * Properties of a VersionedReadJsonReplyBody.
         * @memberof file
         * @interface IVersionedReadJsonReplyBody
         * @property {number|Long|null} [version] VersionedReadJsonReplyBody version
         * @property {string|null} [json] VersionedReadJsonReplyBody json
         */

        /**
         * Constructs a new VersionedReadJsonReplyBody.
         * @memberof file
         * @classdesc Represents a VersionedReadJsonReplyBody.
         * @implements IVersionedReadJsonReplyBody
         * @constructor
         * @param {file.IVersionedReadJsonReplyBody=} [properties] Properties to set
         */
        function VersionedReadJsonReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedReadJsonReplyBody version.
         * @member {number|Long} version
         * @memberof file.VersionedReadJsonReplyBody
         * @instance
         */
        VersionedReadJsonReplyBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * VersionedReadJsonReplyBody json.
         * @member {string} json
         * @memberof file.VersionedReadJsonReplyBody
         * @instance
         */
        VersionedReadJsonReplyBody.prototype.json = "";

        /**
         * Creates a new VersionedReadJsonReplyBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {file.IVersionedReadJsonReplyBody=} [properties] Properties to set
         * @returns {file.VersionedReadJsonReplyBody} VersionedReadJsonReplyBody instance
         */
        VersionedReadJsonReplyBody.create = function create(properties) {
            return new VersionedReadJsonReplyBody(properties);
        };

        /**
         * Encodes the specified VersionedReadJsonReplyBody message. Does not implicitly {@link file.VersionedReadJsonReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {file.IVersionedReadJsonReplyBody} message VersionedReadJsonReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadJsonReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.json);
            return writer;
        };

        /**
         * Encodes the specified VersionedReadJsonReplyBody message, length delimited. Does not implicitly {@link file.VersionedReadJsonReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {file.IVersionedReadJsonReplyBody} message VersionedReadJsonReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadJsonReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedReadJsonReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedReadJsonReplyBody} VersionedReadJsonReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadJsonReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadJsonReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.json = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedReadJsonReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedReadJsonReplyBody} VersionedReadJsonReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadJsonReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedReadJsonReplyBody message.
         * @function verify
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedReadJsonReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                if (!$util.isString(message.json))
                    return "json: string expected";
            return null;
        };

        /**
         * Creates a VersionedReadJsonReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedReadJsonReplyBody} VersionedReadJsonReplyBody
         */
        VersionedReadJsonReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedReadJsonReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedReadJsonReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedReadJsonReplyBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            if (object.json != null)
                message.json = String(object.json);
            return message;
        };

        /**
         * Creates a plain object from a VersionedReadJsonReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {file.VersionedReadJsonReplyBody} message VersionedReadJsonReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedReadJsonReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.json = "";
            }
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = message.json;
            return object;
        };

        /**
         * Converts this VersionedReadJsonReplyBody to JSON.
         * @function toJSON
         * @memberof file.VersionedReadJsonReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedReadJsonReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedReadJsonReplyBody
         * @function getTypeUrl
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedReadJsonReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedReadJsonReplyBody";
        };

        return VersionedReadJsonReplyBody;
    })();

    file.VersionedGetByteSourceReplyBody = (function() {

        /**
         * Properties of a VersionedGetByteSourceReplyBody.
         * @memberof file
         * @interface IVersionedGetByteSourceReplyBody
         * @property {number|Long|null} [version] VersionedGetByteSourceReplyBody version
         * @property {common.IObjectReference|null} [src] VersionedGetByteSourceReplyBody src
         */

        /**
         * Constructs a new VersionedGetByteSourceReplyBody.
         * @memberof file
         * @classdesc Represents a VersionedGetByteSourceReplyBody.
         * @implements IVersionedGetByteSourceReplyBody
         * @constructor
         * @param {file.IVersionedGetByteSourceReplyBody=} [properties] Properties to set
         */
        function VersionedGetByteSourceReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedGetByteSourceReplyBody version.
         * @member {number|Long} version
         * @memberof file.VersionedGetByteSourceReplyBody
         * @instance
         */
        VersionedGetByteSourceReplyBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * VersionedGetByteSourceReplyBody src.
         * @member {common.IObjectReference|null|undefined} src
         * @memberof file.VersionedGetByteSourceReplyBody
         * @instance
         */
        VersionedGetByteSourceReplyBody.prototype.src = null;

        /**
         * Creates a new VersionedGetByteSourceReplyBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {file.IVersionedGetByteSourceReplyBody=} [properties] Properties to set
         * @returns {file.VersionedGetByteSourceReplyBody} VersionedGetByteSourceReplyBody instance
         */
        VersionedGetByteSourceReplyBody.create = function create(properties) {
            return new VersionedGetByteSourceReplyBody(properties);
        };

        /**
         * Encodes the specified VersionedGetByteSourceReplyBody message. Does not implicitly {@link file.VersionedGetByteSourceReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {file.IVersionedGetByteSourceReplyBody} message VersionedGetByteSourceReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetByteSourceReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                $root.common.ObjectReference.encode(message.src, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedGetByteSourceReplyBody message, length delimited. Does not implicitly {@link file.VersionedGetByteSourceReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {file.IVersionedGetByteSourceReplyBody} message VersionedGetByteSourceReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetByteSourceReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedGetByteSourceReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedGetByteSourceReplyBody} VersionedGetByteSourceReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetByteSourceReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetByteSourceReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.src = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedGetByteSourceReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedGetByteSourceReplyBody} VersionedGetByteSourceReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetByteSourceReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedGetByteSourceReplyBody message.
         * @function verify
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedGetByteSourceReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            if (message.src != null && Object.hasOwnProperty.call(message, "src")) {
                var error = $root.common.ObjectReference.verify(message.src, long + 1);
                if (error)
                    return "src." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedGetByteSourceReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedGetByteSourceReplyBody} VersionedGetByteSourceReplyBody
         */
        VersionedGetByteSourceReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedGetByteSourceReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedGetByteSourceReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedGetByteSourceReplyBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            if (object.src != null) {
                if (!$util.isObject(object.src))
                    throw TypeError(".file.VersionedGetByteSourceReplyBody.src: object expected");
                message.src = $root.common.ObjectReference.fromObject(object.src, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedGetByteSourceReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {file.VersionedGetByteSourceReplyBody} message VersionedGetByteSourceReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedGetByteSourceReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.src = null;
            }
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                object.src = $root.common.ObjectReference.toObject(message.src, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedGetByteSourceReplyBody to JSON.
         * @function toJSON
         * @memberof file.VersionedGetByteSourceReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedGetByteSourceReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedGetByteSourceReplyBody
         * @function getTypeUrl
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedGetByteSourceReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedGetByteSourceReplyBody";
        };

        return VersionedGetByteSourceReplyBody;
    })();

    file.ListVersionsReplyBody = (function() {

        /**
         * Properties of a ListVersionsReplyBody.
         * @memberof file
         * @interface IListVersionsReplyBody
         * @property {common.IUInt64Value|null} [current] ListVersionsReplyBody current
         * @property {Array.<number|Long>|null} [archived] ListVersionsReplyBody archived
         */

        /**
         * Constructs a new ListVersionsReplyBody.
         * @memberof file
         * @classdesc Represents a ListVersionsReplyBody.
         * @implements IListVersionsReplyBody
         * @constructor
         * @param {file.IListVersionsReplyBody=} [properties] Properties to set
         */
        function ListVersionsReplyBody(properties) {
            this.archived = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ListVersionsReplyBody current.
         * @member {common.IUInt64Value|null|undefined} current
         * @memberof file.ListVersionsReplyBody
         * @instance
         */
        ListVersionsReplyBody.prototype.current = null;

        /**
         * ListVersionsReplyBody archived.
         * @member {Array.<number|Long>} archived
         * @memberof file.ListVersionsReplyBody
         * @instance
         */
        ListVersionsReplyBody.prototype.archived = $util.emptyArray;

        /**
         * Creates a new ListVersionsReplyBody instance using the specified properties.
         * @function create
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {file.IListVersionsReplyBody=} [properties] Properties to set
         * @returns {file.ListVersionsReplyBody} ListVersionsReplyBody instance
         */
        ListVersionsReplyBody.create = function create(properties) {
            return new ListVersionsReplyBody(properties);
        };

        /**
         * Encodes the specified ListVersionsReplyBody message. Does not implicitly {@link file.ListVersionsReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {file.IListVersionsReplyBody} message ListVersionsReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ListVersionsReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                $root.common.UInt64Value.encode(message.current, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.archived != null && message.archived.length) {
                writer.uint32(/* id 2, wireType 2 =*/18).fork();
                for (var i = 0; i < message.archived.length; ++i)
                    writer.uint64(message.archived[i]);
                writer.ldelim();
            }
            return writer;
        };

        /**
         * Encodes the specified ListVersionsReplyBody message, length delimited. Does not implicitly {@link file.ListVersionsReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {file.IListVersionsReplyBody} message ListVersionsReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ListVersionsReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a ListVersionsReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.ListVersionsReplyBody} ListVersionsReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ListVersionsReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ListVersionsReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.current = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        if (!(message.archived && message.archived.length))
                            message.archived = [];
                        if ((tag & 7) === 2) {
                            var end2 = reader.uint32() + reader.pos;
                            while (reader.pos < end2)
                                message.archived.push(reader.uint64());
                        } else
                            message.archived.push(reader.uint64());
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a ListVersionsReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.ListVersionsReplyBody} ListVersionsReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ListVersionsReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a ListVersionsReplyBody message.
         * @function verify
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ListVersionsReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.current != null && Object.hasOwnProperty.call(message, "current")) {
                var error = $root.common.UInt64Value.verify(message.current, long + 1);
                if (error)
                    return "current." + error;
            }
            if (message.archived != null && Object.hasOwnProperty.call(message, "archived")) {
                if (!Array.isArray(message.archived))
                    return "archived: array expected";
                for (var i = 0; i < message.archived.length; ++i)
                    if (!$util.isInteger(message.archived[i]) && !(message.archived[i] && $util.isInteger(message.archived[i].low) && $util.isInteger(message.archived[i].high)))
                        return "archived: integer|Long[] expected";
            }
            return null;
        };

        /**
         * Creates a ListVersionsReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.ListVersionsReplyBody} ListVersionsReplyBody
         */
        ListVersionsReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.ListVersionsReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.ListVersionsReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.ListVersionsReplyBody();
            if (object.current != null) {
                if (!$util.isObject(object.current))
                    throw TypeError(".file.ListVersionsReplyBody.current: object expected");
                message.current = $root.common.UInt64Value.fromObject(object.current, long + 1);
            }
            if (object.archived) {
                if (!Array.isArray(object.archived))
                    throw TypeError(".file.ListVersionsReplyBody.archived: array expected");
                message.archived = [];
                for (var i = 0; i < object.archived.length; ++i)
                    if ($util.Long)
                        message.archived[i] = $util.Long.fromValue(object.archived[i], true);
                    else if (typeof object.archived[i] === "string")
                        message.archived[i] = parseInt(object.archived[i], 10);
                    else if (typeof object.archived[i] === "number")
                        message.archived[i] = object.archived[i];
                    else if (typeof object.archived[i] === "object")
                        message.archived[i] = new $util.LongBits(object.archived[i].low >>> 0, object.archived[i].high >>> 0).toNumber(true);
            }
            return message;
        };

        /**
         * Creates a plain object from a ListVersionsReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {file.ListVersionsReplyBody} message ListVersionsReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ListVersionsReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.archived = [];
            if (options.defaults)
                object.current = null;
            if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                object.current = $root.common.UInt64Value.toObject(message.current, options, q + 1);
            if (message.archived && message.archived.length) {
                object.archived = [];
                for (var j = 0; j < message.archived.length; ++j)
                    if (typeof BigInt !== "undefined" && options.longs === BigInt)
                        object.archived[j] = typeof message.archived[j] === "number" ? BigInt(message.archived[j]) : $util.Long.fromBits(message.archived[j].low >>> 0, message.archived[j].high >>> 0, true).toBigInt();
                    else if (typeof message.archived[j] === "number")
                        object.archived[j] = options.longs === String ? String(message.archived[j]) : message.archived[j];
                    else
                        object.archived[j] = options.longs === String ? $util.Long.prototype.toString.call(message.archived[j]) : options.longs === Number ? new $util.LongBits(message.archived[j].low >>> 0, message.archived[j].high >>> 0).toNumber(true) : message.archived[j];
            }
            return object;
        };

        /**
         * Converts this ListVersionsReplyBody to JSON.
         * @function toJSON
         * @memberof file.ListVersionsReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ListVersionsReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ListVersionsReplyBody
         * @function getTypeUrl
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ListVersionsReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.ListVersionsReplyBody";
        };

        return ListVersionsReplyBody;
    })();

    file.UpdateXAttrsRequestBody = (function() {

        /**
         * Properties of an UpdateXAttrsRequestBody.
         * @memberof file
         * @interface IUpdateXAttrsRequestBody
         * @property {file.IXAttrsChanges|null} [changes] UpdateXAttrsRequestBody changes
         */

        /**
         * Constructs a new UpdateXAttrsRequestBody.
         * @memberof file
         * @classdesc Represents an UpdateXAttrsRequestBody.
         * @implements IUpdateXAttrsRequestBody
         * @constructor
         * @param {file.IUpdateXAttrsRequestBody=} [properties] Properties to set
         */
        function UpdateXAttrsRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * UpdateXAttrsRequestBody changes.
         * @member {file.IXAttrsChanges|null|undefined} changes
         * @memberof file.UpdateXAttrsRequestBody
         * @instance
         */
        UpdateXAttrsRequestBody.prototype.changes = null;

        /**
         * Creates a new UpdateXAttrsRequestBody instance using the specified properties.
         * @function create
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {file.IUpdateXAttrsRequestBody=} [properties] Properties to set
         * @returns {file.UpdateXAttrsRequestBody} UpdateXAttrsRequestBody instance
         */
        UpdateXAttrsRequestBody.create = function create(properties) {
            return new UpdateXAttrsRequestBody(properties);
        };

        /**
         * Encodes the specified UpdateXAttrsRequestBody message. Does not implicitly {@link file.UpdateXAttrsRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {file.IUpdateXAttrsRequestBody} message UpdateXAttrsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UpdateXAttrsRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.changes != null && Object.hasOwnProperty.call(message, "changes"))
                $root.file.XAttrsChanges.encode(message.changes, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified UpdateXAttrsRequestBody message, length delimited. Does not implicitly {@link file.UpdateXAttrsRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {file.IUpdateXAttrsRequestBody} message UpdateXAttrsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UpdateXAttrsRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an UpdateXAttrsRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.UpdateXAttrsRequestBody} UpdateXAttrsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UpdateXAttrsRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.UpdateXAttrsRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.changes = $root.file.XAttrsChanges.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an UpdateXAttrsRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.UpdateXAttrsRequestBody} UpdateXAttrsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UpdateXAttrsRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an UpdateXAttrsRequestBody message.
         * @function verify
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        UpdateXAttrsRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.changes != null && Object.hasOwnProperty.call(message, "changes")) {
                var error = $root.file.XAttrsChanges.verify(message.changes, long + 1);
                if (error)
                    return "changes." + error;
            }
            return null;
        };

        /**
         * Creates an UpdateXAttrsRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.UpdateXAttrsRequestBody} UpdateXAttrsRequestBody
         */
        UpdateXAttrsRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.UpdateXAttrsRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.UpdateXAttrsRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.UpdateXAttrsRequestBody();
            if (object.changes != null) {
                if (!$util.isObject(object.changes))
                    throw TypeError(".file.UpdateXAttrsRequestBody.changes: object expected");
                message.changes = $root.file.XAttrsChanges.fromObject(object.changes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an UpdateXAttrsRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {file.UpdateXAttrsRequestBody} message UpdateXAttrsRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        UpdateXAttrsRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.changes = null;
            if (message.changes != null && Object.hasOwnProperty.call(message, "changes"))
                object.changes = $root.file.XAttrsChanges.toObject(message.changes, options, q + 1);
            return object;
        };

        /**
         * Converts this UpdateXAttrsRequestBody to JSON.
         * @function toJSON
         * @memberof file.UpdateXAttrsRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        UpdateXAttrsRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for UpdateXAttrsRequestBody
         * @function getTypeUrl
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        UpdateXAttrsRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.UpdateXAttrsRequestBody";
        };

        return UpdateXAttrsRequestBody;
    })();

    file.NameAndXAttrValue = (function() {

        /**
         * Properties of a NameAndXAttrValue.
         * @memberof file
         * @interface INameAndXAttrValue
         * @property {string|null} [xaName] NameAndXAttrValue xaName
         * @property {common.IStringValue|null} [str] NameAndXAttrValue str
         * @property {common.IStringValue|null} [json] NameAndXAttrValue json
         * @property {common.IBytesValue|null} [bytes] NameAndXAttrValue bytes
         */

        /**
         * Constructs a new NameAndXAttrValue.
         * @memberof file
         * @classdesc Represents a NameAndXAttrValue.
         * @implements INameAndXAttrValue
         * @constructor
         * @param {file.INameAndXAttrValue=} [properties] Properties to set
         */
        function NameAndXAttrValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * NameAndXAttrValue xaName.
         * @member {string} xaName
         * @memberof file.NameAndXAttrValue
         * @instance
         */
        NameAndXAttrValue.prototype.xaName = "";

        /**
         * NameAndXAttrValue str.
         * @member {common.IStringValue|null|undefined} str
         * @memberof file.NameAndXAttrValue
         * @instance
         */
        NameAndXAttrValue.prototype.str = null;

        /**
         * NameAndXAttrValue json.
         * @member {common.IStringValue|null|undefined} json
         * @memberof file.NameAndXAttrValue
         * @instance
         */
        NameAndXAttrValue.prototype.json = null;

        /**
         * NameAndXAttrValue bytes.
         * @member {common.IBytesValue|null|undefined} bytes
         * @memberof file.NameAndXAttrValue
         * @instance
         */
        NameAndXAttrValue.prototype.bytes = null;

        /**
         * Creates a new NameAndXAttrValue instance using the specified properties.
         * @function create
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {file.INameAndXAttrValue=} [properties] Properties to set
         * @returns {file.NameAndXAttrValue} NameAndXAttrValue instance
         */
        NameAndXAttrValue.create = function create(properties) {
            return new NameAndXAttrValue(properties);
        };

        /**
         * Encodes the specified NameAndXAttrValue message. Does not implicitly {@link file.NameAndXAttrValue.verify|verify} messages.
         * @function encode
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {file.INameAndXAttrValue} message NameAndXAttrValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        NameAndXAttrValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.xaName);
            if (message.str != null && Object.hasOwnProperty.call(message, "str"))
                $root.common.StringValue.encode(message.str, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified NameAndXAttrValue message, length delimited. Does not implicitly {@link file.NameAndXAttrValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {file.INameAndXAttrValue} message NameAndXAttrValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        NameAndXAttrValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a NameAndXAttrValue message from the specified reader or buffer.
         * @function decode
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.NameAndXAttrValue} NameAndXAttrValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        NameAndXAttrValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.NameAndXAttrValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.xaName = reader.string();
                        break;
                    }
                case 2: {
                        message.str = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.json = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a NameAndXAttrValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.NameAndXAttrValue} NameAndXAttrValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        NameAndXAttrValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a NameAndXAttrValue message.
         * @function verify
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        NameAndXAttrValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                if (!$util.isString(message.xaName))
                    return "xaName: string expected";
            if (message.str != null && Object.hasOwnProperty.call(message, "str")) {
                var error = $root.common.StringValue.verify(message.str, long + 1);
                if (error)
                    return "str." + error;
            }
            if (message.json != null && Object.hasOwnProperty.call(message, "json")) {
                var error = $root.common.StringValue.verify(message.json, long + 1);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes, long + 1);
                if (error)
                    return "bytes." + error;
            }
            return null;
        };

        /**
         * Creates a NameAndXAttrValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.NameAndXAttrValue} NameAndXAttrValue
         */
        NameAndXAttrValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.NameAndXAttrValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.NameAndXAttrValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.NameAndXAttrValue();
            if (object.xaName != null)
                message.xaName = String(object.xaName);
            if (object.str != null) {
                if (!$util.isObject(object.str))
                    throw TypeError(".file.NameAndXAttrValue.str: object expected");
                message.str = $root.common.StringValue.fromObject(object.str, long + 1);
            }
            if (object.json != null) {
                if (!$util.isObject(object.json))
                    throw TypeError(".file.NameAndXAttrValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json, long + 1);
            }
            if (object.bytes != null) {
                if (!$util.isObject(object.bytes))
                    throw TypeError(".file.NameAndXAttrValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a NameAndXAttrValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {file.NameAndXAttrValue} message NameAndXAttrValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        NameAndXAttrValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.xaName = "";
                object.str = null;
                object.json = null;
                object.bytes = null;
            }
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                object.xaName = message.xaName;
            if (message.str != null && Object.hasOwnProperty.call(message, "str"))
                object.str = $root.common.StringValue.toObject(message.str, options, q + 1);
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = $root.common.StringValue.toObject(message.json, options, q + 1);
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options, q + 1);
            return object;
        };

        /**
         * Converts this NameAndXAttrValue to JSON.
         * @function toJSON
         * @memberof file.NameAndXAttrValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        NameAndXAttrValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for NameAndXAttrValue
         * @function getTypeUrl
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        NameAndXAttrValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.NameAndXAttrValue";
        };

        return NameAndXAttrValue;
    })();

    file.XAttrsChanges = (function() {

        /**
         * Properties of a XAttrsChanges.
         * @memberof file
         * @interface IXAttrsChanges
         * @property {Array.<file.INameAndXAttrValue>|null} [set] XAttrsChanges set
         * @property {Array.<string>|null} [remove] XAttrsChanges remove
         */

        /**
         * Constructs a new XAttrsChanges.
         * @memberof file
         * @classdesc Represents a XAttrsChanges.
         * @implements IXAttrsChanges
         * @constructor
         * @param {file.IXAttrsChanges=} [properties] Properties to set
         */
        function XAttrsChanges(properties) {
            this.set = [];
            this.remove = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * XAttrsChanges set.
         * @member {Array.<file.INameAndXAttrValue>} set
         * @memberof file.XAttrsChanges
         * @instance
         */
        XAttrsChanges.prototype.set = $util.emptyArray;

        /**
         * XAttrsChanges remove.
         * @member {Array.<string>} remove
         * @memberof file.XAttrsChanges
         * @instance
         */
        XAttrsChanges.prototype.remove = $util.emptyArray;

        /**
         * Creates a new XAttrsChanges instance using the specified properties.
         * @function create
         * @memberof file.XAttrsChanges
         * @static
         * @param {file.IXAttrsChanges=} [properties] Properties to set
         * @returns {file.XAttrsChanges} XAttrsChanges instance
         */
        XAttrsChanges.create = function create(properties) {
            return new XAttrsChanges(properties);
        };

        /**
         * Encodes the specified XAttrsChanges message. Does not implicitly {@link file.XAttrsChanges.verify|verify} messages.
         * @function encode
         * @memberof file.XAttrsChanges
         * @static
         * @param {file.IXAttrsChanges} message XAttrsChanges message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        XAttrsChanges.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.set != null && message.set.length)
                for (var i = 0; i < message.set.length; ++i)
                    $root.file.NameAndXAttrValue.encode(message.set[i], writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.remove != null && message.remove.length)
                for (var i = 0; i < message.remove.length; ++i)
                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.remove[i]);
            return writer;
        };

        /**
         * Encodes the specified XAttrsChanges message, length delimited. Does not implicitly {@link file.XAttrsChanges.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.XAttrsChanges
         * @static
         * @param {file.IXAttrsChanges} message XAttrsChanges message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        XAttrsChanges.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a XAttrsChanges message from the specified reader or buffer.
         * @function decode
         * @memberof file.XAttrsChanges
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.XAttrsChanges} XAttrsChanges
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        XAttrsChanges.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.XAttrsChanges();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.set && message.set.length))
                            message.set = [];
                        message.set.push($root.file.NameAndXAttrValue.decode(reader, reader.uint32(), undefined, long + 1));
                        break;
                    }
                case 2: {
                        if (!(message.remove && message.remove.length))
                            message.remove = [];
                        message.remove.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a XAttrsChanges message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.XAttrsChanges
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.XAttrsChanges} XAttrsChanges
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        XAttrsChanges.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a XAttrsChanges message.
         * @function verify
         * @memberof file.XAttrsChanges
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        XAttrsChanges.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.set != null && Object.hasOwnProperty.call(message, "set")) {
                if (!Array.isArray(message.set))
                    return "set: array expected";
                for (var i = 0; i < message.set.length; ++i) {
                    var error = $root.file.NameAndXAttrValue.verify(message.set[i], long + 1);
                    if (error)
                        return "set." + error;
                }
            }
            if (message.remove != null && Object.hasOwnProperty.call(message, "remove")) {
                if (!Array.isArray(message.remove))
                    return "remove: array expected";
                for (var i = 0; i < message.remove.length; ++i)
                    if (!$util.isString(message.remove[i]))
                        return "remove: string[] expected";
            }
            return null;
        };

        /**
         * Creates a XAttrsChanges message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.XAttrsChanges
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.XAttrsChanges} XAttrsChanges
         */
        XAttrsChanges.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.XAttrsChanges)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.XAttrsChanges: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.XAttrsChanges();
            if (object.set) {
                if (!Array.isArray(object.set))
                    throw TypeError(".file.XAttrsChanges.set: array expected");
                message.set = [];
                for (var i = 0; i < object.set.length; ++i) {
                    if (!$util.isObject(object.set[i]))
                        throw TypeError(".file.XAttrsChanges.set: object expected");
                    message.set[i] = $root.file.NameAndXAttrValue.fromObject(object.set[i], long + 1);
                }
            }
            if (object.remove) {
                if (!Array.isArray(object.remove))
                    throw TypeError(".file.XAttrsChanges.remove: array expected");
                message.remove = [];
                for (var i = 0; i < object.remove.length; ++i)
                    message.remove[i] = String(object.remove[i]);
            }
            return message;
        };

        /**
         * Creates a plain object from a XAttrsChanges message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.XAttrsChanges
         * @static
         * @param {file.XAttrsChanges} message XAttrsChanges
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        XAttrsChanges.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults) {
                object.set = [];
                object.remove = [];
            }
            if (message.set && message.set.length) {
                object.set = [];
                for (var j = 0; j < message.set.length; ++j)
                    object.set[j] = $root.file.NameAndXAttrValue.toObject(message.set[j], options, q + 1);
            }
            if (message.remove && message.remove.length) {
                object.remove = [];
                for (var j = 0; j < message.remove.length; ++j)
                    object.remove[j] = message.remove[j];
            }
            return object;
        };

        /**
         * Converts this XAttrsChanges to JSON.
         * @function toJSON
         * @memberof file.XAttrsChanges
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        XAttrsChanges.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for XAttrsChanges
         * @function getTypeUrl
         * @memberof file.XAttrsChanges
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        XAttrsChanges.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.XAttrsChanges";
        };

        return XAttrsChanges;
    })();

    file.WriteBytesRequestBody = (function() {

        /**
         * Properties of a WriteBytesRequestBody.
         * @memberof file
         * @interface IWriteBytesRequestBody
         * @property {Uint8Array|null} [bytes] WriteBytesRequestBody bytes
         */

        /**
         * Constructs a new WriteBytesRequestBody.
         * @memberof file
         * @classdesc Represents a WriteBytesRequestBody.
         * @implements IWriteBytesRequestBody
         * @constructor
         * @param {file.IWriteBytesRequestBody=} [properties] Properties to set
         */
        function WriteBytesRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * WriteBytesRequestBody bytes.
         * @member {Uint8Array} bytes
         * @memberof file.WriteBytesRequestBody
         * @instance
         */
        WriteBytesRequestBody.prototype.bytes = $util.newBuffer([]);

        /**
         * Creates a new WriteBytesRequestBody instance using the specified properties.
         * @function create
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {file.IWriteBytesRequestBody=} [properties] Properties to set
         * @returns {file.WriteBytesRequestBody} WriteBytesRequestBody instance
         */
        WriteBytesRequestBody.create = function create(properties) {
            return new WriteBytesRequestBody(properties);
        };

        /**
         * Encodes the specified WriteBytesRequestBody message. Does not implicitly {@link file.WriteBytesRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {file.IWriteBytesRequestBody} message WriteBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteBytesRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.bytes);
            return writer;
        };

        /**
         * Encodes the specified WriteBytesRequestBody message, length delimited. Does not implicitly {@link file.WriteBytesRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {file.IWriteBytesRequestBody} message WriteBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteBytesRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a WriteBytesRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.WriteBytesRequestBody} WriteBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteBytesRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.WriteBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.bytes = reader.bytes();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a WriteBytesRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.WriteBytesRequestBody} WriteBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteBytesRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a WriteBytesRequestBody message.
         * @function verify
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        WriteBytesRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                if (!(message.bytes && typeof message.bytes.length === "number" || $util.isString(message.bytes)))
                    return "bytes: buffer expected";
            return null;
        };

        /**
         * Creates a WriteBytesRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.WriteBytesRequestBody} WriteBytesRequestBody
         */
        WriteBytesRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.WriteBytesRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.WriteBytesRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.WriteBytesRequestBody();
            if (object.bytes != null)
                if (typeof object.bytes === "string")
                    $util.base64.decode(object.bytes, message.bytes = $util.newBuffer($util.base64.length(object.bytes)), 0);
                else if (object.bytes.length >= 0)
                    message.bytes = object.bytes;
            return message;
        };

        /**
         * Creates a plain object from a WriteBytesRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {file.WriteBytesRequestBody} message WriteBytesRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        WriteBytesRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if (options.bytes === String)
                    object.bytes = "";
                else {
                    object.bytes = [];
                    if (options.bytes !== Array)
                        object.bytes = $util.newBuffer(object.bytes);
                }
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = options.bytes === String ? $util.base64.encode(message.bytes, 0, message.bytes.length) : options.bytes === Array ? Array.prototype.slice.call(message.bytes) : message.bytes;
            return object;
        };

        /**
         * Converts this WriteBytesRequestBody to JSON.
         * @function toJSON
         * @memberof file.WriteBytesRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        WriteBytesRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for WriteBytesRequestBody
         * @function getTypeUrl
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        WriteBytesRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.WriteBytesRequestBody";
        };

        return WriteBytesRequestBody;
    })();

    file.WriteTxtRequestBody = (function() {

        /**
         * Properties of a WriteTxtRequestBody.
         * @memberof file
         * @interface IWriteTxtRequestBody
         * @property {string|null} [txt] WriteTxtRequestBody txt
         */

        /**
         * Constructs a new WriteTxtRequestBody.
         * @memberof file
         * @classdesc Represents a WriteTxtRequestBody.
         * @implements IWriteTxtRequestBody
         * @constructor
         * @param {file.IWriteTxtRequestBody=} [properties] Properties to set
         */
        function WriteTxtRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * WriteTxtRequestBody txt.
         * @member {string} txt
         * @memberof file.WriteTxtRequestBody
         * @instance
         */
        WriteTxtRequestBody.prototype.txt = "";

        /**
         * Creates a new WriteTxtRequestBody instance using the specified properties.
         * @function create
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {file.IWriteTxtRequestBody=} [properties] Properties to set
         * @returns {file.WriteTxtRequestBody} WriteTxtRequestBody instance
         */
        WriteTxtRequestBody.create = function create(properties) {
            return new WriteTxtRequestBody(properties);
        };

        /**
         * Encodes the specified WriteTxtRequestBody message. Does not implicitly {@link file.WriteTxtRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {file.IWriteTxtRequestBody} message WriteTxtRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteTxtRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.txt);
            return writer;
        };

        /**
         * Encodes the specified WriteTxtRequestBody message, length delimited. Does not implicitly {@link file.WriteTxtRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {file.IWriteTxtRequestBody} message WriteTxtRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteTxtRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a WriteTxtRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.WriteTxtRequestBody} WriteTxtRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteTxtRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.WriteTxtRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.txt = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a WriteTxtRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.WriteTxtRequestBody} WriteTxtRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteTxtRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a WriteTxtRequestBody message.
         * @function verify
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        WriteTxtRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                if (!$util.isString(message.txt))
                    return "txt: string expected";
            return null;
        };

        /**
         * Creates a WriteTxtRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.WriteTxtRequestBody} WriteTxtRequestBody
         */
        WriteTxtRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.WriteTxtRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.WriteTxtRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.WriteTxtRequestBody();
            if (object.txt != null)
                message.txt = String(object.txt);
            return message;
        };

        /**
         * Creates a plain object from a WriteTxtRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {file.WriteTxtRequestBody} message WriteTxtRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        WriteTxtRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.txt = "";
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                object.txt = message.txt;
            return object;
        };

        /**
         * Converts this WriteTxtRequestBody to JSON.
         * @function toJSON
         * @memberof file.WriteTxtRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        WriteTxtRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for WriteTxtRequestBody
         * @function getTypeUrl
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        WriteTxtRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.WriteTxtRequestBody";
        };

        return WriteTxtRequestBody;
    })();

    file.WriteJsonRequestBody = (function() {

        /**
         * Properties of a WriteJsonRequestBody.
         * @memberof file
         * @interface IWriteJsonRequestBody
         * @property {string|null} [json] WriteJsonRequestBody json
         */

        /**
         * Constructs a new WriteJsonRequestBody.
         * @memberof file
         * @classdesc Represents a WriteJsonRequestBody.
         * @implements IWriteJsonRequestBody
         * @constructor
         * @param {file.IWriteJsonRequestBody=} [properties] Properties to set
         */
        function WriteJsonRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * WriteJsonRequestBody json.
         * @member {string} json
         * @memberof file.WriteJsonRequestBody
         * @instance
         */
        WriteJsonRequestBody.prototype.json = "";

        /**
         * Creates a new WriteJsonRequestBody instance using the specified properties.
         * @function create
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {file.IWriteJsonRequestBody=} [properties] Properties to set
         * @returns {file.WriteJsonRequestBody} WriteJsonRequestBody instance
         */
        WriteJsonRequestBody.create = function create(properties) {
            return new WriteJsonRequestBody(properties);
        };

        /**
         * Encodes the specified WriteJsonRequestBody message. Does not implicitly {@link file.WriteJsonRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {file.IWriteJsonRequestBody} message WriteJsonRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteJsonRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.json);
            return writer;
        };

        /**
         * Encodes the specified WriteJsonRequestBody message, length delimited. Does not implicitly {@link file.WriteJsonRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {file.IWriteJsonRequestBody} message WriteJsonRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteJsonRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a WriteJsonRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.WriteJsonRequestBody} WriteJsonRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteJsonRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.WriteJsonRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.json = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a WriteJsonRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.WriteJsonRequestBody} WriteJsonRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteJsonRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a WriteJsonRequestBody message.
         * @function verify
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        WriteJsonRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                if (!$util.isString(message.json))
                    return "json: string expected";
            return null;
        };

        /**
         * Creates a WriteJsonRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.WriteJsonRequestBody} WriteJsonRequestBody
         */
        WriteJsonRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.WriteJsonRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.WriteJsonRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.WriteJsonRequestBody();
            if (object.json != null)
                message.json = String(object.json);
            return message;
        };

        /**
         * Creates a plain object from a WriteJsonRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {file.WriteJsonRequestBody} message WriteJsonRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        WriteJsonRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.json = "";
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = message.json;
            return object;
        };

        /**
         * Converts this WriteJsonRequestBody to JSON.
         * @function toJSON
         * @memberof file.WriteJsonRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        WriteJsonRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for WriteJsonRequestBody
         * @function getTypeUrl
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        WriteJsonRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.WriteJsonRequestBody";
        };

        return WriteJsonRequestBody;
    })();

    file.GetByteSinkRequestBody = (function() {

        /**
         * Properties of a GetByteSinkRequestBody.
         * @memberof file
         * @interface IGetByteSinkRequestBody
         * @property {common.IBooleanValue|null} [truncateFile] GetByteSinkRequestBody truncateFile
         */

        /**
         * Constructs a new GetByteSinkRequestBody.
         * @memberof file
         * @classdesc Represents a GetByteSinkRequestBody.
         * @implements IGetByteSinkRequestBody
         * @constructor
         * @param {file.IGetByteSinkRequestBody=} [properties] Properties to set
         */
        function GetByteSinkRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * GetByteSinkRequestBody truncateFile.
         * @member {common.IBooleanValue|null|undefined} truncateFile
         * @memberof file.GetByteSinkRequestBody
         * @instance
         */
        GetByteSinkRequestBody.prototype.truncateFile = null;

        /**
         * Creates a new GetByteSinkRequestBody instance using the specified properties.
         * @function create
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {file.IGetByteSinkRequestBody=} [properties] Properties to set
         * @returns {file.GetByteSinkRequestBody} GetByteSinkRequestBody instance
         */
        GetByteSinkRequestBody.create = function create(properties) {
            return new GetByteSinkRequestBody(properties);
        };

        /**
         * Encodes the specified GetByteSinkRequestBody message. Does not implicitly {@link file.GetByteSinkRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {file.IGetByteSinkRequestBody} message GetByteSinkRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        GetByteSinkRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.truncateFile != null && Object.hasOwnProperty.call(message, "truncateFile"))
                $root.common.BooleanValue.encode(message.truncateFile, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified GetByteSinkRequestBody message, length delimited. Does not implicitly {@link file.GetByteSinkRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {file.IGetByteSinkRequestBody} message GetByteSinkRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        GetByteSinkRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a GetByteSinkRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.GetByteSinkRequestBody} GetByteSinkRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        GetByteSinkRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.GetByteSinkRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.truncateFile = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a GetByteSinkRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.GetByteSinkRequestBody} GetByteSinkRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        GetByteSinkRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a GetByteSinkRequestBody message.
         * @function verify
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        GetByteSinkRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.truncateFile != null && Object.hasOwnProperty.call(message, "truncateFile")) {
                var error = $root.common.BooleanValue.verify(message.truncateFile, long + 1);
                if (error)
                    return "truncateFile." + error;
            }
            return null;
        };

        /**
         * Creates a GetByteSinkRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.GetByteSinkRequestBody} GetByteSinkRequestBody
         */
        GetByteSinkRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.GetByteSinkRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.GetByteSinkRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.GetByteSinkRequestBody();
            if (object.truncateFile != null) {
                if (!$util.isObject(object.truncateFile))
                    throw TypeError(".file.GetByteSinkRequestBody.truncateFile: object expected");
                message.truncateFile = $root.common.BooleanValue.fromObject(object.truncateFile, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a GetByteSinkRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {file.GetByteSinkRequestBody} message GetByteSinkRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        GetByteSinkRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.truncateFile = null;
            if (message.truncateFile != null && Object.hasOwnProperty.call(message, "truncateFile"))
                object.truncateFile = $root.common.BooleanValue.toObject(message.truncateFile, options, q + 1);
            return object;
        };

        /**
         * Converts this GetByteSinkRequestBody to JSON.
         * @function toJSON
         * @memberof file.GetByteSinkRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        GetByteSinkRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for GetByteSinkRequestBody
         * @function getTypeUrl
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        GetByteSinkRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.GetByteSinkRequestBody";
        };

        return GetByteSinkRequestBody;
    })();

    file.CopyRequestBody = (function() {

        /**
         * Properties of a CopyRequestBody.
         * @memberof file
         * @interface ICopyRequestBody
         * @property {common.IObjectReference|null} [file] CopyRequestBody file
         */

        /**
         * Constructs a new CopyRequestBody.
         * @memberof file
         * @classdesc Represents a CopyRequestBody.
         * @implements ICopyRequestBody
         * @constructor
         * @param {file.ICopyRequestBody=} [properties] Properties to set
         */
        function CopyRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * CopyRequestBody file.
         * @member {common.IObjectReference|null|undefined} file
         * @memberof file.CopyRequestBody
         * @instance
         */
        CopyRequestBody.prototype.file = null;

        /**
         * Creates a new CopyRequestBody instance using the specified properties.
         * @function create
         * @memberof file.CopyRequestBody
         * @static
         * @param {file.ICopyRequestBody=} [properties] Properties to set
         * @returns {file.CopyRequestBody} CopyRequestBody instance
         */
        CopyRequestBody.create = function create(properties) {
            return new CopyRequestBody(properties);
        };

        /**
         * Encodes the specified CopyRequestBody message. Does not implicitly {@link file.CopyRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.CopyRequestBody
         * @static
         * @param {file.ICopyRequestBody} message CopyRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CopyRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                $root.common.ObjectReference.encode(message.file, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified CopyRequestBody message, length delimited. Does not implicitly {@link file.CopyRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.CopyRequestBody
         * @static
         * @param {file.ICopyRequestBody} message CopyRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CopyRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a CopyRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.CopyRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.CopyRequestBody} CopyRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CopyRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.CopyRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.file = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a CopyRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.CopyRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.CopyRequestBody} CopyRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CopyRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a CopyRequestBody message.
         * @function verify
         * @memberof file.CopyRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        CopyRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.file != null && Object.hasOwnProperty.call(message, "file")) {
                var error = $root.common.ObjectReference.verify(message.file, long + 1);
                if (error)
                    return "file." + error;
            }
            return null;
        };

        /**
         * Creates a CopyRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.CopyRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.CopyRequestBody} CopyRequestBody
         */
        CopyRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.CopyRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.CopyRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.CopyRequestBody();
            if (object.file != null) {
                if (!$util.isObject(object.file))
                    throw TypeError(".file.CopyRequestBody.file: object expected");
                message.file = $root.common.ObjectReference.fromObject(object.file, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a CopyRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.CopyRequestBody
         * @static
         * @param {file.CopyRequestBody} message CopyRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        CopyRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.file = null;
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                object.file = $root.common.ObjectReference.toObject(message.file, options, q + 1);
            return object;
        };

        /**
         * Converts this CopyRequestBody to JSON.
         * @function toJSON
         * @memberof file.CopyRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        CopyRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for CopyRequestBody
         * @function getTypeUrl
         * @memberof file.CopyRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        CopyRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.CopyRequestBody";
        };

        return CopyRequestBody;
    })();

    file.VersionedGetByteSinkRequestBody = (function() {

        /**
         * Properties of a VersionedGetByteSinkRequestBody.
         * @memberof file
         * @interface IVersionedGetByteSinkRequestBody
         * @property {common.IBooleanValue|null} [truncateFile] VersionedGetByteSinkRequestBody truncateFile
         * @property {common.IUInt64Value|null} [currentVersion] VersionedGetByteSinkRequestBody currentVersion
         */

        /**
         * Constructs a new VersionedGetByteSinkRequestBody.
         * @memberof file
         * @classdesc Represents a VersionedGetByteSinkRequestBody.
         * @implements IVersionedGetByteSinkRequestBody
         * @constructor
         * @param {file.IVersionedGetByteSinkRequestBody=} [properties] Properties to set
         */
        function VersionedGetByteSinkRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedGetByteSinkRequestBody truncateFile.
         * @member {common.IBooleanValue|null|undefined} truncateFile
         * @memberof file.VersionedGetByteSinkRequestBody
         * @instance
         */
        VersionedGetByteSinkRequestBody.prototype.truncateFile = null;

        /**
         * VersionedGetByteSinkRequestBody currentVersion.
         * @member {common.IUInt64Value|null|undefined} currentVersion
         * @memberof file.VersionedGetByteSinkRequestBody
         * @instance
         */
        VersionedGetByteSinkRequestBody.prototype.currentVersion = null;

        /**
         * Creates a new VersionedGetByteSinkRequestBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {file.IVersionedGetByteSinkRequestBody=} [properties] Properties to set
         * @returns {file.VersionedGetByteSinkRequestBody} VersionedGetByteSinkRequestBody instance
         */
        VersionedGetByteSinkRequestBody.create = function create(properties) {
            return new VersionedGetByteSinkRequestBody(properties);
        };

        /**
         * Encodes the specified VersionedGetByteSinkRequestBody message. Does not implicitly {@link file.VersionedGetByteSinkRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {file.IVersionedGetByteSinkRequestBody} message VersionedGetByteSinkRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetByteSinkRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.truncateFile != null && Object.hasOwnProperty.call(message, "truncateFile"))
                $root.common.BooleanValue.encode(message.truncateFile, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                $root.common.UInt64Value.encode(message.currentVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedGetByteSinkRequestBody message, length delimited. Does not implicitly {@link file.VersionedGetByteSinkRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {file.IVersionedGetByteSinkRequestBody} message VersionedGetByteSinkRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetByteSinkRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedGetByteSinkRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedGetByteSinkRequestBody} VersionedGetByteSinkRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetByteSinkRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetByteSinkRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.truncateFile = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.currentVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedGetByteSinkRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedGetByteSinkRequestBody} VersionedGetByteSinkRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetByteSinkRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedGetByteSinkRequestBody message.
         * @function verify
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedGetByteSinkRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.truncateFile != null && Object.hasOwnProperty.call(message, "truncateFile")) {
                var error = $root.common.BooleanValue.verify(message.truncateFile, long + 1);
                if (error)
                    return "truncateFile." + error;
            }
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion")) {
                var error = $root.common.UInt64Value.verify(message.currentVersion, long + 1);
                if (error)
                    return "currentVersion." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedGetByteSinkRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedGetByteSinkRequestBody} VersionedGetByteSinkRequestBody
         */
        VersionedGetByteSinkRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedGetByteSinkRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedGetByteSinkRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedGetByteSinkRequestBody();
            if (object.truncateFile != null) {
                if (!$util.isObject(object.truncateFile))
                    throw TypeError(".file.VersionedGetByteSinkRequestBody.truncateFile: object expected");
                message.truncateFile = $root.common.BooleanValue.fromObject(object.truncateFile, long + 1);
            }
            if (object.currentVersion != null) {
                if (!$util.isObject(object.currentVersion))
                    throw TypeError(".file.VersionedGetByteSinkRequestBody.currentVersion: object expected");
                message.currentVersion = $root.common.UInt64Value.fromObject(object.currentVersion, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedGetByteSinkRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {file.VersionedGetByteSinkRequestBody} message VersionedGetByteSinkRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedGetByteSinkRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.truncateFile = null;
                object.currentVersion = null;
            }
            if (message.truncateFile != null && Object.hasOwnProperty.call(message, "truncateFile"))
                object.truncateFile = $root.common.BooleanValue.toObject(message.truncateFile, options, q + 1);
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                object.currentVersion = $root.common.UInt64Value.toObject(message.currentVersion, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedGetByteSinkRequestBody to JSON.
         * @function toJSON
         * @memberof file.VersionedGetByteSinkRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedGetByteSinkRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedGetByteSinkRequestBody
         * @function getTypeUrl
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedGetByteSinkRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedGetByteSinkRequestBody";
        };

        return VersionedGetByteSinkRequestBody;
    })();

    file.VersionedGetByteSinkReplyBody = (function() {

        /**
         * Properties of a VersionedGetByteSinkReplyBody.
         * @memberof file
         * @interface IVersionedGetByteSinkReplyBody
         * @property {number|Long|null} [version] VersionedGetByteSinkReplyBody version
         * @property {common.IObjectReference|null} [sink] VersionedGetByteSinkReplyBody sink
         */

        /**
         * Constructs a new VersionedGetByteSinkReplyBody.
         * @memberof file
         * @classdesc Represents a VersionedGetByteSinkReplyBody.
         * @implements IVersionedGetByteSinkReplyBody
         * @constructor
         * @param {file.IVersionedGetByteSinkReplyBody=} [properties] Properties to set
         */
        function VersionedGetByteSinkReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedGetByteSinkReplyBody version.
         * @member {number|Long} version
         * @memberof file.VersionedGetByteSinkReplyBody
         * @instance
         */
        VersionedGetByteSinkReplyBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * VersionedGetByteSinkReplyBody sink.
         * @member {common.IObjectReference|null|undefined} sink
         * @memberof file.VersionedGetByteSinkReplyBody
         * @instance
         */
        VersionedGetByteSinkReplyBody.prototype.sink = null;

        /**
         * Creates a new VersionedGetByteSinkReplyBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {file.IVersionedGetByteSinkReplyBody=} [properties] Properties to set
         * @returns {file.VersionedGetByteSinkReplyBody} VersionedGetByteSinkReplyBody instance
         */
        VersionedGetByteSinkReplyBody.create = function create(properties) {
            return new VersionedGetByteSinkReplyBody(properties);
        };

        /**
         * Encodes the specified VersionedGetByteSinkReplyBody message. Does not implicitly {@link file.VersionedGetByteSinkReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {file.IVersionedGetByteSinkReplyBody} message VersionedGetByteSinkReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetByteSinkReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            if (message.sink != null && Object.hasOwnProperty.call(message, "sink"))
                $root.common.ObjectReference.encode(message.sink, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedGetByteSinkReplyBody message, length delimited. Does not implicitly {@link file.VersionedGetByteSinkReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {file.IVersionedGetByteSinkReplyBody} message VersionedGetByteSinkReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetByteSinkReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedGetByteSinkReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedGetByteSinkReplyBody} VersionedGetByteSinkReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetByteSinkReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetByteSinkReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.sink = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedGetByteSinkReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedGetByteSinkReplyBody} VersionedGetByteSinkReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetByteSinkReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedGetByteSinkReplyBody message.
         * @function verify
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedGetByteSinkReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            if (message.sink != null && Object.hasOwnProperty.call(message, "sink")) {
                var error = $root.common.ObjectReference.verify(message.sink, long + 1);
                if (error)
                    return "sink." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedGetByteSinkReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedGetByteSinkReplyBody} VersionedGetByteSinkReplyBody
         */
        VersionedGetByteSinkReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedGetByteSinkReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedGetByteSinkReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedGetByteSinkReplyBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            if (object.sink != null) {
                if (!$util.isObject(object.sink))
                    throw TypeError(".file.VersionedGetByteSinkReplyBody.sink: object expected");
                message.sink = $root.common.ObjectReference.fromObject(object.sink, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedGetByteSinkReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {file.VersionedGetByteSinkReplyBody} message VersionedGetByteSinkReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedGetByteSinkReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.sink = null;
            }
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            if (message.sink != null && Object.hasOwnProperty.call(message, "sink"))
                object.sink = $root.common.ObjectReference.toObject(message.sink, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedGetByteSinkReplyBody to JSON.
         * @function toJSON
         * @memberof file.VersionedGetByteSinkReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedGetByteSinkReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedGetByteSinkReplyBody
         * @function getTypeUrl
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedGetByteSinkReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedGetByteSinkReplyBody";
        };

        return VersionedGetByteSinkReplyBody;
    })();

    file.ArchiveCurrentRequestBody = (function() {

        /**
         * Properties of an ArchiveCurrentRequestBody.
         * @memberof file
         * @interface IArchiveCurrentRequestBody
         * @property {common.IUInt64Value|null} [version] ArchiveCurrentRequestBody version
         */

        /**
         * Constructs a new ArchiveCurrentRequestBody.
         * @memberof file
         * @classdesc Represents an ArchiveCurrentRequestBody.
         * @implements IArchiveCurrentRequestBody
         * @constructor
         * @param {file.IArchiveCurrentRequestBody=} [properties] Properties to set
         */
        function ArchiveCurrentRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ArchiveCurrentRequestBody version.
         * @member {common.IUInt64Value|null|undefined} version
         * @memberof file.ArchiveCurrentRequestBody
         * @instance
         */
        ArchiveCurrentRequestBody.prototype.version = null;

        /**
         * Creates a new ArchiveCurrentRequestBody instance using the specified properties.
         * @function create
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {file.IArchiveCurrentRequestBody=} [properties] Properties to set
         * @returns {file.ArchiveCurrentRequestBody} ArchiveCurrentRequestBody instance
         */
        ArchiveCurrentRequestBody.create = function create(properties) {
            return new ArchiveCurrentRequestBody(properties);
        };

        /**
         * Encodes the specified ArchiveCurrentRequestBody message. Does not implicitly {@link file.ArchiveCurrentRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {file.IArchiveCurrentRequestBody} message ArchiveCurrentRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ArchiveCurrentRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                $root.common.UInt64Value.encode(message.version, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified ArchiveCurrentRequestBody message, length delimited. Does not implicitly {@link file.ArchiveCurrentRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {file.IArchiveCurrentRequestBody} message ArchiveCurrentRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ArchiveCurrentRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an ArchiveCurrentRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.ArchiveCurrentRequestBody} ArchiveCurrentRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ArchiveCurrentRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ArchiveCurrentRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an ArchiveCurrentRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.ArchiveCurrentRequestBody} ArchiveCurrentRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ArchiveCurrentRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an ArchiveCurrentRequestBody message.
         * @function verify
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ArchiveCurrentRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version")) {
                var error = $root.common.UInt64Value.verify(message.version, long + 1);
                if (error)
                    return "version." + error;
            }
            return null;
        };

        /**
         * Creates an ArchiveCurrentRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.ArchiveCurrentRequestBody} ArchiveCurrentRequestBody
         */
        ArchiveCurrentRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.ArchiveCurrentRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.ArchiveCurrentRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.ArchiveCurrentRequestBody();
            if (object.version != null) {
                if (!$util.isObject(object.version))
                    throw TypeError(".file.ArchiveCurrentRequestBody.version: object expected");
                message.version = $root.common.UInt64Value.fromObject(object.version, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an ArchiveCurrentRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {file.ArchiveCurrentRequestBody} message ArchiveCurrentRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ArchiveCurrentRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.version = null;
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                object.version = $root.common.UInt64Value.toObject(message.version, options, q + 1);
            return object;
        };

        /**
         * Converts this ArchiveCurrentRequestBody to JSON.
         * @function toJSON
         * @memberof file.ArchiveCurrentRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ArchiveCurrentRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ArchiveCurrentRequestBody
         * @function getTypeUrl
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ArchiveCurrentRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.ArchiveCurrentRequestBody";
        };

        return ArchiveCurrentRequestBody;
    })();

    file.FileSyncIsOnDiskRequestBody = (function() {

        /**
         * Properties of a FileSyncIsOnDiskRequestBody.
         * @memberof file
         * @interface IFileSyncIsOnDiskRequestBody
         * @property {number|Long|null} [version] FileSyncIsOnDiskRequestBody version
         */

        /**
         * Constructs a new FileSyncIsOnDiskRequestBody.
         * @memberof file
         * @classdesc Represents a FileSyncIsOnDiskRequestBody.
         * @implements IFileSyncIsOnDiskRequestBody
         * @constructor
         * @param {file.IFileSyncIsOnDiskRequestBody=} [properties] Properties to set
         */
        function FileSyncIsOnDiskRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileSyncIsOnDiskRequestBody version.
         * @member {number|Long} version
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @instance
         */
        FileSyncIsOnDiskRequestBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new FileSyncIsOnDiskRequestBody instance using the specified properties.
         * @function create
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {file.IFileSyncIsOnDiskRequestBody=} [properties] Properties to set
         * @returns {file.FileSyncIsOnDiskRequestBody} FileSyncIsOnDiskRequestBody instance
         */
        FileSyncIsOnDiskRequestBody.create = function create(properties) {
            return new FileSyncIsOnDiskRequestBody(properties);
        };

        /**
         * Encodes the specified FileSyncIsOnDiskRequestBody message. Does not implicitly {@link file.FileSyncIsOnDiskRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {file.IFileSyncIsOnDiskRequestBody} message FileSyncIsOnDiskRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncIsOnDiskRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            return writer;
        };

        /**
         * Encodes the specified FileSyncIsOnDiskRequestBody message, length delimited. Does not implicitly {@link file.FileSyncIsOnDiskRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {file.IFileSyncIsOnDiskRequestBody} message FileSyncIsOnDiskRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncIsOnDiskRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileSyncIsOnDiskRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileSyncIsOnDiskRequestBody} FileSyncIsOnDiskRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncIsOnDiskRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncIsOnDiskRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileSyncIsOnDiskRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.FileSyncIsOnDiskRequestBody} FileSyncIsOnDiskRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncIsOnDiskRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileSyncIsOnDiskRequestBody message.
         * @function verify
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileSyncIsOnDiskRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            return null;
        };

        /**
         * Creates a FileSyncIsOnDiskRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileSyncIsOnDiskRequestBody} FileSyncIsOnDiskRequestBody
         */
        FileSyncIsOnDiskRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.FileSyncIsOnDiskRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.FileSyncIsOnDiskRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.FileSyncIsOnDiskRequestBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from a FileSyncIsOnDiskRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {file.FileSyncIsOnDiskRequestBody} message FileSyncIsOnDiskRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileSyncIsOnDiskRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            return object;
        };

        /**
         * Converts this FileSyncIsOnDiskRequestBody to JSON.
         * @function toJSON
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileSyncIsOnDiskRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileSyncIsOnDiskRequestBody
         * @function getTypeUrl
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileSyncIsOnDiskRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.FileSyncIsOnDiskRequestBody";
        };

        return FileSyncIsOnDiskRequestBody;
    })();

    file.FileSyncIsOnDiskReplyBody = (function() {

        /**
         * Properties of a FileSyncIsOnDiskReplyBody.
         * @memberof file
         * @interface IFileSyncIsOnDiskReplyBody
         * @property {string|null} [status] FileSyncIsOnDiskReplyBody status
         */

        /**
         * Constructs a new FileSyncIsOnDiskReplyBody.
         * @memberof file
         * @classdesc Represents a FileSyncIsOnDiskReplyBody.
         * @implements IFileSyncIsOnDiskReplyBody
         * @constructor
         * @param {file.IFileSyncIsOnDiskReplyBody=} [properties] Properties to set
         */
        function FileSyncIsOnDiskReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileSyncIsOnDiskReplyBody status.
         * @member {string} status
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @instance
         */
        FileSyncIsOnDiskReplyBody.prototype.status = "";

        /**
         * Creates a new FileSyncIsOnDiskReplyBody instance using the specified properties.
         * @function create
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {file.IFileSyncIsOnDiskReplyBody=} [properties] Properties to set
         * @returns {file.FileSyncIsOnDiskReplyBody} FileSyncIsOnDiskReplyBody instance
         */
        FileSyncIsOnDiskReplyBody.create = function create(properties) {
            return new FileSyncIsOnDiskReplyBody(properties);
        };

        /**
         * Encodes the specified FileSyncIsOnDiskReplyBody message. Does not implicitly {@link file.FileSyncIsOnDiskReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {file.IFileSyncIsOnDiskReplyBody} message FileSyncIsOnDiskReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncIsOnDiskReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.status != null && Object.hasOwnProperty.call(message, "status"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.status);
            return writer;
        };

        /**
         * Encodes the specified FileSyncIsOnDiskReplyBody message, length delimited. Does not implicitly {@link file.FileSyncIsOnDiskReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {file.IFileSyncIsOnDiskReplyBody} message FileSyncIsOnDiskReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncIsOnDiskReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileSyncIsOnDiskReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileSyncIsOnDiskReplyBody} FileSyncIsOnDiskReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncIsOnDiskReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncIsOnDiskReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.status = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileSyncIsOnDiskReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.FileSyncIsOnDiskReplyBody} FileSyncIsOnDiskReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncIsOnDiskReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileSyncIsOnDiskReplyBody message.
         * @function verify
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileSyncIsOnDiskReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.status != null && Object.hasOwnProperty.call(message, "status"))
                if (!$util.isString(message.status))
                    return "status: string expected";
            return null;
        };

        /**
         * Creates a FileSyncIsOnDiskReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileSyncIsOnDiskReplyBody} FileSyncIsOnDiskReplyBody
         */
        FileSyncIsOnDiskReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.FileSyncIsOnDiskReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.FileSyncIsOnDiskReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.FileSyncIsOnDiskReplyBody();
            if (object.status != null)
                message.status = String(object.status);
            return message;
        };

        /**
         * Creates a plain object from a FileSyncIsOnDiskReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {file.FileSyncIsOnDiskReplyBody} message FileSyncIsOnDiskReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileSyncIsOnDiskReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.status = "";
            if (message.status != null && Object.hasOwnProperty.call(message, "status"))
                object.status = message.status;
            return object;
        };

        /**
         * Converts this FileSyncIsOnDiskReplyBody to JSON.
         * @function toJSON
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileSyncIsOnDiskReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileSyncIsOnDiskReplyBody
         * @function getTypeUrl
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileSyncIsOnDiskReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.FileSyncIsOnDiskReplyBody";
        };

        return FileSyncIsOnDiskReplyBody;
    })();

    file.FileSyncStartDownloadRequestBody = (function() {

        /**
         * Properties of a FileSyncStartDownloadRequestBody.
         * @memberof file
         * @interface IFileSyncStartDownloadRequestBody
         * @property {number|Long|null} [version] FileSyncStartDownloadRequestBody version
         */

        /**
         * Constructs a new FileSyncStartDownloadRequestBody.
         * @memberof file
         * @classdesc Represents a FileSyncStartDownloadRequestBody.
         * @implements IFileSyncStartDownloadRequestBody
         * @constructor
         * @param {file.IFileSyncStartDownloadRequestBody=} [properties] Properties to set
         */
        function FileSyncStartDownloadRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileSyncStartDownloadRequestBody version.
         * @member {number|Long} version
         * @memberof file.FileSyncStartDownloadRequestBody
         * @instance
         */
        FileSyncStartDownloadRequestBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new FileSyncStartDownloadRequestBody instance using the specified properties.
         * @function create
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {file.IFileSyncStartDownloadRequestBody=} [properties] Properties to set
         * @returns {file.FileSyncStartDownloadRequestBody} FileSyncStartDownloadRequestBody instance
         */
        FileSyncStartDownloadRequestBody.create = function create(properties) {
            return new FileSyncStartDownloadRequestBody(properties);
        };

        /**
         * Encodes the specified FileSyncStartDownloadRequestBody message. Does not implicitly {@link file.FileSyncStartDownloadRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {file.IFileSyncStartDownloadRequestBody} message FileSyncStartDownloadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncStartDownloadRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            return writer;
        };

        /**
         * Encodes the specified FileSyncStartDownloadRequestBody message, length delimited. Does not implicitly {@link file.FileSyncStartDownloadRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {file.IFileSyncStartDownloadRequestBody} message FileSyncStartDownloadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncStartDownloadRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileSyncStartDownloadRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileSyncStartDownloadRequestBody} FileSyncStartDownloadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncStartDownloadRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncStartDownloadRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileSyncStartDownloadRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.FileSyncStartDownloadRequestBody} FileSyncStartDownloadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncStartDownloadRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileSyncStartDownloadRequestBody message.
         * @function verify
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileSyncStartDownloadRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            return null;
        };

        /**
         * Creates a FileSyncStartDownloadRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileSyncStartDownloadRequestBody} FileSyncStartDownloadRequestBody
         */
        FileSyncStartDownloadRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.FileSyncStartDownloadRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.FileSyncStartDownloadRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.FileSyncStartDownloadRequestBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from a FileSyncStartDownloadRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {file.FileSyncStartDownloadRequestBody} message FileSyncStartDownloadRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileSyncStartDownloadRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            return object;
        };

        /**
         * Converts this FileSyncStartDownloadRequestBody to JSON.
         * @function toJSON
         * @memberof file.FileSyncStartDownloadRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileSyncStartDownloadRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileSyncStartDownloadRequestBody
         * @function getTypeUrl
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileSyncStartDownloadRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.FileSyncStartDownloadRequestBody";
        };

        return FileSyncStartDownloadRequestBody;
    })();

    file.FileSyncStartDownloadReplyBody = (function() {

        /**
         * Properties of a FileSyncStartDownloadReplyBody.
         * @memberof file
         * @interface IFileSyncStartDownloadReplyBody
         * @property {file.FileSyncStartDownloadReplyBody.IDownloadInfo|null} [startedDownload] FileSyncStartDownloadReplyBody startedDownload
         */

        /**
         * Constructs a new FileSyncStartDownloadReplyBody.
         * @memberof file
         * @classdesc Represents a FileSyncStartDownloadReplyBody.
         * @implements IFileSyncStartDownloadReplyBody
         * @constructor
         * @param {file.IFileSyncStartDownloadReplyBody=} [properties] Properties to set
         */
        function FileSyncStartDownloadReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileSyncStartDownloadReplyBody startedDownload.
         * @member {file.FileSyncStartDownloadReplyBody.IDownloadInfo|null|undefined} startedDownload
         * @memberof file.FileSyncStartDownloadReplyBody
         * @instance
         */
        FileSyncStartDownloadReplyBody.prototype.startedDownload = null;

        /**
         * Creates a new FileSyncStartDownloadReplyBody instance using the specified properties.
         * @function create
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {file.IFileSyncStartDownloadReplyBody=} [properties] Properties to set
         * @returns {file.FileSyncStartDownloadReplyBody} FileSyncStartDownloadReplyBody instance
         */
        FileSyncStartDownloadReplyBody.create = function create(properties) {
            return new FileSyncStartDownloadReplyBody(properties);
        };

        /**
         * Encodes the specified FileSyncStartDownloadReplyBody message. Does not implicitly {@link file.FileSyncStartDownloadReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {file.IFileSyncStartDownloadReplyBody} message FileSyncStartDownloadReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncStartDownloadReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.startedDownload != null && Object.hasOwnProperty.call(message, "startedDownload"))
                $root.file.FileSyncStartDownloadReplyBody.DownloadInfo.encode(message.startedDownload, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FileSyncStartDownloadReplyBody message, length delimited. Does not implicitly {@link file.FileSyncStartDownloadReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {file.IFileSyncStartDownloadReplyBody} message FileSyncStartDownloadReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncStartDownloadReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileSyncStartDownloadReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileSyncStartDownloadReplyBody} FileSyncStartDownloadReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncStartDownloadReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncStartDownloadReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.startedDownload = $root.file.FileSyncStartDownloadReplyBody.DownloadInfo.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileSyncStartDownloadReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.FileSyncStartDownloadReplyBody} FileSyncStartDownloadReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncStartDownloadReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileSyncStartDownloadReplyBody message.
         * @function verify
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileSyncStartDownloadReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.startedDownload != null && Object.hasOwnProperty.call(message, "startedDownload")) {
                var error = $root.file.FileSyncStartDownloadReplyBody.DownloadInfo.verify(message.startedDownload, long + 1);
                if (error)
                    return "startedDownload." + error;
            }
            return null;
        };

        /**
         * Creates a FileSyncStartDownloadReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileSyncStartDownloadReplyBody} FileSyncStartDownloadReplyBody
         */
        FileSyncStartDownloadReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.FileSyncStartDownloadReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.FileSyncStartDownloadReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.FileSyncStartDownloadReplyBody();
            if (object.startedDownload != null) {
                if (!$util.isObject(object.startedDownload))
                    throw TypeError(".file.FileSyncStartDownloadReplyBody.startedDownload: object expected");
                message.startedDownload = $root.file.FileSyncStartDownloadReplyBody.DownloadInfo.fromObject(object.startedDownload, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a FileSyncStartDownloadReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {file.FileSyncStartDownloadReplyBody} message FileSyncStartDownloadReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileSyncStartDownloadReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.startedDownload = null;
            if (message.startedDownload != null && Object.hasOwnProperty.call(message, "startedDownload"))
                object.startedDownload = $root.file.FileSyncStartDownloadReplyBody.DownloadInfo.toObject(message.startedDownload, options, q + 1);
            return object;
        };

        /**
         * Converts this FileSyncStartDownloadReplyBody to JSON.
         * @function toJSON
         * @memberof file.FileSyncStartDownloadReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileSyncStartDownloadReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileSyncStartDownloadReplyBody
         * @function getTypeUrl
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileSyncStartDownloadReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.FileSyncStartDownloadReplyBody";
        };

        FileSyncStartDownloadReplyBody.DownloadInfo = (function() {

            /**
             * Properties of a DownloadInfo.
             * @memberof file.FileSyncStartDownloadReplyBody
             * @interface IDownloadInfo
             * @property {number|Long|null} [downloadTaskId] DownloadInfo downloadTaskId
             */

            /**
             * Constructs a new DownloadInfo.
             * @memberof file.FileSyncStartDownloadReplyBody
             * @classdesc Represents a DownloadInfo.
             * @implements IDownloadInfo
             * @constructor
             * @param {file.FileSyncStartDownloadReplyBody.IDownloadInfo=} [properties] Properties to set
             */
            function DownloadInfo(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * DownloadInfo downloadTaskId.
             * @member {number|Long} downloadTaskId
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @instance
             */
            DownloadInfo.prototype.downloadTaskId = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

            /**
             * Creates a new DownloadInfo instance using the specified properties.
             * @function create
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {file.FileSyncStartDownloadReplyBody.IDownloadInfo=} [properties] Properties to set
             * @returns {file.FileSyncStartDownloadReplyBody.DownloadInfo} DownloadInfo instance
             */
            DownloadInfo.create = function create(properties) {
                return new DownloadInfo(properties);
            };

            /**
             * Encodes the specified DownloadInfo message. Does not implicitly {@link file.FileSyncStartDownloadReplyBody.DownloadInfo.verify|verify} messages.
             * @function encode
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {file.FileSyncStartDownloadReplyBody.IDownloadInfo} message DownloadInfo message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            DownloadInfo.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.downloadTaskId != null && Object.hasOwnProperty.call(message, "downloadTaskId"))
                    writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.downloadTaskId);
                return writer;
            };

            /**
             * Encodes the specified DownloadInfo message, length delimited. Does not implicitly {@link file.FileSyncStartDownloadReplyBody.DownloadInfo.verify|verify} messages.
             * @function encodeDelimited
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {file.FileSyncStartDownloadReplyBody.IDownloadInfo} message DownloadInfo message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            DownloadInfo.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes a DownloadInfo message from the specified reader or buffer.
             * @function decode
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {file.FileSyncStartDownloadReplyBody.DownloadInfo} DownloadInfo
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            DownloadInfo.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncStartDownloadReplyBody.DownloadInfo();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 2: {
                            message.downloadTaskId = reader.uint64();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a DownloadInfo message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {file.FileSyncStartDownloadReplyBody.DownloadInfo} DownloadInfo
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            DownloadInfo.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a DownloadInfo message.
             * @function verify
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            DownloadInfo.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.downloadTaskId != null && Object.hasOwnProperty.call(message, "downloadTaskId"))
                    if (!$util.isInteger(message.downloadTaskId) && !(message.downloadTaskId && $util.isInteger(message.downloadTaskId.low) && $util.isInteger(message.downloadTaskId.high)))
                        return "downloadTaskId: integer|Long expected";
                return null;
            };

            /**
             * Creates a DownloadInfo message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {file.FileSyncStartDownloadReplyBody.DownloadInfo} DownloadInfo
             */
            DownloadInfo.fromObject = function fromObject(object, long) {
                if (object instanceof $root.file.FileSyncStartDownloadReplyBody.DownloadInfo)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".file.FileSyncStartDownloadReplyBody.DownloadInfo: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.file.FileSyncStartDownloadReplyBody.DownloadInfo();
                if (object.downloadTaskId != null)
                    if ($util.Long)
                        message.downloadTaskId = $util.Long.fromValue(object.downloadTaskId, true);
                    else if (typeof object.downloadTaskId === "string")
                        message.downloadTaskId = parseInt(object.downloadTaskId, 10);
                    else if (typeof object.downloadTaskId === "number")
                        message.downloadTaskId = object.downloadTaskId;
                    else if (typeof object.downloadTaskId === "object")
                        message.downloadTaskId = new $util.LongBits(object.downloadTaskId.low >>> 0, object.downloadTaskId.high >>> 0).toNumber(true);
                return message;
            };

            /**
             * Creates a plain object from a DownloadInfo message. Also converts values to other types if specified.
             * @function toObject
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {file.FileSyncStartDownloadReplyBody.DownloadInfo} message DownloadInfo
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            DownloadInfo.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults)
                    if ($util.Long) {
                        var long = new $util.Long(0, 0, true);
                        object.downloadTaskId = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                    } else
                        object.downloadTaskId = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                if (message.downloadTaskId != null && Object.hasOwnProperty.call(message, "downloadTaskId"))
                    if (typeof BigInt !== "undefined" && options.longs === BigInt)
                        object.downloadTaskId = typeof message.downloadTaskId === "number" ? BigInt(message.downloadTaskId) : $util.Long.fromBits(message.downloadTaskId.low >>> 0, message.downloadTaskId.high >>> 0, true).toBigInt();
                    else if (typeof message.downloadTaskId === "number")
                        object.downloadTaskId = options.longs === String ? String(message.downloadTaskId) : message.downloadTaskId;
                    else
                        object.downloadTaskId = options.longs === String ? $util.Long.prototype.toString.call(message.downloadTaskId) : options.longs === Number ? new $util.LongBits(message.downloadTaskId.low >>> 0, message.downloadTaskId.high >>> 0).toNumber(true) : message.downloadTaskId;
                return object;
            };

            /**
             * Converts this DownloadInfo to JSON.
             * @function toJSON
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            DownloadInfo.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for DownloadInfo
             * @function getTypeUrl
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            DownloadInfo.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/file.FileSyncStartDownloadReplyBody.DownloadInfo";
            };

            return DownloadInfo;
        })();

        return FileSyncStartDownloadReplyBody;
    })();

    file.AdoptRemoteRequestBody = (function() {

        /**
         * Properties of an AdoptRemoteRequestBody.
         * @memberof file
         * @interface IAdoptRemoteRequestBody
         * @property {file.IOptionsToAdopteRemote|null} [opts] AdoptRemoteRequestBody opts
         */

        /**
         * Constructs a new AdoptRemoteRequestBody.
         * @memberof file
         * @classdesc Represents an AdoptRemoteRequestBody.
         * @implements IAdoptRemoteRequestBody
         * @constructor
         * @param {file.IAdoptRemoteRequestBody=} [properties] Properties to set
         */
        function AdoptRemoteRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * AdoptRemoteRequestBody opts.
         * @member {file.IOptionsToAdopteRemote|null|undefined} opts
         * @memberof file.AdoptRemoteRequestBody
         * @instance
         */
        AdoptRemoteRequestBody.prototype.opts = null;

        /**
         * Creates a new AdoptRemoteRequestBody instance using the specified properties.
         * @function create
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {file.IAdoptRemoteRequestBody=} [properties] Properties to set
         * @returns {file.AdoptRemoteRequestBody} AdoptRemoteRequestBody instance
         */
        AdoptRemoteRequestBody.create = function create(properties) {
            return new AdoptRemoteRequestBody(properties);
        };

        /**
         * Encodes the specified AdoptRemoteRequestBody message. Does not implicitly {@link file.AdoptRemoteRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {file.IAdoptRemoteRequestBody} message AdoptRemoteRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AdoptRemoteRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.file.OptionsToAdopteRemote.encode(message.opts, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified AdoptRemoteRequestBody message, length delimited. Does not implicitly {@link file.AdoptRemoteRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {file.IAdoptRemoteRequestBody} message AdoptRemoteRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AdoptRemoteRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an AdoptRemoteRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.AdoptRemoteRequestBody} AdoptRemoteRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AdoptRemoteRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.AdoptRemoteRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.opts = $root.file.OptionsToAdopteRemote.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an AdoptRemoteRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.AdoptRemoteRequestBody} AdoptRemoteRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AdoptRemoteRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an AdoptRemoteRequestBody message.
         * @function verify
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        AdoptRemoteRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts")) {
                var error = $root.file.OptionsToAdopteRemote.verify(message.opts, long + 1);
                if (error)
                    return "opts." + error;
            }
            return null;
        };

        /**
         * Creates an AdoptRemoteRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.AdoptRemoteRequestBody} AdoptRemoteRequestBody
         */
        AdoptRemoteRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.AdoptRemoteRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.AdoptRemoteRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.AdoptRemoteRequestBody();
            if (object.opts != null) {
                if (!$util.isObject(object.opts))
                    throw TypeError(".file.AdoptRemoteRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToAdopteRemote.fromObject(object.opts, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an AdoptRemoteRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {file.AdoptRemoteRequestBody} message AdoptRemoteRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        AdoptRemoteRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.opts = null;
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                object.opts = $root.file.OptionsToAdopteRemote.toObject(message.opts, options, q + 1);
            return object;
        };

        /**
         * Converts this AdoptRemoteRequestBody to JSON.
         * @function toJSON
         * @memberof file.AdoptRemoteRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        AdoptRemoteRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for AdoptRemoteRequestBody
         * @function getTypeUrl
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        AdoptRemoteRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.AdoptRemoteRequestBody";
        };

        return AdoptRemoteRequestBody;
    })();

    file.OptionsToAdopteRemote = (function() {

        /**
         * Properties of an OptionsToAdopteRemote.
         * @memberof file
         * @interface IOptionsToAdopteRemote
         * @property {common.IBooleanValue|null} [dropLocalVer] OptionsToAdopteRemote dropLocalVer
         * @property {common.IUInt64Value|null} [remoteVersion] OptionsToAdopteRemote remoteVersion
         */

        /**
         * Constructs a new OptionsToAdopteRemote.
         * @memberof file
         * @classdesc Represents an OptionsToAdopteRemote.
         * @implements IOptionsToAdopteRemote
         * @constructor
         * @param {file.IOptionsToAdopteRemote=} [properties] Properties to set
         */
        function OptionsToAdopteRemote(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * OptionsToAdopteRemote dropLocalVer.
         * @member {common.IBooleanValue|null|undefined} dropLocalVer
         * @memberof file.OptionsToAdopteRemote
         * @instance
         */
        OptionsToAdopteRemote.prototype.dropLocalVer = null;

        /**
         * OptionsToAdopteRemote remoteVersion.
         * @member {common.IUInt64Value|null|undefined} remoteVersion
         * @memberof file.OptionsToAdopteRemote
         * @instance
         */
        OptionsToAdopteRemote.prototype.remoteVersion = null;

        /**
         * Creates a new OptionsToAdopteRemote instance using the specified properties.
         * @function create
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {file.IOptionsToAdopteRemote=} [properties] Properties to set
         * @returns {file.OptionsToAdopteRemote} OptionsToAdopteRemote instance
         */
        OptionsToAdopteRemote.create = function create(properties) {
            return new OptionsToAdopteRemote(properties);
        };

        /**
         * Encodes the specified OptionsToAdopteRemote message. Does not implicitly {@link file.OptionsToAdopteRemote.verify|verify} messages.
         * @function encode
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {file.IOptionsToAdopteRemote} message OptionsToAdopteRemote message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        OptionsToAdopteRemote.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.dropLocalVer != null && Object.hasOwnProperty.call(message, "dropLocalVer"))
                $root.common.BooleanValue.encode(message.dropLocalVer, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified OptionsToAdopteRemote message, length delimited. Does not implicitly {@link file.OptionsToAdopteRemote.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {file.IOptionsToAdopteRemote} message OptionsToAdopteRemote message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        OptionsToAdopteRemote.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an OptionsToAdopteRemote message from the specified reader or buffer.
         * @function decode
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.OptionsToAdopteRemote} OptionsToAdopteRemote
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        OptionsToAdopteRemote.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.OptionsToAdopteRemote();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.dropLocalVer = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an OptionsToAdopteRemote message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.OptionsToAdopteRemote} OptionsToAdopteRemote
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        OptionsToAdopteRemote.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an OptionsToAdopteRemote message.
         * @function verify
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        OptionsToAdopteRemote.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.dropLocalVer != null && Object.hasOwnProperty.call(message, "dropLocalVer")) {
                var error = $root.common.BooleanValue.verify(message.dropLocalVer, long + 1);
                if (error)
                    return "dropLocalVer." + error;
            }
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion, long + 1);
                if (error)
                    return "remoteVersion." + error;
            }
            return null;
        };

        /**
         * Creates an OptionsToAdopteRemote message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.OptionsToAdopteRemote} OptionsToAdopteRemote
         */
        OptionsToAdopteRemote.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.OptionsToAdopteRemote)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.OptionsToAdopteRemote: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.OptionsToAdopteRemote();
            if (object.dropLocalVer != null) {
                if (!$util.isObject(object.dropLocalVer))
                    throw TypeError(".file.OptionsToAdopteRemote.dropLocalVer: object expected");
                message.dropLocalVer = $root.common.BooleanValue.fromObject(object.dropLocalVer, long + 1);
            }
            if (object.remoteVersion != null) {
                if (!$util.isObject(object.remoteVersion))
                    throw TypeError(".file.OptionsToAdopteRemote.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an OptionsToAdopteRemote message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {file.OptionsToAdopteRemote} message OptionsToAdopteRemote
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        OptionsToAdopteRemote.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.dropLocalVer = null;
                object.remoteVersion = null;
            }
            if (message.dropLocalVer != null && Object.hasOwnProperty.call(message, "dropLocalVer"))
                object.dropLocalVer = $root.common.BooleanValue.toObject(message.dropLocalVer, options, q + 1);
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options, q + 1);
            return object;
        };

        /**
         * Converts this OptionsToAdopteRemote to JSON.
         * @function toJSON
         * @memberof file.OptionsToAdopteRemote
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        OptionsToAdopteRemote.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for OptionsToAdopteRemote
         * @function getTypeUrl
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        OptionsToAdopteRemote.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.OptionsToAdopteRemote";
        };

        return OptionsToAdopteRemote;
    })();

    file.DiffCurrentAndRemoteRequestBody = (function() {

        /**
         * Properties of a DiffCurrentAndRemoteRequestBody.
         * @memberof file
         * @interface IDiffCurrentAndRemoteRequestBody
         * @property {file.IOptionsToDiffFileVersions|null} [opts] DiffCurrentAndRemoteRequestBody opts
         */

        /**
         * Constructs a new DiffCurrentAndRemoteRequestBody.
         * @memberof file
         * @classdesc Represents a DiffCurrentAndRemoteRequestBody.
         * @implements IDiffCurrentAndRemoteRequestBody
         * @constructor
         * @param {file.IDiffCurrentAndRemoteRequestBody=} [properties] Properties to set
         */
        function DiffCurrentAndRemoteRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * DiffCurrentAndRemoteRequestBody opts.
         * @member {file.IOptionsToDiffFileVersions|null|undefined} opts
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @instance
         */
        DiffCurrentAndRemoteRequestBody.prototype.opts = null;

        /**
         * Creates a new DiffCurrentAndRemoteRequestBody instance using the specified properties.
         * @function create
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {file.IDiffCurrentAndRemoteRequestBody=} [properties] Properties to set
         * @returns {file.DiffCurrentAndRemoteRequestBody} DiffCurrentAndRemoteRequestBody instance
         */
        DiffCurrentAndRemoteRequestBody.create = function create(properties) {
            return new DiffCurrentAndRemoteRequestBody(properties);
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteRequestBody message. Does not implicitly {@link file.DiffCurrentAndRemoteRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {file.IDiffCurrentAndRemoteRequestBody} message DiffCurrentAndRemoteRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.file.OptionsToDiffFileVersions.encode(message.opts, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteRequestBody message, length delimited. Does not implicitly {@link file.DiffCurrentAndRemoteRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {file.IDiffCurrentAndRemoteRequestBody} message DiffCurrentAndRemoteRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a DiffCurrentAndRemoteRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.DiffCurrentAndRemoteRequestBody} DiffCurrentAndRemoteRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.DiffCurrentAndRemoteRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.opts = $root.file.OptionsToDiffFileVersions.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a DiffCurrentAndRemoteRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.DiffCurrentAndRemoteRequestBody} DiffCurrentAndRemoteRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a DiffCurrentAndRemoteRequestBody message.
         * @function verify
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        DiffCurrentAndRemoteRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts")) {
                var error = $root.file.OptionsToDiffFileVersions.verify(message.opts, long + 1);
                if (error)
                    return "opts." + error;
            }
            return null;
        };

        /**
         * Creates a DiffCurrentAndRemoteRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.DiffCurrentAndRemoteRequestBody} DiffCurrentAndRemoteRequestBody
         */
        DiffCurrentAndRemoteRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.DiffCurrentAndRemoteRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.DiffCurrentAndRemoteRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.DiffCurrentAndRemoteRequestBody();
            if (object.opts != null) {
                if (!$util.isObject(object.opts))
                    throw TypeError(".file.DiffCurrentAndRemoteRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToDiffFileVersions.fromObject(object.opts, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a DiffCurrentAndRemoteRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {file.DiffCurrentAndRemoteRequestBody} message DiffCurrentAndRemoteRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        DiffCurrentAndRemoteRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.opts = null;
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                object.opts = $root.file.OptionsToDiffFileVersions.toObject(message.opts, options, q + 1);
            return object;
        };

        /**
         * Converts this DiffCurrentAndRemoteRequestBody to JSON.
         * @function toJSON
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        DiffCurrentAndRemoteRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for DiffCurrentAndRemoteRequestBody
         * @function getTypeUrl
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        DiffCurrentAndRemoteRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.DiffCurrentAndRemoteRequestBody";
        };

        return DiffCurrentAndRemoteRequestBody;
    })();

    file.DiffCurrentAndRemoteReplyBody = (function() {

        /**
         * Properties of a DiffCurrentAndRemoteReplyBody.
         * @memberof file
         * @interface IDiffCurrentAndRemoteReplyBody
         * @property {file.IFileDiff|null} [diff] DiffCurrentAndRemoteReplyBody diff
         */

        /**
         * Constructs a new DiffCurrentAndRemoteReplyBody.
         * @memberof file
         * @classdesc Represents a DiffCurrentAndRemoteReplyBody.
         * @implements IDiffCurrentAndRemoteReplyBody
         * @constructor
         * @param {file.IDiffCurrentAndRemoteReplyBody=} [properties] Properties to set
         */
        function DiffCurrentAndRemoteReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * DiffCurrentAndRemoteReplyBody diff.
         * @member {file.IFileDiff|null|undefined} diff
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @instance
         */
        DiffCurrentAndRemoteReplyBody.prototype.diff = null;

        /**
         * Creates a new DiffCurrentAndRemoteReplyBody instance using the specified properties.
         * @function create
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {file.IDiffCurrentAndRemoteReplyBody=} [properties] Properties to set
         * @returns {file.DiffCurrentAndRemoteReplyBody} DiffCurrentAndRemoteReplyBody instance
         */
        DiffCurrentAndRemoteReplyBody.create = function create(properties) {
            return new DiffCurrentAndRemoteReplyBody(properties);
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteReplyBody message. Does not implicitly {@link file.DiffCurrentAndRemoteReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {file.IDiffCurrentAndRemoteReplyBody} message DiffCurrentAndRemoteReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.diff != null && Object.hasOwnProperty.call(message, "diff"))
                $root.file.FileDiff.encode(message.diff, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteReplyBody message, length delimited. Does not implicitly {@link file.DiffCurrentAndRemoteReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {file.IDiffCurrentAndRemoteReplyBody} message DiffCurrentAndRemoteReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a DiffCurrentAndRemoteReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.DiffCurrentAndRemoteReplyBody} DiffCurrentAndRemoteReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.DiffCurrentAndRemoteReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.diff = $root.file.FileDiff.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a DiffCurrentAndRemoteReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.DiffCurrentAndRemoteReplyBody} DiffCurrentAndRemoteReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a DiffCurrentAndRemoteReplyBody message.
         * @function verify
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        DiffCurrentAndRemoteReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.diff != null && Object.hasOwnProperty.call(message, "diff")) {
                var error = $root.file.FileDiff.verify(message.diff, long + 1);
                if (error)
                    return "diff." + error;
            }
            return null;
        };

        /**
         * Creates a DiffCurrentAndRemoteReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.DiffCurrentAndRemoteReplyBody} DiffCurrentAndRemoteReplyBody
         */
        DiffCurrentAndRemoteReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.DiffCurrentAndRemoteReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.DiffCurrentAndRemoteReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.DiffCurrentAndRemoteReplyBody();
            if (object.diff != null) {
                if (!$util.isObject(object.diff))
                    throw TypeError(".file.DiffCurrentAndRemoteReplyBody.diff: object expected");
                message.diff = $root.file.FileDiff.fromObject(object.diff, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a DiffCurrentAndRemoteReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {file.DiffCurrentAndRemoteReplyBody} message DiffCurrentAndRemoteReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        DiffCurrentAndRemoteReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.diff = null;
            if (message.diff != null && Object.hasOwnProperty.call(message, "diff"))
                object.diff = $root.file.FileDiff.toObject(message.diff, options, q + 1);
            return object;
        };

        /**
         * Converts this DiffCurrentAndRemoteReplyBody to JSON.
         * @function toJSON
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        DiffCurrentAndRemoteReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for DiffCurrentAndRemoteReplyBody
         * @function getTypeUrl
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        DiffCurrentAndRemoteReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.DiffCurrentAndRemoteReplyBody";
        };

        return DiffCurrentAndRemoteReplyBody;
    })();

    file.OptionsToDiffFileVersions = (function() {

        /**
         * Properties of an OptionsToDiffFileVersions.
         * @memberof file
         * @interface IOptionsToDiffFileVersions
         * @property {common.IUInt64Value|null} [remoteVersion] OptionsToDiffFileVersions remoteVersion
         * @property {common.IBooleanValue|null} [compareContentIfSameMTime] OptionsToDiffFileVersions compareContentIfSameMTime
         */

        /**
         * Constructs a new OptionsToDiffFileVersions.
         * @memberof file
         * @classdesc Represents an OptionsToDiffFileVersions.
         * @implements IOptionsToDiffFileVersions
         * @constructor
         * @param {file.IOptionsToDiffFileVersions=} [properties] Properties to set
         */
        function OptionsToDiffFileVersions(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * OptionsToDiffFileVersions remoteVersion.
         * @member {common.IUInt64Value|null|undefined} remoteVersion
         * @memberof file.OptionsToDiffFileVersions
         * @instance
         */
        OptionsToDiffFileVersions.prototype.remoteVersion = null;

        /**
         * OptionsToDiffFileVersions compareContentIfSameMTime.
         * @member {common.IBooleanValue|null|undefined} compareContentIfSameMTime
         * @memberof file.OptionsToDiffFileVersions
         * @instance
         */
        OptionsToDiffFileVersions.prototype.compareContentIfSameMTime = null;

        /**
         * Creates a new OptionsToDiffFileVersions instance using the specified properties.
         * @function create
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {file.IOptionsToDiffFileVersions=} [properties] Properties to set
         * @returns {file.OptionsToDiffFileVersions} OptionsToDiffFileVersions instance
         */
        OptionsToDiffFileVersions.create = function create(properties) {
            return new OptionsToDiffFileVersions(properties);
        };

        /**
         * Encodes the specified OptionsToDiffFileVersions message. Does not implicitly {@link file.OptionsToDiffFileVersions.verify|verify} messages.
         * @function encode
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {file.IOptionsToDiffFileVersions} message OptionsToDiffFileVersions message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        OptionsToDiffFileVersions.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.compareContentIfSameMTime != null && Object.hasOwnProperty.call(message, "compareContentIfSameMTime"))
                $root.common.BooleanValue.encode(message.compareContentIfSameMTime, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified OptionsToDiffFileVersions message, length delimited. Does not implicitly {@link file.OptionsToDiffFileVersions.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {file.IOptionsToDiffFileVersions} message OptionsToDiffFileVersions message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        OptionsToDiffFileVersions.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an OptionsToDiffFileVersions message from the specified reader or buffer.
         * @function decode
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.OptionsToDiffFileVersions} OptionsToDiffFileVersions
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        OptionsToDiffFileVersions.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.OptionsToDiffFileVersions();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.compareContentIfSameMTime = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an OptionsToDiffFileVersions message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.OptionsToDiffFileVersions} OptionsToDiffFileVersions
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        OptionsToDiffFileVersions.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an OptionsToDiffFileVersions message.
         * @function verify
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        OptionsToDiffFileVersions.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion, long + 1);
                if (error)
                    return "remoteVersion." + error;
            }
            if (message.compareContentIfSameMTime != null && Object.hasOwnProperty.call(message, "compareContentIfSameMTime")) {
                var error = $root.common.BooleanValue.verify(message.compareContentIfSameMTime, long + 1);
                if (error)
                    return "compareContentIfSameMTime." + error;
            }
            return null;
        };

        /**
         * Creates an OptionsToDiffFileVersions message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.OptionsToDiffFileVersions} OptionsToDiffFileVersions
         */
        OptionsToDiffFileVersions.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.OptionsToDiffFileVersions)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.OptionsToDiffFileVersions: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.OptionsToDiffFileVersions();
            if (object.remoteVersion != null) {
                if (!$util.isObject(object.remoteVersion))
                    throw TypeError(".file.OptionsToDiffFileVersions.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion, long + 1);
            }
            if (object.compareContentIfSameMTime != null) {
                if (!$util.isObject(object.compareContentIfSameMTime))
                    throw TypeError(".file.OptionsToDiffFileVersions.compareContentIfSameMTime: object expected");
                message.compareContentIfSameMTime = $root.common.BooleanValue.fromObject(object.compareContentIfSameMTime, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an OptionsToDiffFileVersions message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {file.OptionsToDiffFileVersions} message OptionsToDiffFileVersions
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        OptionsToDiffFileVersions.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.remoteVersion = null;
                object.compareContentIfSameMTime = null;
            }
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options, q + 1);
            if (message.compareContentIfSameMTime != null && Object.hasOwnProperty.call(message, "compareContentIfSameMTime"))
                object.compareContentIfSameMTime = $root.common.BooleanValue.toObject(message.compareContentIfSameMTime, options, q + 1);
            return object;
        };

        /**
         * Converts this OptionsToDiffFileVersions to JSON.
         * @function toJSON
         * @memberof file.OptionsToDiffFileVersions
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        OptionsToDiffFileVersions.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for OptionsToDiffFileVersions
         * @function getTypeUrl
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        OptionsToDiffFileVersions.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.OptionsToDiffFileVersions";
        };

        return OptionsToDiffFileVersions;
    })();

    file.TimeStampsDiff = (function() {

        /**
         * Properties of a TimeStampsDiff.
         * @memberof file
         * @interface ITimeStampsDiff
         * @property {number|Long|null} [current] TimeStampsDiff current
         * @property {number|Long|null} [remote] TimeStampsDiff remote
         * @property {number|Long|null} [synced] TimeStampsDiff synced
         */

        /**
         * Constructs a new TimeStampsDiff.
         * @memberof file
         * @classdesc Represents a TimeStampsDiff.
         * @implements ITimeStampsDiff
         * @constructor
         * @param {file.ITimeStampsDiff=} [properties] Properties to set
         */
        function TimeStampsDiff(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * TimeStampsDiff current.
         * @member {number|Long} current
         * @memberof file.TimeStampsDiff
         * @instance
         */
        TimeStampsDiff.prototype.current = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * TimeStampsDiff remote.
         * @member {number|Long} remote
         * @memberof file.TimeStampsDiff
         * @instance
         */
        TimeStampsDiff.prototype.remote = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * TimeStampsDiff synced.
         * @member {number|Long} synced
         * @memberof file.TimeStampsDiff
         * @instance
         */
        TimeStampsDiff.prototype.synced = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new TimeStampsDiff instance using the specified properties.
         * @function create
         * @memberof file.TimeStampsDiff
         * @static
         * @param {file.ITimeStampsDiff=} [properties] Properties to set
         * @returns {file.TimeStampsDiff} TimeStampsDiff instance
         */
        TimeStampsDiff.create = function create(properties) {
            return new TimeStampsDiff(properties);
        };

        /**
         * Encodes the specified TimeStampsDiff message. Does not implicitly {@link file.TimeStampsDiff.verify|verify} messages.
         * @function encode
         * @memberof file.TimeStampsDiff
         * @static
         * @param {file.ITimeStampsDiff} message TimeStampsDiff message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        TimeStampsDiff.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.current);
            if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.remote);
            if (message.synced != null && Object.hasOwnProperty.call(message, "synced"))
                writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.synced);
            return writer;
        };

        /**
         * Encodes the specified TimeStampsDiff message, length delimited. Does not implicitly {@link file.TimeStampsDiff.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.TimeStampsDiff
         * @static
         * @param {file.ITimeStampsDiff} message TimeStampsDiff message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        TimeStampsDiff.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a TimeStampsDiff message from the specified reader or buffer.
         * @function decode
         * @memberof file.TimeStampsDiff
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.TimeStampsDiff} TimeStampsDiff
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        TimeStampsDiff.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.TimeStampsDiff();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.current = reader.uint64();
                        break;
                    }
                case 2: {
                        message.remote = reader.uint64();
                        break;
                    }
                case 3: {
                        message.synced = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a TimeStampsDiff message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.TimeStampsDiff
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.TimeStampsDiff} TimeStampsDiff
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        TimeStampsDiff.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a TimeStampsDiff message.
         * @function verify
         * @memberof file.TimeStampsDiff
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        TimeStampsDiff.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                if (!$util.isInteger(message.current) && !(message.current && $util.isInteger(message.current.low) && $util.isInteger(message.current.high)))
                    return "current: integer|Long expected";
            if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                if (!$util.isInteger(message.remote) && !(message.remote && $util.isInteger(message.remote.low) && $util.isInteger(message.remote.high)))
                    return "remote: integer|Long expected";
            if (message.synced != null && Object.hasOwnProperty.call(message, "synced"))
                if (!$util.isInteger(message.synced) && !(message.synced && $util.isInteger(message.synced.low) && $util.isInteger(message.synced.high)))
                    return "synced: integer|Long expected";
            return null;
        };

        /**
         * Creates a TimeStampsDiff message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.TimeStampsDiff
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.TimeStampsDiff} TimeStampsDiff
         */
        TimeStampsDiff.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.TimeStampsDiff)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.TimeStampsDiff: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.TimeStampsDiff();
            if (object.current != null)
                if ($util.Long)
                    message.current = $util.Long.fromValue(object.current, true);
                else if (typeof object.current === "string")
                    message.current = parseInt(object.current, 10);
                else if (typeof object.current === "number")
                    message.current = object.current;
                else if (typeof object.current === "object")
                    message.current = new $util.LongBits(object.current.low >>> 0, object.current.high >>> 0).toNumber(true);
            if (object.remote != null)
                if ($util.Long)
                    message.remote = $util.Long.fromValue(object.remote, true);
                else if (typeof object.remote === "string")
                    message.remote = parseInt(object.remote, 10);
                else if (typeof object.remote === "number")
                    message.remote = object.remote;
                else if (typeof object.remote === "object")
                    message.remote = new $util.LongBits(object.remote.low >>> 0, object.remote.high >>> 0).toNumber(true);
            if (object.synced != null)
                if ($util.Long)
                    message.synced = $util.Long.fromValue(object.synced, true);
                else if (typeof object.synced === "string")
                    message.synced = parseInt(object.synced, 10);
                else if (typeof object.synced === "number")
                    message.synced = object.synced;
                else if (typeof object.synced === "object")
                    message.synced = new $util.LongBits(object.synced.low >>> 0, object.synced.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from a TimeStampsDiff message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.TimeStampsDiff
         * @static
         * @param {file.TimeStampsDiff} message TimeStampsDiff
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        TimeStampsDiff.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.current = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.current = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.remote = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.remote = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.synced = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.synced = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            }
            if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.current = typeof message.current === "number" ? BigInt(message.current) : $util.Long.fromBits(message.current.low >>> 0, message.current.high >>> 0, true).toBigInt();
                else if (typeof message.current === "number")
                    object.current = options.longs === String ? String(message.current) : message.current;
                else
                    object.current = options.longs === String ? $util.Long.prototype.toString.call(message.current) : options.longs === Number ? new $util.LongBits(message.current.low >>> 0, message.current.high >>> 0).toNumber(true) : message.current;
            if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.remote = typeof message.remote === "number" ? BigInt(message.remote) : $util.Long.fromBits(message.remote.low >>> 0, message.remote.high >>> 0, true).toBigInt();
                else if (typeof message.remote === "number")
                    object.remote = options.longs === String ? String(message.remote) : message.remote;
                else
                    object.remote = options.longs === String ? $util.Long.prototype.toString.call(message.remote) : options.longs === Number ? new $util.LongBits(message.remote.low >>> 0, message.remote.high >>> 0).toNumber(true) : message.remote;
            if (message.synced != null && Object.hasOwnProperty.call(message, "synced"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.synced = typeof message.synced === "number" ? BigInt(message.synced) : $util.Long.fromBits(message.synced.low >>> 0, message.synced.high >>> 0, true).toBigInt();
                else if (typeof message.synced === "number")
                    object.synced = options.longs === String ? String(message.synced) : message.synced;
                else
                    object.synced = options.longs === String ? $util.Long.prototype.toString.call(message.synced) : options.longs === Number ? new $util.LongBits(message.synced.low >>> 0, message.synced.high >>> 0).toNumber(true) : message.synced;
            return object;
        };

        /**
         * Converts this TimeStampsDiff to JSON.
         * @function toJSON
         * @memberof file.TimeStampsDiff
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        TimeStampsDiff.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for TimeStampsDiff
         * @function getTypeUrl
         * @memberof file.TimeStampsDiff
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        TimeStampsDiff.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.TimeStampsDiff";
        };

        return TimeStampsDiff;
    })();

    file.XAttrDiff = (function() {

        /**
         * Properties of a XAttrDiff.
         * @memberof file
         * @interface IXAttrDiff
         * @property {string|null} [name] XAttrDiff name
         * @property {common.IStringValue|null} [addedIn] XAttrDiff addedIn
         * @property {common.IStringValue|null} [removedIn] XAttrDiff removedIn
         * @property {common.IStringValue|null} [changedIn] XAttrDiff changedIn
         */

        /**
         * Constructs a new XAttrDiff.
         * @memberof file
         * @classdesc Represents a XAttrDiff.
         * @implements IXAttrDiff
         * @constructor
         * @param {file.IXAttrDiff=} [properties] Properties to set
         */
        function XAttrDiff(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * XAttrDiff name.
         * @member {string} name
         * @memberof file.XAttrDiff
         * @instance
         */
        XAttrDiff.prototype.name = "";

        /**
         * XAttrDiff addedIn.
         * @member {common.IStringValue|null|undefined} addedIn
         * @memberof file.XAttrDiff
         * @instance
         */
        XAttrDiff.prototype.addedIn = null;

        /**
         * XAttrDiff removedIn.
         * @member {common.IStringValue|null|undefined} removedIn
         * @memberof file.XAttrDiff
         * @instance
         */
        XAttrDiff.prototype.removedIn = null;

        /**
         * XAttrDiff changedIn.
         * @member {common.IStringValue|null|undefined} changedIn
         * @memberof file.XAttrDiff
         * @instance
         */
        XAttrDiff.prototype.changedIn = null;

        /**
         * Creates a new XAttrDiff instance using the specified properties.
         * @function create
         * @memberof file.XAttrDiff
         * @static
         * @param {file.IXAttrDiff=} [properties] Properties to set
         * @returns {file.XAttrDiff} XAttrDiff instance
         */
        XAttrDiff.create = function create(properties) {
            return new XAttrDiff(properties);
        };

        /**
         * Encodes the specified XAttrDiff message. Does not implicitly {@link file.XAttrDiff.verify|verify} messages.
         * @function encode
         * @memberof file.XAttrDiff
         * @static
         * @param {file.IXAttrDiff} message XAttrDiff message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        XAttrDiff.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
            if (message.addedIn != null && Object.hasOwnProperty.call(message, "addedIn"))
                $root.common.StringValue.encode(message.addedIn, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.removedIn != null && Object.hasOwnProperty.call(message, "removedIn"))
                $root.common.StringValue.encode(message.removedIn, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.changedIn != null && Object.hasOwnProperty.call(message, "changedIn"))
                $root.common.StringValue.encode(message.changedIn, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified XAttrDiff message, length delimited. Does not implicitly {@link file.XAttrDiff.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.XAttrDiff
         * @static
         * @param {file.IXAttrDiff} message XAttrDiff message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        XAttrDiff.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a XAttrDiff message from the specified reader or buffer.
         * @function decode
         * @memberof file.XAttrDiff
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.XAttrDiff} XAttrDiff
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        XAttrDiff.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.XAttrDiff();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.name = reader.string();
                        break;
                    }
                case 2: {
                        message.addedIn = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.removedIn = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.changedIn = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a XAttrDiff message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.XAttrDiff
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.XAttrDiff} XAttrDiff
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        XAttrDiff.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a XAttrDiff message.
         * @function verify
         * @memberof file.XAttrDiff
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        XAttrDiff.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.addedIn != null && Object.hasOwnProperty.call(message, "addedIn")) {
                var error = $root.common.StringValue.verify(message.addedIn, long + 1);
                if (error)
                    return "addedIn." + error;
            }
            if (message.removedIn != null && Object.hasOwnProperty.call(message, "removedIn")) {
                var error = $root.common.StringValue.verify(message.removedIn, long + 1);
                if (error)
                    return "removedIn." + error;
            }
            if (message.changedIn != null && Object.hasOwnProperty.call(message, "changedIn")) {
                var error = $root.common.StringValue.verify(message.changedIn, long + 1);
                if (error)
                    return "changedIn." + error;
            }
            return null;
        };

        /**
         * Creates a XAttrDiff message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.XAttrDiff
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.XAttrDiff} XAttrDiff
         */
        XAttrDiff.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.XAttrDiff)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.XAttrDiff: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.XAttrDiff();
            if (object.name != null)
                message.name = String(object.name);
            if (object.addedIn != null) {
                if (!$util.isObject(object.addedIn))
                    throw TypeError(".file.XAttrDiff.addedIn: object expected");
                message.addedIn = $root.common.StringValue.fromObject(object.addedIn, long + 1);
            }
            if (object.removedIn != null) {
                if (!$util.isObject(object.removedIn))
                    throw TypeError(".file.XAttrDiff.removedIn: object expected");
                message.removedIn = $root.common.StringValue.fromObject(object.removedIn, long + 1);
            }
            if (object.changedIn != null) {
                if (!$util.isObject(object.changedIn))
                    throw TypeError(".file.XAttrDiff.changedIn: object expected");
                message.changedIn = $root.common.StringValue.fromObject(object.changedIn, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a XAttrDiff message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.XAttrDiff
         * @static
         * @param {file.XAttrDiff} message XAttrDiff
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        XAttrDiff.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.name = "";
                object.addedIn = null;
                object.removedIn = null;
                object.changedIn = null;
            }
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                object.name = message.name;
            if (message.addedIn != null && Object.hasOwnProperty.call(message, "addedIn"))
                object.addedIn = $root.common.StringValue.toObject(message.addedIn, options, q + 1);
            if (message.removedIn != null && Object.hasOwnProperty.call(message, "removedIn"))
                object.removedIn = $root.common.StringValue.toObject(message.removedIn, options, q + 1);
            if (message.changedIn != null && Object.hasOwnProperty.call(message, "changedIn"))
                object.changedIn = $root.common.StringValue.toObject(message.changedIn, options, q + 1);
            return object;
        };

        /**
         * Converts this XAttrDiff to JSON.
         * @function toJSON
         * @memberof file.XAttrDiff
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        XAttrDiff.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for XAttrDiff
         * @function getTypeUrl
         * @memberof file.XAttrDiff
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        XAttrDiff.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.XAttrDiff";
        };

        return XAttrDiff;
    })();

    file.FileDiff = (function() {

        /**
         * Properties of a FileDiff.
         * @memberof file
         * @interface IFileDiff
         * @property {number|Long|null} [currentVersion] FileDiff currentVersion
         * @property {boolean|null} [isCurrentLocal] FileDiff isCurrentLocal
         * @property {common.IUInt64Value|null} [remoteVersion] FileDiff remoteVersion
         * @property {common.IUInt64Value|null} [syncedVersion] FileDiff syncedVersion
         * @property {boolean|null} [isRemoteRemoved] FileDiff isRemoteRemoved
         * @property {file.ITimeStampsDiff|null} [ctime] FileDiff ctime
         * @property {file.ITimeStampsDiff|null} [mtime] FileDiff mtime
         * @property {Array.<file.IXAttrDiff>|null} [xattrs] FileDiff xattrs
         * @property {boolean|null} [areContentsSame] FileDiff areContentsSame
         * @property {file.FileDiff.ISize|null} [size] FileDiff size
         */

        /**
         * Constructs a new FileDiff.
         * @memberof file
         * @classdesc Represents a FileDiff.
         * @implements IFileDiff
         * @constructor
         * @param {file.IFileDiff=} [properties] Properties to set
         */
        function FileDiff(properties) {
            this.xattrs = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileDiff currentVersion.
         * @member {number|Long} currentVersion
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.currentVersion = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * FileDiff isCurrentLocal.
         * @member {boolean} isCurrentLocal
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.isCurrentLocal = false;

        /**
         * FileDiff remoteVersion.
         * @member {common.IUInt64Value|null|undefined} remoteVersion
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.remoteVersion = null;

        /**
         * FileDiff syncedVersion.
         * @member {common.IUInt64Value|null|undefined} syncedVersion
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.syncedVersion = null;

        /**
         * FileDiff isRemoteRemoved.
         * @member {boolean} isRemoteRemoved
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.isRemoteRemoved = false;

        /**
         * FileDiff ctime.
         * @member {file.ITimeStampsDiff|null|undefined} ctime
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.ctime = null;

        /**
         * FileDiff mtime.
         * @member {file.ITimeStampsDiff|null|undefined} mtime
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.mtime = null;

        /**
         * FileDiff xattrs.
         * @member {Array.<file.IXAttrDiff>} xattrs
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.xattrs = $util.emptyArray;

        /**
         * FileDiff areContentsSame.
         * @member {boolean} areContentsSame
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.areContentsSame = false;

        /**
         * FileDiff size.
         * @member {file.FileDiff.ISize|null|undefined} size
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.size = null;

        /**
         * Creates a new FileDiff instance using the specified properties.
         * @function create
         * @memberof file.FileDiff
         * @static
         * @param {file.IFileDiff=} [properties] Properties to set
         * @returns {file.FileDiff} FileDiff instance
         */
        FileDiff.create = function create(properties) {
            return new FileDiff(properties);
        };

        /**
         * Encodes the specified FileDiff message. Does not implicitly {@link file.FileDiff.verify|verify} messages.
         * @function encode
         * @memberof file.FileDiff
         * @static
         * @param {file.IFileDiff} message FileDiff message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileDiff.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.currentVersion);
            if (message.isCurrentLocal != null && Object.hasOwnProperty.call(message, "isCurrentLocal"))
                writer.uint32(/* id 2, wireType 0 =*/16).bool(message.isCurrentLocal);
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.syncedVersion != null && Object.hasOwnProperty.call(message, "syncedVersion"))
                $root.common.UInt64Value.encode(message.syncedVersion, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            if (message.isRemoteRemoved != null && Object.hasOwnProperty.call(message, "isRemoteRemoved"))
                writer.uint32(/* id 5, wireType 0 =*/40).bool(message.isRemoteRemoved);
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime"))
                $root.file.TimeStampsDiff.encode(message.ctime, writer.uint32(/* id 6, wireType 2 =*/50).fork(), q + 1).ldelim();
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime"))
                $root.file.TimeStampsDiff.encode(message.mtime, writer.uint32(/* id 7, wireType 2 =*/58).fork(), q + 1).ldelim();
            if (message.xattrs != null && message.xattrs.length)
                for (var i = 0; i < message.xattrs.length; ++i)
                    $root.file.XAttrDiff.encode(message.xattrs[i], writer.uint32(/* id 8, wireType 2 =*/66).fork(), q + 1).ldelim();
            if (message.areContentsSame != null && Object.hasOwnProperty.call(message, "areContentsSame"))
                writer.uint32(/* id 11, wireType 0 =*/88).bool(message.areContentsSame);
            if (message.size != null && Object.hasOwnProperty.call(message, "size"))
                $root.file.FileDiff.Size.encode(message.size, writer.uint32(/* id 12, wireType 2 =*/98).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FileDiff message, length delimited. Does not implicitly {@link file.FileDiff.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.FileDiff
         * @static
         * @param {file.IFileDiff} message FileDiff message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileDiff.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileDiff message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileDiff
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileDiff} FileDiff
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileDiff.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileDiff();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.currentVersion = reader.uint64();
                        break;
                    }
                case 2: {
                        message.isCurrentLocal = reader.bool();
                        break;
                    }
                case 3: {
                        message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.syncedVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 5: {
                        message.isRemoteRemoved = reader.bool();
                        break;
                    }
                case 6: {
                        message.ctime = $root.file.TimeStampsDiff.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 7: {
                        message.mtime = $root.file.TimeStampsDiff.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 8: {
                        if (!(message.xattrs && message.xattrs.length))
                            message.xattrs = [];
                        message.xattrs.push($root.file.XAttrDiff.decode(reader, reader.uint32(), undefined, long + 1));
                        break;
                    }
                case 11: {
                        message.areContentsSame = reader.bool();
                        break;
                    }
                case 12: {
                        message.size = $root.file.FileDiff.Size.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileDiff message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.FileDiff
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.FileDiff} FileDiff
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileDiff.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileDiff message.
         * @function verify
         * @memberof file.FileDiff
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileDiff.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                if (!$util.isInteger(message.currentVersion) && !(message.currentVersion && $util.isInteger(message.currentVersion.low) && $util.isInteger(message.currentVersion.high)))
                    return "currentVersion: integer|Long expected";
            if (message.isCurrentLocal != null && Object.hasOwnProperty.call(message, "isCurrentLocal"))
                if (typeof message.isCurrentLocal !== "boolean")
                    return "isCurrentLocal: boolean expected";
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion, long + 1);
                if (error)
                    return "remoteVersion." + error;
            }
            if (message.syncedVersion != null && Object.hasOwnProperty.call(message, "syncedVersion")) {
                var error = $root.common.UInt64Value.verify(message.syncedVersion, long + 1);
                if (error)
                    return "syncedVersion." + error;
            }
            if (message.isRemoteRemoved != null && Object.hasOwnProperty.call(message, "isRemoteRemoved"))
                if (typeof message.isRemoteRemoved !== "boolean")
                    return "isRemoteRemoved: boolean expected";
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime")) {
                var error = $root.file.TimeStampsDiff.verify(message.ctime, long + 1);
                if (error)
                    return "ctime." + error;
            }
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime")) {
                var error = $root.file.TimeStampsDiff.verify(message.mtime, long + 1);
                if (error)
                    return "mtime." + error;
            }
            if (message.xattrs != null && Object.hasOwnProperty.call(message, "xattrs")) {
                if (!Array.isArray(message.xattrs))
                    return "xattrs: array expected";
                for (var i = 0; i < message.xattrs.length; ++i) {
                    var error = $root.file.XAttrDiff.verify(message.xattrs[i], long + 1);
                    if (error)
                        return "xattrs." + error;
                }
            }
            if (message.areContentsSame != null && Object.hasOwnProperty.call(message, "areContentsSame"))
                if (typeof message.areContentsSame !== "boolean")
                    return "areContentsSame: boolean expected";
            if (message.size != null && Object.hasOwnProperty.call(message, "size")) {
                var error = $root.file.FileDiff.Size.verify(message.size, long + 1);
                if (error)
                    return "size." + error;
            }
            return null;
        };

        /**
         * Creates a FileDiff message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileDiff
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileDiff} FileDiff
         */
        FileDiff.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.FileDiff)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.FileDiff: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.FileDiff();
            if (object.currentVersion != null)
                if ($util.Long)
                    message.currentVersion = $util.Long.fromValue(object.currentVersion, true);
                else if (typeof object.currentVersion === "string")
                    message.currentVersion = parseInt(object.currentVersion, 10);
                else if (typeof object.currentVersion === "number")
                    message.currentVersion = object.currentVersion;
                else if (typeof object.currentVersion === "object")
                    message.currentVersion = new $util.LongBits(object.currentVersion.low >>> 0, object.currentVersion.high >>> 0).toNumber(true);
            if (object.isCurrentLocal != null)
                message.isCurrentLocal = Boolean(object.isCurrentLocal);
            if (object.remoteVersion != null) {
                if (!$util.isObject(object.remoteVersion))
                    throw TypeError(".file.FileDiff.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion, long + 1);
            }
            if (object.syncedVersion != null) {
                if (!$util.isObject(object.syncedVersion))
                    throw TypeError(".file.FileDiff.syncedVersion: object expected");
                message.syncedVersion = $root.common.UInt64Value.fromObject(object.syncedVersion, long + 1);
            }
            if (object.isRemoteRemoved != null)
                message.isRemoteRemoved = Boolean(object.isRemoteRemoved);
            if (object.ctime != null) {
                if (!$util.isObject(object.ctime))
                    throw TypeError(".file.FileDiff.ctime: object expected");
                message.ctime = $root.file.TimeStampsDiff.fromObject(object.ctime, long + 1);
            }
            if (object.mtime != null) {
                if (!$util.isObject(object.mtime))
                    throw TypeError(".file.FileDiff.mtime: object expected");
                message.mtime = $root.file.TimeStampsDiff.fromObject(object.mtime, long + 1);
            }
            if (object.xattrs) {
                if (!Array.isArray(object.xattrs))
                    throw TypeError(".file.FileDiff.xattrs: array expected");
                message.xattrs = [];
                for (var i = 0; i < object.xattrs.length; ++i) {
                    if (!$util.isObject(object.xattrs[i]))
                        throw TypeError(".file.FileDiff.xattrs: object expected");
                    message.xattrs[i] = $root.file.XAttrDiff.fromObject(object.xattrs[i], long + 1);
                }
            }
            if (object.areContentsSame != null)
                message.areContentsSame = Boolean(object.areContentsSame);
            if (object.size != null) {
                if (!$util.isObject(object.size))
                    throw TypeError(".file.FileDiff.size: object expected");
                message.size = $root.file.FileDiff.Size.fromObject(object.size, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a FileDiff message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileDiff
         * @static
         * @param {file.FileDiff} message FileDiff
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileDiff.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.xattrs = [];
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.currentVersion = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.currentVersion = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.isCurrentLocal = false;
                object.remoteVersion = null;
                object.syncedVersion = null;
                object.isRemoteRemoved = false;
                object.ctime = null;
                object.mtime = null;
                object.areContentsSame = false;
                object.size = null;
            }
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.currentVersion = typeof message.currentVersion === "number" ? BigInt(message.currentVersion) : $util.Long.fromBits(message.currentVersion.low >>> 0, message.currentVersion.high >>> 0, true).toBigInt();
                else if (typeof message.currentVersion === "number")
                    object.currentVersion = options.longs === String ? String(message.currentVersion) : message.currentVersion;
                else
                    object.currentVersion = options.longs === String ? $util.Long.prototype.toString.call(message.currentVersion) : options.longs === Number ? new $util.LongBits(message.currentVersion.low >>> 0, message.currentVersion.high >>> 0).toNumber(true) : message.currentVersion;
            if (message.isCurrentLocal != null && Object.hasOwnProperty.call(message, "isCurrentLocal"))
                object.isCurrentLocal = message.isCurrentLocal;
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options, q + 1);
            if (message.syncedVersion != null && Object.hasOwnProperty.call(message, "syncedVersion"))
                object.syncedVersion = $root.common.UInt64Value.toObject(message.syncedVersion, options, q + 1);
            if (message.isRemoteRemoved != null && Object.hasOwnProperty.call(message, "isRemoteRemoved"))
                object.isRemoteRemoved = message.isRemoteRemoved;
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime"))
                object.ctime = $root.file.TimeStampsDiff.toObject(message.ctime, options, q + 1);
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime"))
                object.mtime = $root.file.TimeStampsDiff.toObject(message.mtime, options, q + 1);
            if (message.xattrs && message.xattrs.length) {
                object.xattrs = [];
                for (var j = 0; j < message.xattrs.length; ++j)
                    object.xattrs[j] = $root.file.XAttrDiff.toObject(message.xattrs[j], options, q + 1);
            }
            if (message.areContentsSame != null && Object.hasOwnProperty.call(message, "areContentsSame"))
                object.areContentsSame = message.areContentsSame;
            if (message.size != null && Object.hasOwnProperty.call(message, "size"))
                object.size = $root.file.FileDiff.Size.toObject(message.size, options, q + 1);
            return object;
        };

        /**
         * Converts this FileDiff to JSON.
         * @function toJSON
         * @memberof file.FileDiff
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileDiff.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileDiff
         * @function getTypeUrl
         * @memberof file.FileDiff
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileDiff.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.FileDiff";
        };

        FileDiff.Size = (function() {

            /**
             * Properties of a Size.
             * @memberof file.FileDiff
             * @interface ISize
             * @property {number|Long|null} [current] Size current
             * @property {number|Long|null} [remote] Size remote
             */

            /**
             * Constructs a new Size.
             * @memberof file.FileDiff
             * @classdesc Represents a Size.
             * @implements ISize
             * @constructor
             * @param {file.FileDiff.ISize=} [properties] Properties to set
             */
            function Size(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * Size current.
             * @member {number|Long} current
             * @memberof file.FileDiff.Size
             * @instance
             */
            Size.prototype.current = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

            /**
             * Size remote.
             * @member {number|Long} remote
             * @memberof file.FileDiff.Size
             * @instance
             */
            Size.prototype.remote = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

            /**
             * Creates a new Size instance using the specified properties.
             * @function create
             * @memberof file.FileDiff.Size
             * @static
             * @param {file.FileDiff.ISize=} [properties] Properties to set
             * @returns {file.FileDiff.Size} Size instance
             */
            Size.create = function create(properties) {
                return new Size(properties);
            };

            /**
             * Encodes the specified Size message. Does not implicitly {@link file.FileDiff.Size.verify|verify} messages.
             * @function encode
             * @memberof file.FileDiff.Size
             * @static
             * @param {file.FileDiff.ISize} message Size message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Size.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                    writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.current);
                if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                    writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.remote);
                return writer;
            };

            /**
             * Encodes the specified Size message, length delimited. Does not implicitly {@link file.FileDiff.Size.verify|verify} messages.
             * @function encodeDelimited
             * @memberof file.FileDiff.Size
             * @static
             * @param {file.FileDiff.ISize} message Size message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Size.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes a Size message from the specified reader or buffer.
             * @function decode
             * @memberof file.FileDiff.Size
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {file.FileDiff.Size} Size
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Size.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileDiff.Size();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.current = reader.uint64();
                            break;
                        }
                    case 2: {
                            message.remote = reader.uint64();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a Size message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof file.FileDiff.Size
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {file.FileDiff.Size} Size
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Size.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a Size message.
             * @function verify
             * @memberof file.FileDiff.Size
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            Size.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                    if (!$util.isInteger(message.current) && !(message.current && $util.isInteger(message.current.low) && $util.isInteger(message.current.high)))
                        return "current: integer|Long expected";
                if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                    if (!$util.isInteger(message.remote) && !(message.remote && $util.isInteger(message.remote.low) && $util.isInteger(message.remote.high)))
                        return "remote: integer|Long expected";
                return null;
            };

            /**
             * Creates a Size message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof file.FileDiff.Size
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {file.FileDiff.Size} Size
             */
            Size.fromObject = function fromObject(object, long) {
                if (object instanceof $root.file.FileDiff.Size)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".file.FileDiff.Size: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.file.FileDiff.Size();
                if (object.current != null)
                    if ($util.Long)
                        message.current = $util.Long.fromValue(object.current, true);
                    else if (typeof object.current === "string")
                        message.current = parseInt(object.current, 10);
                    else if (typeof object.current === "number")
                        message.current = object.current;
                    else if (typeof object.current === "object")
                        message.current = new $util.LongBits(object.current.low >>> 0, object.current.high >>> 0).toNumber(true);
                if (object.remote != null)
                    if ($util.Long)
                        message.remote = $util.Long.fromValue(object.remote, true);
                    else if (typeof object.remote === "string")
                        message.remote = parseInt(object.remote, 10);
                    else if (typeof object.remote === "number")
                        message.remote = object.remote;
                    else if (typeof object.remote === "object")
                        message.remote = new $util.LongBits(object.remote.low >>> 0, object.remote.high >>> 0).toNumber(true);
                return message;
            };

            /**
             * Creates a plain object from a Size message. Also converts values to other types if specified.
             * @function toObject
             * @memberof file.FileDiff.Size
             * @static
             * @param {file.FileDiff.Size} message Size
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            Size.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults) {
                    if ($util.Long) {
                        var long = new $util.Long(0, 0, true);
                        object.current = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                    } else
                        object.current = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                    if ($util.Long) {
                        var long = new $util.Long(0, 0, true);
                        object.remote = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                    } else
                        object.remote = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                }
                if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                    if (typeof BigInt !== "undefined" && options.longs === BigInt)
                        object.current = typeof message.current === "number" ? BigInt(message.current) : $util.Long.fromBits(message.current.low >>> 0, message.current.high >>> 0, true).toBigInt();
                    else if (typeof message.current === "number")
                        object.current = options.longs === String ? String(message.current) : message.current;
                    else
                        object.current = options.longs === String ? $util.Long.prototype.toString.call(message.current) : options.longs === Number ? new $util.LongBits(message.current.low >>> 0, message.current.high >>> 0).toNumber(true) : message.current;
                if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                    if (typeof BigInt !== "undefined" && options.longs === BigInt)
                        object.remote = typeof message.remote === "number" ? BigInt(message.remote) : $util.Long.fromBits(message.remote.low >>> 0, message.remote.high >>> 0, true).toBigInt();
                    else if (typeof message.remote === "number")
                        object.remote = options.longs === String ? String(message.remote) : message.remote;
                    else
                        object.remote = options.longs === String ? $util.Long.prototype.toString.call(message.remote) : options.longs === Number ? new $util.LongBits(message.remote.low >>> 0, message.remote.high >>> 0).toNumber(true) : message.remote;
                return object;
            };

            /**
             * Converts this Size to JSON.
             * @function toJSON
             * @memberof file.FileDiff.Size
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            Size.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for Size
             * @function getTypeUrl
             * @memberof file.FileDiff.Size
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            Size.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/file.FileDiff.Size";
            };

            return Size;
        })();

        return FileDiff;
    })();

    file.FileSyncUploadRequestBody = (function() {

        /**
         * Properties of a FileSyncUploadRequestBody.
         * @memberof file
         * @interface IFileSyncUploadRequestBody
         * @property {file.IOptionsToUploadLocal|null} [opts] FileSyncUploadRequestBody opts
         */

        /**
         * Constructs a new FileSyncUploadRequestBody.
         * @memberof file
         * @classdesc Represents a FileSyncUploadRequestBody.
         * @implements IFileSyncUploadRequestBody
         * @constructor
         * @param {file.IFileSyncUploadRequestBody=} [properties] Properties to set
         */
        function FileSyncUploadRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileSyncUploadRequestBody opts.
         * @member {file.IOptionsToUploadLocal|null|undefined} opts
         * @memberof file.FileSyncUploadRequestBody
         * @instance
         */
        FileSyncUploadRequestBody.prototype.opts = null;

        /**
         * Creates a new FileSyncUploadRequestBody instance using the specified properties.
         * @function create
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {file.IFileSyncUploadRequestBody=} [properties] Properties to set
         * @returns {file.FileSyncUploadRequestBody} FileSyncUploadRequestBody instance
         */
        FileSyncUploadRequestBody.create = function create(properties) {
            return new FileSyncUploadRequestBody(properties);
        };

        /**
         * Encodes the specified FileSyncUploadRequestBody message. Does not implicitly {@link file.FileSyncUploadRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {file.IFileSyncUploadRequestBody} message FileSyncUploadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncUploadRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.file.OptionsToUploadLocal.encode(message.opts, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FileSyncUploadRequestBody message, length delimited. Does not implicitly {@link file.FileSyncUploadRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {file.IFileSyncUploadRequestBody} message FileSyncUploadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncUploadRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileSyncUploadRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileSyncUploadRequestBody} FileSyncUploadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncUploadRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncUploadRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.opts = $root.file.OptionsToUploadLocal.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileSyncUploadRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.FileSyncUploadRequestBody} FileSyncUploadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncUploadRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileSyncUploadRequestBody message.
         * @function verify
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileSyncUploadRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts")) {
                var error = $root.file.OptionsToUploadLocal.verify(message.opts, long + 1);
                if (error)
                    return "opts." + error;
            }
            return null;
        };

        /**
         * Creates a FileSyncUploadRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileSyncUploadRequestBody} FileSyncUploadRequestBody
         */
        FileSyncUploadRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.FileSyncUploadRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.FileSyncUploadRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.FileSyncUploadRequestBody();
            if (object.opts != null) {
                if (!$util.isObject(object.opts))
                    throw TypeError(".file.FileSyncUploadRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToUploadLocal.fromObject(object.opts, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a FileSyncUploadRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {file.FileSyncUploadRequestBody} message FileSyncUploadRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileSyncUploadRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.opts = null;
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                object.opts = $root.file.OptionsToUploadLocal.toObject(message.opts, options, q + 1);
            return object;
        };

        /**
         * Converts this FileSyncUploadRequestBody to JSON.
         * @function toJSON
         * @memberof file.FileSyncUploadRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileSyncUploadRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileSyncUploadRequestBody
         * @function getTypeUrl
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileSyncUploadRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.FileSyncUploadRequestBody";
        };

        return FileSyncUploadRequestBody;
    })();

    file.FileSyncUploadReplyBody = (function() {

        /**
         * Properties of a FileSyncUploadReplyBody.
         * @memberof file
         * @interface IFileSyncUploadReplyBody
         * @property {common.IUInt64Value|null} [uploadedVersion] FileSyncUploadReplyBody uploadedVersion
         */

        /**
         * Constructs a new FileSyncUploadReplyBody.
         * @memberof file
         * @classdesc Represents a FileSyncUploadReplyBody.
         * @implements IFileSyncUploadReplyBody
         * @constructor
         * @param {file.IFileSyncUploadReplyBody=} [properties] Properties to set
         */
        function FileSyncUploadReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileSyncUploadReplyBody uploadedVersion.
         * @member {common.IUInt64Value|null|undefined} uploadedVersion
         * @memberof file.FileSyncUploadReplyBody
         * @instance
         */
        FileSyncUploadReplyBody.prototype.uploadedVersion = null;

        /**
         * Creates a new FileSyncUploadReplyBody instance using the specified properties.
         * @function create
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {file.IFileSyncUploadReplyBody=} [properties] Properties to set
         * @returns {file.FileSyncUploadReplyBody} FileSyncUploadReplyBody instance
         */
        FileSyncUploadReplyBody.create = function create(properties) {
            return new FileSyncUploadReplyBody(properties);
        };

        /**
         * Encodes the specified FileSyncUploadReplyBody message. Does not implicitly {@link file.FileSyncUploadReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {file.IFileSyncUploadReplyBody} message FileSyncUploadReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncUploadReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.uploadedVersion != null && Object.hasOwnProperty.call(message, "uploadedVersion"))
                $root.common.UInt64Value.encode(message.uploadedVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FileSyncUploadReplyBody message, length delimited. Does not implicitly {@link file.FileSyncUploadReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {file.IFileSyncUploadReplyBody} message FileSyncUploadReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncUploadReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileSyncUploadReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileSyncUploadReplyBody} FileSyncUploadReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncUploadReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncUploadReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.uploadedVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileSyncUploadReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.FileSyncUploadReplyBody} FileSyncUploadReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncUploadReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileSyncUploadReplyBody message.
         * @function verify
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileSyncUploadReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.uploadedVersion != null && Object.hasOwnProperty.call(message, "uploadedVersion")) {
                var error = $root.common.UInt64Value.verify(message.uploadedVersion, long + 1);
                if (error)
                    return "uploadedVersion." + error;
            }
            return null;
        };

        /**
         * Creates a FileSyncUploadReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileSyncUploadReplyBody} FileSyncUploadReplyBody
         */
        FileSyncUploadReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.FileSyncUploadReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.FileSyncUploadReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.FileSyncUploadReplyBody();
            if (object.uploadedVersion != null) {
                if (!$util.isObject(object.uploadedVersion))
                    throw TypeError(".file.FileSyncUploadReplyBody.uploadedVersion: object expected");
                message.uploadedVersion = $root.common.UInt64Value.fromObject(object.uploadedVersion, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a FileSyncUploadReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {file.FileSyncUploadReplyBody} message FileSyncUploadReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileSyncUploadReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.uploadedVersion = null;
            if (message.uploadedVersion != null && Object.hasOwnProperty.call(message, "uploadedVersion"))
                object.uploadedVersion = $root.common.UInt64Value.toObject(message.uploadedVersion, options, q + 1);
            return object;
        };

        /**
         * Converts this FileSyncUploadReplyBody to JSON.
         * @function toJSON
         * @memberof file.FileSyncUploadReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileSyncUploadReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileSyncUploadReplyBody
         * @function getTypeUrl
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileSyncUploadReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.FileSyncUploadReplyBody";
        };

        return FileSyncUploadReplyBody;
    })();

    file.FileSyncStartUploadReplyBody = (function() {

        /**
         * Properties of a FileSyncStartUploadReplyBody.
         * @memberof file
         * @interface IFileSyncStartUploadReplyBody
         * @property {file.FileSyncStartUploadReplyBody.IUploadInfo|null} [startedUpload] FileSyncStartUploadReplyBody startedUpload
         */

        /**
         * Constructs a new FileSyncStartUploadReplyBody.
         * @memberof file
         * @classdesc Represents a FileSyncStartUploadReplyBody.
         * @implements IFileSyncStartUploadReplyBody
         * @constructor
         * @param {file.IFileSyncStartUploadReplyBody=} [properties] Properties to set
         */
        function FileSyncStartUploadReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileSyncStartUploadReplyBody startedUpload.
         * @member {file.FileSyncStartUploadReplyBody.IUploadInfo|null|undefined} startedUpload
         * @memberof file.FileSyncStartUploadReplyBody
         * @instance
         */
        FileSyncStartUploadReplyBody.prototype.startedUpload = null;

        /**
         * Creates a new FileSyncStartUploadReplyBody instance using the specified properties.
         * @function create
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {file.IFileSyncStartUploadReplyBody=} [properties] Properties to set
         * @returns {file.FileSyncStartUploadReplyBody} FileSyncStartUploadReplyBody instance
         */
        FileSyncStartUploadReplyBody.create = function create(properties) {
            return new FileSyncStartUploadReplyBody(properties);
        };

        /**
         * Encodes the specified FileSyncStartUploadReplyBody message. Does not implicitly {@link file.FileSyncStartUploadReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {file.IFileSyncStartUploadReplyBody} message FileSyncStartUploadReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncStartUploadReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.startedUpload != null && Object.hasOwnProperty.call(message, "startedUpload"))
                $root.file.FileSyncStartUploadReplyBody.UploadInfo.encode(message.startedUpload, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FileSyncStartUploadReplyBody message, length delimited. Does not implicitly {@link file.FileSyncStartUploadReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {file.IFileSyncStartUploadReplyBody} message FileSyncStartUploadReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncStartUploadReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileSyncStartUploadReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileSyncStartUploadReplyBody} FileSyncStartUploadReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncStartUploadReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncStartUploadReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.startedUpload = $root.file.FileSyncStartUploadReplyBody.UploadInfo.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileSyncStartUploadReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.FileSyncStartUploadReplyBody} FileSyncStartUploadReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncStartUploadReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileSyncStartUploadReplyBody message.
         * @function verify
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileSyncStartUploadReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.startedUpload != null && Object.hasOwnProperty.call(message, "startedUpload")) {
                var error = $root.file.FileSyncStartUploadReplyBody.UploadInfo.verify(message.startedUpload, long + 1);
                if (error)
                    return "startedUpload." + error;
            }
            return null;
        };

        /**
         * Creates a FileSyncStartUploadReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileSyncStartUploadReplyBody} FileSyncStartUploadReplyBody
         */
        FileSyncStartUploadReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.FileSyncStartUploadReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.FileSyncStartUploadReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.FileSyncStartUploadReplyBody();
            if (object.startedUpload != null) {
                if (!$util.isObject(object.startedUpload))
                    throw TypeError(".file.FileSyncStartUploadReplyBody.startedUpload: object expected");
                message.startedUpload = $root.file.FileSyncStartUploadReplyBody.UploadInfo.fromObject(object.startedUpload, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a FileSyncStartUploadReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {file.FileSyncStartUploadReplyBody} message FileSyncStartUploadReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileSyncStartUploadReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.startedUpload = null;
            if (message.startedUpload != null && Object.hasOwnProperty.call(message, "startedUpload"))
                object.startedUpload = $root.file.FileSyncStartUploadReplyBody.UploadInfo.toObject(message.startedUpload, options, q + 1);
            return object;
        };

        /**
         * Converts this FileSyncStartUploadReplyBody to JSON.
         * @function toJSON
         * @memberof file.FileSyncStartUploadReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileSyncStartUploadReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileSyncStartUploadReplyBody
         * @function getTypeUrl
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileSyncStartUploadReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.FileSyncStartUploadReplyBody";
        };

        FileSyncStartUploadReplyBody.UploadInfo = (function() {

            /**
             * Properties of an UploadInfo.
             * @memberof file.FileSyncStartUploadReplyBody
             * @interface IUploadInfo
             * @property {number|Long|null} [uploadVersion] UploadInfo uploadVersion
             * @property {number|Long|null} [uploadTaskId] UploadInfo uploadTaskId
             */

            /**
             * Constructs a new UploadInfo.
             * @memberof file.FileSyncStartUploadReplyBody
             * @classdesc Represents an UploadInfo.
             * @implements IUploadInfo
             * @constructor
             * @param {file.FileSyncStartUploadReplyBody.IUploadInfo=} [properties] Properties to set
             */
            function UploadInfo(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * UploadInfo uploadVersion.
             * @member {number|Long} uploadVersion
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @instance
             */
            UploadInfo.prototype.uploadVersion = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

            /**
             * UploadInfo uploadTaskId.
             * @member {number|Long} uploadTaskId
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @instance
             */
            UploadInfo.prototype.uploadTaskId = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

            /**
             * Creates a new UploadInfo instance using the specified properties.
             * @function create
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {file.FileSyncStartUploadReplyBody.IUploadInfo=} [properties] Properties to set
             * @returns {file.FileSyncStartUploadReplyBody.UploadInfo} UploadInfo instance
             */
            UploadInfo.create = function create(properties) {
                return new UploadInfo(properties);
            };

            /**
             * Encodes the specified UploadInfo message. Does not implicitly {@link file.FileSyncStartUploadReplyBody.UploadInfo.verify|verify} messages.
             * @function encode
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {file.FileSyncStartUploadReplyBody.IUploadInfo} message UploadInfo message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            UploadInfo.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                    writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.uploadVersion);
                if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                    writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.uploadTaskId);
                return writer;
            };

            /**
             * Encodes the specified UploadInfo message, length delimited. Does not implicitly {@link file.FileSyncStartUploadReplyBody.UploadInfo.verify|verify} messages.
             * @function encodeDelimited
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {file.FileSyncStartUploadReplyBody.IUploadInfo} message UploadInfo message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            UploadInfo.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes an UploadInfo message from the specified reader or buffer.
             * @function decode
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {file.FileSyncStartUploadReplyBody.UploadInfo} UploadInfo
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            UploadInfo.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncStartUploadReplyBody.UploadInfo();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.uploadVersion = reader.uint64();
                            break;
                        }
                    case 2: {
                            message.uploadTaskId = reader.uint64();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes an UploadInfo message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {file.FileSyncStartUploadReplyBody.UploadInfo} UploadInfo
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            UploadInfo.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies an UploadInfo message.
             * @function verify
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            UploadInfo.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                    if (!$util.isInteger(message.uploadVersion) && !(message.uploadVersion && $util.isInteger(message.uploadVersion.low) && $util.isInteger(message.uploadVersion.high)))
                        return "uploadVersion: integer|Long expected";
                if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                    if (!$util.isInteger(message.uploadTaskId) && !(message.uploadTaskId && $util.isInteger(message.uploadTaskId.low) && $util.isInteger(message.uploadTaskId.high)))
                        return "uploadTaskId: integer|Long expected";
                return null;
            };

            /**
             * Creates an UploadInfo message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {file.FileSyncStartUploadReplyBody.UploadInfo} UploadInfo
             */
            UploadInfo.fromObject = function fromObject(object, long) {
                if (object instanceof $root.file.FileSyncStartUploadReplyBody.UploadInfo)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".file.FileSyncStartUploadReplyBody.UploadInfo: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.file.FileSyncStartUploadReplyBody.UploadInfo();
                if (object.uploadVersion != null)
                    if ($util.Long)
                        message.uploadVersion = $util.Long.fromValue(object.uploadVersion, true);
                    else if (typeof object.uploadVersion === "string")
                        message.uploadVersion = parseInt(object.uploadVersion, 10);
                    else if (typeof object.uploadVersion === "number")
                        message.uploadVersion = object.uploadVersion;
                    else if (typeof object.uploadVersion === "object")
                        message.uploadVersion = new $util.LongBits(object.uploadVersion.low >>> 0, object.uploadVersion.high >>> 0).toNumber(true);
                if (object.uploadTaskId != null)
                    if ($util.Long)
                        message.uploadTaskId = $util.Long.fromValue(object.uploadTaskId, true);
                    else if (typeof object.uploadTaskId === "string")
                        message.uploadTaskId = parseInt(object.uploadTaskId, 10);
                    else if (typeof object.uploadTaskId === "number")
                        message.uploadTaskId = object.uploadTaskId;
                    else if (typeof object.uploadTaskId === "object")
                        message.uploadTaskId = new $util.LongBits(object.uploadTaskId.low >>> 0, object.uploadTaskId.high >>> 0).toNumber(true);
                return message;
            };

            /**
             * Creates a plain object from an UploadInfo message. Also converts values to other types if specified.
             * @function toObject
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {file.FileSyncStartUploadReplyBody.UploadInfo} message UploadInfo
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            UploadInfo.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults) {
                    if ($util.Long) {
                        var long = new $util.Long(0, 0, true);
                        object.uploadVersion = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                    } else
                        object.uploadVersion = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                    if ($util.Long) {
                        var long = new $util.Long(0, 0, true);
                        object.uploadTaskId = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                    } else
                        object.uploadTaskId = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                }
                if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                    if (typeof BigInt !== "undefined" && options.longs === BigInt)
                        object.uploadVersion = typeof message.uploadVersion === "number" ? BigInt(message.uploadVersion) : $util.Long.fromBits(message.uploadVersion.low >>> 0, message.uploadVersion.high >>> 0, true).toBigInt();
                    else if (typeof message.uploadVersion === "number")
                        object.uploadVersion = options.longs === String ? String(message.uploadVersion) : message.uploadVersion;
                    else
                        object.uploadVersion = options.longs === String ? $util.Long.prototype.toString.call(message.uploadVersion) : options.longs === Number ? new $util.LongBits(message.uploadVersion.low >>> 0, message.uploadVersion.high >>> 0).toNumber(true) : message.uploadVersion;
                if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                    if (typeof BigInt !== "undefined" && options.longs === BigInt)
                        object.uploadTaskId = typeof message.uploadTaskId === "number" ? BigInt(message.uploadTaskId) : $util.Long.fromBits(message.uploadTaskId.low >>> 0, message.uploadTaskId.high >>> 0, true).toBigInt();
                    else if (typeof message.uploadTaskId === "number")
                        object.uploadTaskId = options.longs === String ? String(message.uploadTaskId) : message.uploadTaskId;
                    else
                        object.uploadTaskId = options.longs === String ? $util.Long.prototype.toString.call(message.uploadTaskId) : options.longs === Number ? new $util.LongBits(message.uploadTaskId.low >>> 0, message.uploadTaskId.high >>> 0).toNumber(true) : message.uploadTaskId;
                return object;
            };

            /**
             * Converts this UploadInfo to JSON.
             * @function toJSON
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            UploadInfo.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for UploadInfo
             * @function getTypeUrl
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            UploadInfo.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/file.FileSyncStartUploadReplyBody.UploadInfo";
            };

            return UploadInfo;
        })();

        return FileSyncStartUploadReplyBody;
    })();

    file.OptionsToUploadLocal = (function() {

        /**
         * Properties of an OptionsToUploadLocal.
         * @memberof file
         * @interface IOptionsToUploadLocal
         * @property {common.IUInt64Value|null} [localVersion] OptionsToUploadLocal localVersion
         * @property {common.IUInt64Value|null} [uploadVersion] OptionsToUploadLocal uploadVersion
         */

        /**
         * Constructs a new OptionsToUploadLocal.
         * @memberof file
         * @classdesc Represents an OptionsToUploadLocal.
         * @implements IOptionsToUploadLocal
         * @constructor
         * @param {file.IOptionsToUploadLocal=} [properties] Properties to set
         */
        function OptionsToUploadLocal(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * OptionsToUploadLocal localVersion.
         * @member {common.IUInt64Value|null|undefined} localVersion
         * @memberof file.OptionsToUploadLocal
         * @instance
         */
        OptionsToUploadLocal.prototype.localVersion = null;

        /**
         * OptionsToUploadLocal uploadVersion.
         * @member {common.IUInt64Value|null|undefined} uploadVersion
         * @memberof file.OptionsToUploadLocal
         * @instance
         */
        OptionsToUploadLocal.prototype.uploadVersion = null;

        /**
         * Creates a new OptionsToUploadLocal instance using the specified properties.
         * @function create
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {file.IOptionsToUploadLocal=} [properties] Properties to set
         * @returns {file.OptionsToUploadLocal} OptionsToUploadLocal instance
         */
        OptionsToUploadLocal.create = function create(properties) {
            return new OptionsToUploadLocal(properties);
        };

        /**
         * Encodes the specified OptionsToUploadLocal message. Does not implicitly {@link file.OptionsToUploadLocal.verify|verify} messages.
         * @function encode
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {file.IOptionsToUploadLocal} message OptionsToUploadLocal message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        OptionsToUploadLocal.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                $root.common.UInt64Value.encode(message.localVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                $root.common.UInt64Value.encode(message.uploadVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified OptionsToUploadLocal message, length delimited. Does not implicitly {@link file.OptionsToUploadLocal.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {file.IOptionsToUploadLocal} message OptionsToUploadLocal message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        OptionsToUploadLocal.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an OptionsToUploadLocal message from the specified reader or buffer.
         * @function decode
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.OptionsToUploadLocal} OptionsToUploadLocal
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        OptionsToUploadLocal.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.OptionsToUploadLocal();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.localVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.uploadVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an OptionsToUploadLocal message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.OptionsToUploadLocal} OptionsToUploadLocal
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        OptionsToUploadLocal.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an OptionsToUploadLocal message.
         * @function verify
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        OptionsToUploadLocal.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion")) {
                var error = $root.common.UInt64Value.verify(message.localVersion, long + 1);
                if (error)
                    return "localVersion." + error;
            }
            if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion")) {
                var error = $root.common.UInt64Value.verify(message.uploadVersion, long + 1);
                if (error)
                    return "uploadVersion." + error;
            }
            return null;
        };

        /**
         * Creates an OptionsToUploadLocal message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.OptionsToUploadLocal} OptionsToUploadLocal
         */
        OptionsToUploadLocal.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.OptionsToUploadLocal)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.OptionsToUploadLocal: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.OptionsToUploadLocal();
            if (object.localVersion != null) {
                if (!$util.isObject(object.localVersion))
                    throw TypeError(".file.OptionsToUploadLocal.localVersion: object expected");
                message.localVersion = $root.common.UInt64Value.fromObject(object.localVersion, long + 1);
            }
            if (object.uploadVersion != null) {
                if (!$util.isObject(object.uploadVersion))
                    throw TypeError(".file.OptionsToUploadLocal.uploadVersion: object expected");
                message.uploadVersion = $root.common.UInt64Value.fromObject(object.uploadVersion, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an OptionsToUploadLocal message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {file.OptionsToUploadLocal} message OptionsToUploadLocal
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        OptionsToUploadLocal.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.localVersion = null;
                object.uploadVersion = null;
            }
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                object.localVersion = $root.common.UInt64Value.toObject(message.localVersion, options, q + 1);
            if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                object.uploadVersion = $root.common.UInt64Value.toObject(message.uploadVersion, options, q + 1);
            return object;
        };

        /**
         * Converts this OptionsToUploadLocal to JSON.
         * @function toJSON
         * @memberof file.OptionsToUploadLocal
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        OptionsToUploadLocal.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for OptionsToUploadLocal
         * @function getTypeUrl
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        OptionsToUploadLocal.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.OptionsToUploadLocal";
        };

        return OptionsToUploadLocal;
    })();

    file.WatchUploadRequestBody = (function() {

        /**
         * Properties of a WatchUploadRequestBody.
         * @memberof file
         * @interface IWatchUploadRequestBody
         * @property {number|Long|null} [uploadTaskId] WatchUploadRequestBody uploadTaskId
         */

        /**
         * Constructs a new WatchUploadRequestBody.
         * @memberof file
         * @classdesc Represents a WatchUploadRequestBody.
         * @implements IWatchUploadRequestBody
         * @constructor
         * @param {file.IWatchUploadRequestBody=} [properties] Properties to set
         */
        function WatchUploadRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * WatchUploadRequestBody uploadTaskId.
         * @member {number|Long} uploadTaskId
         * @memberof file.WatchUploadRequestBody
         * @instance
         */
        WatchUploadRequestBody.prototype.uploadTaskId = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new WatchUploadRequestBody instance using the specified properties.
         * @function create
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {file.IWatchUploadRequestBody=} [properties] Properties to set
         * @returns {file.WatchUploadRequestBody} WatchUploadRequestBody instance
         */
        WatchUploadRequestBody.create = function create(properties) {
            return new WatchUploadRequestBody(properties);
        };

        /**
         * Encodes the specified WatchUploadRequestBody message. Does not implicitly {@link file.WatchUploadRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {file.IWatchUploadRequestBody} message WatchUploadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WatchUploadRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.uploadTaskId);
            return writer;
        };

        /**
         * Encodes the specified WatchUploadRequestBody message, length delimited. Does not implicitly {@link file.WatchUploadRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {file.IWatchUploadRequestBody} message WatchUploadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WatchUploadRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a WatchUploadRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.WatchUploadRequestBody} WatchUploadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WatchUploadRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.WatchUploadRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.uploadTaskId = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a WatchUploadRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.WatchUploadRequestBody} WatchUploadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WatchUploadRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a WatchUploadRequestBody message.
         * @function verify
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        WatchUploadRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                if (!$util.isInteger(message.uploadTaskId) && !(message.uploadTaskId && $util.isInteger(message.uploadTaskId.low) && $util.isInteger(message.uploadTaskId.high)))
                    return "uploadTaskId: integer|Long expected";
            return null;
        };

        /**
         * Creates a WatchUploadRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.WatchUploadRequestBody} WatchUploadRequestBody
         */
        WatchUploadRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.WatchUploadRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.WatchUploadRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.WatchUploadRequestBody();
            if (object.uploadTaskId != null)
                if ($util.Long)
                    message.uploadTaskId = $util.Long.fromValue(object.uploadTaskId, true);
                else if (typeof object.uploadTaskId === "string")
                    message.uploadTaskId = parseInt(object.uploadTaskId, 10);
                else if (typeof object.uploadTaskId === "number")
                    message.uploadTaskId = object.uploadTaskId;
                else if (typeof object.uploadTaskId === "object")
                    message.uploadTaskId = new $util.LongBits(object.uploadTaskId.low >>> 0, object.uploadTaskId.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from a WatchUploadRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {file.WatchUploadRequestBody} message WatchUploadRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        WatchUploadRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.uploadTaskId = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.uploadTaskId = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.uploadTaskId = typeof message.uploadTaskId === "number" ? BigInt(message.uploadTaskId) : $util.Long.fromBits(message.uploadTaskId.low >>> 0, message.uploadTaskId.high >>> 0, true).toBigInt();
                else if (typeof message.uploadTaskId === "number")
                    object.uploadTaskId = options.longs === String ? String(message.uploadTaskId) : message.uploadTaskId;
                else
                    object.uploadTaskId = options.longs === String ? $util.Long.prototype.toString.call(message.uploadTaskId) : options.longs === Number ? new $util.LongBits(message.uploadTaskId.low >>> 0, message.uploadTaskId.high >>> 0).toNumber(true) : message.uploadTaskId;
            return object;
        };

        /**
         * Converts this WatchUploadRequestBody to JSON.
         * @function toJSON
         * @memberof file.WatchUploadRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        WatchUploadRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for WatchUploadRequestBody
         * @function getTypeUrl
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        WatchUploadRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.WatchUploadRequestBody";
        };

        return WatchUploadRequestBody;
    })();

    file.UploadEventMsg = (function() {

        /**
         * Properties of an UploadEventMsg.
         * @memberof file
         * @interface IUploadEventMsg
         * @property {string|null} [type] UploadEventMsg type
         * @property {number|Long|null} [uploadTaskId] UploadEventMsg uploadTaskId
         * @property {number|Long|null} [localVersion] UploadEventMsg localVersion
         * @property {number|Long|null} [uploadVersion] UploadEventMsg uploadVersion
         */

        /**
         * Constructs a new UploadEventMsg.
         * @memberof file
         * @classdesc Represents an UploadEventMsg.
         * @implements IUploadEventMsg
         * @constructor
         * @param {file.IUploadEventMsg=} [properties] Properties to set
         */
        function UploadEventMsg(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * UploadEventMsg type.
         * @member {string} type
         * @memberof file.UploadEventMsg
         * @instance
         */
        UploadEventMsg.prototype.type = "";

        /**
         * UploadEventMsg uploadTaskId.
         * @member {number|Long} uploadTaskId
         * @memberof file.UploadEventMsg
         * @instance
         */
        UploadEventMsg.prototype.uploadTaskId = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * UploadEventMsg localVersion.
         * @member {number|Long} localVersion
         * @memberof file.UploadEventMsg
         * @instance
         */
        UploadEventMsg.prototype.localVersion = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * UploadEventMsg uploadVersion.
         * @member {number|Long} uploadVersion
         * @memberof file.UploadEventMsg
         * @instance
         */
        UploadEventMsg.prototype.uploadVersion = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new UploadEventMsg instance using the specified properties.
         * @function create
         * @memberof file.UploadEventMsg
         * @static
         * @param {file.IUploadEventMsg=} [properties] Properties to set
         * @returns {file.UploadEventMsg} UploadEventMsg instance
         */
        UploadEventMsg.create = function create(properties) {
            return new UploadEventMsg(properties);
        };

        /**
         * Encodes the specified UploadEventMsg message. Does not implicitly {@link file.UploadEventMsg.verify|verify} messages.
         * @function encode
         * @memberof file.UploadEventMsg
         * @static
         * @param {file.IUploadEventMsg} message UploadEventMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UploadEventMsg.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.type);
            if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.uploadTaskId);
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.localVersion);
            if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                writer.uint32(/* id 4, wireType 0 =*/32).uint64(message.uploadVersion);
            return writer;
        };

        /**
         * Encodes the specified UploadEventMsg message, length delimited. Does not implicitly {@link file.UploadEventMsg.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.UploadEventMsg
         * @static
         * @param {file.IUploadEventMsg} message UploadEventMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UploadEventMsg.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an UploadEventMsg message from the specified reader or buffer.
         * @function decode
         * @memberof file.UploadEventMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.UploadEventMsg} UploadEventMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UploadEventMsg.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.UploadEventMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.type = reader.string();
                        break;
                    }
                case 2: {
                        message.uploadTaskId = reader.uint64();
                        break;
                    }
                case 3: {
                        message.localVersion = reader.uint64();
                        break;
                    }
                case 4: {
                        message.uploadVersion = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an UploadEventMsg message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.UploadEventMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.UploadEventMsg} UploadEventMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UploadEventMsg.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an UploadEventMsg message.
         * @function verify
         * @memberof file.UploadEventMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        UploadEventMsg.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                if (!$util.isInteger(message.uploadTaskId) && !(message.uploadTaskId && $util.isInteger(message.uploadTaskId.low) && $util.isInteger(message.uploadTaskId.high)))
                    return "uploadTaskId: integer|Long expected";
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                if (!$util.isInteger(message.localVersion) && !(message.localVersion && $util.isInteger(message.localVersion.low) && $util.isInteger(message.localVersion.high)))
                    return "localVersion: integer|Long expected";
            if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                if (!$util.isInteger(message.uploadVersion) && !(message.uploadVersion && $util.isInteger(message.uploadVersion.low) && $util.isInteger(message.uploadVersion.high)))
                    return "uploadVersion: integer|Long expected";
            return null;
        };

        /**
         * Creates an UploadEventMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.UploadEventMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.UploadEventMsg} UploadEventMsg
         */
        UploadEventMsg.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.UploadEventMsg)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.UploadEventMsg: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.UploadEventMsg();
            if (object.type != null)
                message.type = String(object.type);
            if (object.uploadTaskId != null)
                if ($util.Long)
                    message.uploadTaskId = $util.Long.fromValue(object.uploadTaskId, true);
                else if (typeof object.uploadTaskId === "string")
                    message.uploadTaskId = parseInt(object.uploadTaskId, 10);
                else if (typeof object.uploadTaskId === "number")
                    message.uploadTaskId = object.uploadTaskId;
                else if (typeof object.uploadTaskId === "object")
                    message.uploadTaskId = new $util.LongBits(object.uploadTaskId.low >>> 0, object.uploadTaskId.high >>> 0).toNumber(true);
            if (object.localVersion != null)
                if ($util.Long)
                    message.localVersion = $util.Long.fromValue(object.localVersion, true);
                else if (typeof object.localVersion === "string")
                    message.localVersion = parseInt(object.localVersion, 10);
                else if (typeof object.localVersion === "number")
                    message.localVersion = object.localVersion;
                else if (typeof object.localVersion === "object")
                    message.localVersion = new $util.LongBits(object.localVersion.low >>> 0, object.localVersion.high >>> 0).toNumber(true);
            if (object.uploadVersion != null)
                if ($util.Long)
                    message.uploadVersion = $util.Long.fromValue(object.uploadVersion, true);
                else if (typeof object.uploadVersion === "string")
                    message.uploadVersion = parseInt(object.uploadVersion, 10);
                else if (typeof object.uploadVersion === "number")
                    message.uploadVersion = object.uploadVersion;
                else if (typeof object.uploadVersion === "object")
                    message.uploadVersion = new $util.LongBits(object.uploadVersion.low >>> 0, object.uploadVersion.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from an UploadEventMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.UploadEventMsg
         * @static
         * @param {file.UploadEventMsg} message UploadEventMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        UploadEventMsg.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.type = "";
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.uploadTaskId = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.uploadTaskId = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.localVersion = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.localVersion = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.uploadVersion = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.uploadVersion = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            }
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                object.type = message.type;
            if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.uploadTaskId = typeof message.uploadTaskId === "number" ? BigInt(message.uploadTaskId) : $util.Long.fromBits(message.uploadTaskId.low >>> 0, message.uploadTaskId.high >>> 0, true).toBigInt();
                else if (typeof message.uploadTaskId === "number")
                    object.uploadTaskId = options.longs === String ? String(message.uploadTaskId) : message.uploadTaskId;
                else
                    object.uploadTaskId = options.longs === String ? $util.Long.prototype.toString.call(message.uploadTaskId) : options.longs === Number ? new $util.LongBits(message.uploadTaskId.low >>> 0, message.uploadTaskId.high >>> 0).toNumber(true) : message.uploadTaskId;
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.localVersion = typeof message.localVersion === "number" ? BigInt(message.localVersion) : $util.Long.fromBits(message.localVersion.low >>> 0, message.localVersion.high >>> 0, true).toBigInt();
                else if (typeof message.localVersion === "number")
                    object.localVersion = options.longs === String ? String(message.localVersion) : message.localVersion;
                else
                    object.localVersion = options.longs === String ? $util.Long.prototype.toString.call(message.localVersion) : options.longs === Number ? new $util.LongBits(message.localVersion.low >>> 0, message.localVersion.high >>> 0).toNumber(true) : message.localVersion;
            if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.uploadVersion = typeof message.uploadVersion === "number" ? BigInt(message.uploadVersion) : $util.Long.fromBits(message.uploadVersion.low >>> 0, message.uploadVersion.high >>> 0, true).toBigInt();
                else if (typeof message.uploadVersion === "number")
                    object.uploadVersion = options.longs === String ? String(message.uploadVersion) : message.uploadVersion;
                else
                    object.uploadVersion = options.longs === String ? $util.Long.prototype.toString.call(message.uploadVersion) : options.longs === Number ? new $util.LongBits(message.uploadVersion.low >>> 0, message.uploadVersion.high >>> 0).toNumber(true) : message.uploadVersion;
            return object;
        };

        /**
         * Converts this UploadEventMsg to JSON.
         * @function toJSON
         * @memberof file.UploadEventMsg
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        UploadEventMsg.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for UploadEventMsg
         * @function getTypeUrl
         * @memberof file.UploadEventMsg
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        UploadEventMsg.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.UploadEventMsg";
        };

        return UploadEventMsg;
    })();

    return file;
})();

module.exports = $root;

},{"protobufjs/minimal":84}],30:[function(require,module,exports){
/*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.rpc = (function() {

    /**
     * Namespace rpc.
     * @exports rpc
     * @namespace
     */
    var rpc = {};

    rpc.AppRPCRequestBody = (function() {

        /**
         * Properties of an AppRPCRequestBody.
         * @memberof rpc
         * @interface IAppRPCRequestBody
         * @property {string|null} [service] AppRPCRequestBody service
         */

        /**
         * Constructs a new AppRPCRequestBody.
         * @memberof rpc
         * @classdesc Represents an AppRPCRequestBody.
         * @implements IAppRPCRequestBody
         * @constructor
         * @param {rpc.IAppRPCRequestBody=} [properties] Properties to set
         */
        function AppRPCRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * AppRPCRequestBody service.
         * @member {string} service
         * @memberof rpc.AppRPCRequestBody
         * @instance
         */
        AppRPCRequestBody.prototype.service = "";

        /**
         * Creates a new AppRPCRequestBody instance using the specified properties.
         * @function create
         * @memberof rpc.AppRPCRequestBody
         * @static
         * @param {rpc.IAppRPCRequestBody=} [properties] Properties to set
         * @returns {rpc.AppRPCRequestBody} AppRPCRequestBody instance
         */
        AppRPCRequestBody.create = function create(properties) {
            return new AppRPCRequestBody(properties);
        };

        /**
         * Encodes the specified AppRPCRequestBody message. Does not implicitly {@link rpc.AppRPCRequestBody.verify|verify} messages.
         * @function encode
         * @memberof rpc.AppRPCRequestBody
         * @static
         * @param {rpc.IAppRPCRequestBody} message AppRPCRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AppRPCRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.service != null && Object.hasOwnProperty.call(message, "service"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.service);
            return writer;
        };

        /**
         * Encodes the specified AppRPCRequestBody message, length delimited. Does not implicitly {@link rpc.AppRPCRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof rpc.AppRPCRequestBody
         * @static
         * @param {rpc.IAppRPCRequestBody} message AppRPCRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AppRPCRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an AppRPCRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof rpc.AppRPCRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {rpc.AppRPCRequestBody} AppRPCRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AppRPCRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.rpc.AppRPCRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.service = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an AppRPCRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof rpc.AppRPCRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {rpc.AppRPCRequestBody} AppRPCRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AppRPCRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an AppRPCRequestBody message.
         * @function verify
         * @memberof rpc.AppRPCRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        AppRPCRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.service != null && Object.hasOwnProperty.call(message, "service"))
                if (!$util.isString(message.service))
                    return "service: string expected";
            return null;
        };

        /**
         * Creates an AppRPCRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof rpc.AppRPCRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {rpc.AppRPCRequestBody} AppRPCRequestBody
         */
        AppRPCRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.rpc.AppRPCRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".rpc.AppRPCRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.rpc.AppRPCRequestBody();
            if (object.service != null)
                message.service = String(object.service);
            return message;
        };

        /**
         * Creates a plain object from an AppRPCRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof rpc.AppRPCRequestBody
         * @static
         * @param {rpc.AppRPCRequestBody} message AppRPCRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        AppRPCRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.service = "";
            if (message.service != null && Object.hasOwnProperty.call(message, "service"))
                object.service = message.service;
            return object;
        };

        /**
         * Converts this AppRPCRequestBody to JSON.
         * @function toJSON
         * @memberof rpc.AppRPCRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        AppRPCRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for AppRPCRequestBody
         * @function getTypeUrl
         * @memberof rpc.AppRPCRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        AppRPCRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/rpc.AppRPCRequestBody";
        };

        return AppRPCRequestBody;
    })();

    rpc.OtherAppsRPCRequestBody = (function() {

        /**
         * Properties of an OtherAppsRPCRequestBody.
         * @memberof rpc
         * @interface IOtherAppsRPCRequestBody
         * @property {string|null} [appDomain] OtherAppsRPCRequestBody appDomain
         * @property {string|null} [service] OtherAppsRPCRequestBody service
         */

        /**
         * Constructs a new OtherAppsRPCRequestBody.
         * @memberof rpc
         * @classdesc Represents an OtherAppsRPCRequestBody.
         * @implements IOtherAppsRPCRequestBody
         * @constructor
         * @param {rpc.IOtherAppsRPCRequestBody=} [properties] Properties to set
         */
        function OtherAppsRPCRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * OtherAppsRPCRequestBody appDomain.
         * @member {string} appDomain
         * @memberof rpc.OtherAppsRPCRequestBody
         * @instance
         */
        OtherAppsRPCRequestBody.prototype.appDomain = "";

        /**
         * OtherAppsRPCRequestBody service.
         * @member {string} service
         * @memberof rpc.OtherAppsRPCRequestBody
         * @instance
         */
        OtherAppsRPCRequestBody.prototype.service = "";

        /**
         * Creates a new OtherAppsRPCRequestBody instance using the specified properties.
         * @function create
         * @memberof rpc.OtherAppsRPCRequestBody
         * @static
         * @param {rpc.IOtherAppsRPCRequestBody=} [properties] Properties to set
         * @returns {rpc.OtherAppsRPCRequestBody} OtherAppsRPCRequestBody instance
         */
        OtherAppsRPCRequestBody.create = function create(properties) {
            return new OtherAppsRPCRequestBody(properties);
        };

        /**
         * Encodes the specified OtherAppsRPCRequestBody message. Does not implicitly {@link rpc.OtherAppsRPCRequestBody.verify|verify} messages.
         * @function encode
         * @memberof rpc.OtherAppsRPCRequestBody
         * @static
         * @param {rpc.IOtherAppsRPCRequestBody} message OtherAppsRPCRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        OtherAppsRPCRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.appDomain != null && Object.hasOwnProperty.call(message, "appDomain"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.appDomain);
            if (message.service != null && Object.hasOwnProperty.call(message, "service"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.service);
            return writer;
        };

        /**
         * Encodes the specified OtherAppsRPCRequestBody message, length delimited. Does not implicitly {@link rpc.OtherAppsRPCRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof rpc.OtherAppsRPCRequestBody
         * @static
         * @param {rpc.IOtherAppsRPCRequestBody} message OtherAppsRPCRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        OtherAppsRPCRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an OtherAppsRPCRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof rpc.OtherAppsRPCRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {rpc.OtherAppsRPCRequestBody} OtherAppsRPCRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        OtherAppsRPCRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.rpc.OtherAppsRPCRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.appDomain = reader.string();
                        break;
                    }
                case 2: {
                        message.service = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an OtherAppsRPCRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof rpc.OtherAppsRPCRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {rpc.OtherAppsRPCRequestBody} OtherAppsRPCRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        OtherAppsRPCRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an OtherAppsRPCRequestBody message.
         * @function verify
         * @memberof rpc.OtherAppsRPCRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        OtherAppsRPCRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.appDomain != null && Object.hasOwnProperty.call(message, "appDomain"))
                if (!$util.isString(message.appDomain))
                    return "appDomain: string expected";
            if (message.service != null && Object.hasOwnProperty.call(message, "service"))
                if (!$util.isString(message.service))
                    return "service: string expected";
            return null;
        };

        /**
         * Creates an OtherAppsRPCRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof rpc.OtherAppsRPCRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {rpc.OtherAppsRPCRequestBody} OtherAppsRPCRequestBody
         */
        OtherAppsRPCRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.rpc.OtherAppsRPCRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".rpc.OtherAppsRPCRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.rpc.OtherAppsRPCRequestBody();
            if (object.appDomain != null)
                message.appDomain = String(object.appDomain);
            if (object.service != null)
                message.service = String(object.service);
            return message;
        };

        /**
         * Creates a plain object from an OtherAppsRPCRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof rpc.OtherAppsRPCRequestBody
         * @static
         * @param {rpc.OtherAppsRPCRequestBody} message OtherAppsRPCRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        OtherAppsRPCRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.appDomain = "";
                object.service = "";
            }
            if (message.appDomain != null && Object.hasOwnProperty.call(message, "appDomain"))
                object.appDomain = message.appDomain;
            if (message.service != null && Object.hasOwnProperty.call(message, "service"))
                object.service = message.service;
            return object;
        };

        /**
         * Converts this OtherAppsRPCRequestBody to JSON.
         * @function toJSON
         * @memberof rpc.OtherAppsRPCRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        OtherAppsRPCRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for OtherAppsRPCRequestBody
         * @function getTypeUrl
         * @memberof rpc.OtherAppsRPCRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        OtherAppsRPCRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/rpc.OtherAppsRPCRequestBody";
        };

        return OtherAppsRPCRequestBody;
    })();

    rpc.AllocateProxyRequestBody = (function() {

        /**
         * Properties of an AllocateProxyRequestBody.
         * @memberof rpc
         * @interface IAllocateProxyRequestBody
         * @property {number|null} [objRef] AllocateProxyRequestBody objRef
         * @property {Array.<rpc.AllocateProxyRequestBody.IMember>|null} [members] AllocateProxyRequestBody members
         */

        /**
         * Constructs a new AllocateProxyRequestBody.
         * @memberof rpc
         * @classdesc Represents an AllocateProxyRequestBody.
         * @implements IAllocateProxyRequestBody
         * @constructor
         * @param {rpc.IAllocateProxyRequestBody=} [properties] Properties to set
         */
        function AllocateProxyRequestBody(properties) {
            this.members = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * AllocateProxyRequestBody objRef.
         * @member {number} objRef
         * @memberof rpc.AllocateProxyRequestBody
         * @instance
         */
        AllocateProxyRequestBody.prototype.objRef = 0;

        /**
         * AllocateProxyRequestBody members.
         * @member {Array.<rpc.AllocateProxyRequestBody.IMember>} members
         * @memberof rpc.AllocateProxyRequestBody
         * @instance
         */
        AllocateProxyRequestBody.prototype.members = $util.emptyArray;

        /**
         * Creates a new AllocateProxyRequestBody instance using the specified properties.
         * @function create
         * @memberof rpc.AllocateProxyRequestBody
         * @static
         * @param {rpc.IAllocateProxyRequestBody=} [properties] Properties to set
         * @returns {rpc.AllocateProxyRequestBody} AllocateProxyRequestBody instance
         */
        AllocateProxyRequestBody.create = function create(properties) {
            return new AllocateProxyRequestBody(properties);
        };

        /**
         * Encodes the specified AllocateProxyRequestBody message. Does not implicitly {@link rpc.AllocateProxyRequestBody.verify|verify} messages.
         * @function encode
         * @memberof rpc.AllocateProxyRequestBody
         * @static
         * @param {rpc.IAllocateProxyRequestBody} message AllocateProxyRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AllocateProxyRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.objRef != null && Object.hasOwnProperty.call(message, "objRef"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.objRef);
            if (message.members != null && message.members.length)
                for (var i = 0; i < message.members.length; ++i)
                    $root.rpc.AllocateProxyRequestBody.Member.encode(message.members[i], writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified AllocateProxyRequestBody message, length delimited. Does not implicitly {@link rpc.AllocateProxyRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof rpc.AllocateProxyRequestBody
         * @static
         * @param {rpc.IAllocateProxyRequestBody} message AllocateProxyRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AllocateProxyRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an AllocateProxyRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof rpc.AllocateProxyRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {rpc.AllocateProxyRequestBody} AllocateProxyRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AllocateProxyRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.rpc.AllocateProxyRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.objRef = reader.uint32();
                        break;
                    }
                case 2: {
                        if (!(message.members && message.members.length))
                            message.members = [];
                        message.members.push($root.rpc.AllocateProxyRequestBody.Member.decode(reader, reader.uint32(), undefined, long + 1));
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an AllocateProxyRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof rpc.AllocateProxyRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {rpc.AllocateProxyRequestBody} AllocateProxyRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AllocateProxyRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an AllocateProxyRequestBody message.
         * @function verify
         * @memberof rpc.AllocateProxyRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        AllocateProxyRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.objRef != null && Object.hasOwnProperty.call(message, "objRef"))
                if (!$util.isInteger(message.objRef))
                    return "objRef: integer expected";
            if (message.members != null && Object.hasOwnProperty.call(message, "members")) {
                if (!Array.isArray(message.members))
                    return "members: array expected";
                for (var i = 0; i < message.members.length; ++i) {
                    var error = $root.rpc.AllocateProxyRequestBody.Member.verify(message.members[i], long + 1);
                    if (error)
                        return "members." + error;
                }
            }
            return null;
        };

        /**
         * Creates an AllocateProxyRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof rpc.AllocateProxyRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {rpc.AllocateProxyRequestBody} AllocateProxyRequestBody
         */
        AllocateProxyRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.rpc.AllocateProxyRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".rpc.AllocateProxyRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.rpc.AllocateProxyRequestBody();
            if (object.objRef != null)
                message.objRef = object.objRef >>> 0;
            if (object.members) {
                if (!Array.isArray(object.members))
                    throw TypeError(".rpc.AllocateProxyRequestBody.members: array expected");
                message.members = [];
                for (var i = 0; i < object.members.length; ++i) {
                    if (!$util.isObject(object.members[i]))
                        throw TypeError(".rpc.AllocateProxyRequestBody.members: object expected");
                    message.members[i] = $root.rpc.AllocateProxyRequestBody.Member.fromObject(object.members[i], long + 1);
                }
            }
            return message;
        };

        /**
         * Creates a plain object from an AllocateProxyRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof rpc.AllocateProxyRequestBody
         * @static
         * @param {rpc.AllocateProxyRequestBody} message AllocateProxyRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        AllocateProxyRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.members = [];
            if (options.defaults)
                object.objRef = 0;
            if (message.objRef != null && Object.hasOwnProperty.call(message, "objRef"))
                object.objRef = message.objRef;
            if (message.members && message.members.length) {
                object.members = [];
                for (var j = 0; j < message.members.length; ++j)
                    object.members[j] = $root.rpc.AllocateProxyRequestBody.Member.toObject(message.members[j], options, q + 1);
            }
            return object;
        };

        /**
         * Converts this AllocateProxyRequestBody to JSON.
         * @function toJSON
         * @memberof rpc.AllocateProxyRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        AllocateProxyRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for AllocateProxyRequestBody
         * @function getTypeUrl
         * @memberof rpc.AllocateProxyRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        AllocateProxyRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/rpc.AllocateProxyRequestBody";
        };

        AllocateProxyRequestBody.Member = (function() {

            /**
             * Properties of a Member.
             * @memberof rpc.AllocateProxyRequestBody
             * @interface IMember
             * @property {boolean|null} [isObj] Member isObj
             * @property {string|null} [name] Member name
             * @property {Array.<rpc.AllocateProxyRequestBody.IMember>|null} [members] Member members
             */

            /**
             * Constructs a new Member.
             * @memberof rpc.AllocateProxyRequestBody
             * @classdesc Represents a Member.
             * @implements IMember
             * @constructor
             * @param {rpc.AllocateProxyRequestBody.IMember=} [properties] Properties to set
             */
            function Member(properties) {
                this.members = [];
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * Member isObj.
             * @member {boolean} isObj
             * @memberof rpc.AllocateProxyRequestBody.Member
             * @instance
             */
            Member.prototype.isObj = false;

            /**
             * Member name.
             * @member {string} name
             * @memberof rpc.AllocateProxyRequestBody.Member
             * @instance
             */
            Member.prototype.name = "";

            /**
             * Member members.
             * @member {Array.<rpc.AllocateProxyRequestBody.IMember>} members
             * @memberof rpc.AllocateProxyRequestBody.Member
             * @instance
             */
            Member.prototype.members = $util.emptyArray;

            /**
             * Creates a new Member instance using the specified properties.
             * @function create
             * @memberof rpc.AllocateProxyRequestBody.Member
             * @static
             * @param {rpc.AllocateProxyRequestBody.IMember=} [properties] Properties to set
             * @returns {rpc.AllocateProxyRequestBody.Member} Member instance
             */
            Member.create = function create(properties) {
                return new Member(properties);
            };

            /**
             * Encodes the specified Member message. Does not implicitly {@link rpc.AllocateProxyRequestBody.Member.verify|verify} messages.
             * @function encode
             * @memberof rpc.AllocateProxyRequestBody.Member
             * @static
             * @param {rpc.AllocateProxyRequestBody.IMember} message Member message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Member.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.isObj != null && Object.hasOwnProperty.call(message, "isObj"))
                    writer.uint32(/* id 1, wireType 0 =*/8).bool(message.isObj);
                if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.name);
                if (message.members != null && message.members.length)
                    for (var i = 0; i < message.members.length; ++i)
                        $root.rpc.AllocateProxyRequestBody.Member.encode(message.members[i], writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
                return writer;
            };

            /**
             * Encodes the specified Member message, length delimited. Does not implicitly {@link rpc.AllocateProxyRequestBody.Member.verify|verify} messages.
             * @function encodeDelimited
             * @memberof rpc.AllocateProxyRequestBody.Member
             * @static
             * @param {rpc.AllocateProxyRequestBody.IMember} message Member message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Member.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes a Member message from the specified reader or buffer.
             * @function decode
             * @memberof rpc.AllocateProxyRequestBody.Member
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {rpc.AllocateProxyRequestBody.Member} Member
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Member.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.rpc.AllocateProxyRequestBody.Member();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.isObj = reader.bool();
                            break;
                        }
                    case 2: {
                            message.name = reader.string();
                            break;
                        }
                    case 3: {
                            if (!(message.members && message.members.length))
                                message.members = [];
                            message.members.push($root.rpc.AllocateProxyRequestBody.Member.decode(reader, reader.uint32(), undefined, long + 1));
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a Member message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof rpc.AllocateProxyRequestBody.Member
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {rpc.AllocateProxyRequestBody.Member} Member
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Member.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a Member message.
             * @function verify
             * @memberof rpc.AllocateProxyRequestBody.Member
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            Member.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.isObj != null && Object.hasOwnProperty.call(message, "isObj"))
                    if (typeof message.isObj !== "boolean")
                        return "isObj: boolean expected";
                if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                    if (!$util.isString(message.name))
                        return "name: string expected";
                if (message.members != null && Object.hasOwnProperty.call(message, "members")) {
                    if (!Array.isArray(message.members))
                        return "members: array expected";
                    for (var i = 0; i < message.members.length; ++i) {
                        var error = $root.rpc.AllocateProxyRequestBody.Member.verify(message.members[i], long + 1);
                        if (error)
                            return "members." + error;
                    }
                }
                return null;
            };

            /**
             * Creates a Member message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof rpc.AllocateProxyRequestBody.Member
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {rpc.AllocateProxyRequestBody.Member} Member
             */
            Member.fromObject = function fromObject(object, long) {
                if (object instanceof $root.rpc.AllocateProxyRequestBody.Member)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".rpc.AllocateProxyRequestBody.Member: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.rpc.AllocateProxyRequestBody.Member();
                if (object.isObj != null)
                    message.isObj = Boolean(object.isObj);
                if (object.name != null)
                    message.name = String(object.name);
                if (object.members) {
                    if (!Array.isArray(object.members))
                        throw TypeError(".rpc.AllocateProxyRequestBody.Member.members: array expected");
                    message.members = [];
                    for (var i = 0; i < object.members.length; ++i) {
                        if (!$util.isObject(object.members[i]))
                            throw TypeError(".rpc.AllocateProxyRequestBody.Member.members: object expected");
                        message.members[i] = $root.rpc.AllocateProxyRequestBody.Member.fromObject(object.members[i], long + 1);
                    }
                }
                return message;
            };

            /**
             * Creates a plain object from a Member message. Also converts values to other types if specified.
             * @function toObject
             * @memberof rpc.AllocateProxyRequestBody.Member
             * @static
             * @param {rpc.AllocateProxyRequestBody.Member} message Member
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            Member.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.arrays || options.defaults)
                    object.members = [];
                if (options.defaults) {
                    object.isObj = false;
                    object.name = "";
                }
                if (message.isObj != null && Object.hasOwnProperty.call(message, "isObj"))
                    object.isObj = message.isObj;
                if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                    object.name = message.name;
                if (message.members && message.members.length) {
                    object.members = [];
                    for (var j = 0; j < message.members.length; ++j)
                        object.members[j] = $root.rpc.AllocateProxyRequestBody.Member.toObject(message.members[j], options, q + 1);
                }
                return object;
            };

            /**
             * Converts this Member to JSON.
             * @function toJSON
             * @memberof rpc.AllocateProxyRequestBody.Member
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            Member.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for Member
             * @function getTypeUrl
             * @memberof rpc.AllocateProxyRequestBody.Member
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            Member.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/rpc.AllocateProxyRequestBody.Member";
            };

            return Member;
        })();

        return AllocateProxyRequestBody;
    })();

    rpc.CallStartRequestBody = (function() {

        /**
         * Properties of a CallStartRequestBody.
         * @memberof rpc
         * @interface ICallStartRequestBody
         * @property {string|null} [method] CallStartRequestBody method
         * @property {rpc.IPassedDatum|null} [req] CallStartRequestBody req
         */

        /**
         * Constructs a new CallStartRequestBody.
         * @memberof rpc
         * @classdesc Represents a CallStartRequestBody.
         * @implements ICallStartRequestBody
         * @constructor
         * @param {rpc.ICallStartRequestBody=} [properties] Properties to set
         */
        function CallStartRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * CallStartRequestBody method.
         * @member {string} method
         * @memberof rpc.CallStartRequestBody
         * @instance
         */
        CallStartRequestBody.prototype.method = "";

        /**
         * CallStartRequestBody req.
         * @member {rpc.IPassedDatum|null|undefined} req
         * @memberof rpc.CallStartRequestBody
         * @instance
         */
        CallStartRequestBody.prototype.req = null;

        /**
         * Creates a new CallStartRequestBody instance using the specified properties.
         * @function create
         * @memberof rpc.CallStartRequestBody
         * @static
         * @param {rpc.ICallStartRequestBody=} [properties] Properties to set
         * @returns {rpc.CallStartRequestBody} CallStartRequestBody instance
         */
        CallStartRequestBody.create = function create(properties) {
            return new CallStartRequestBody(properties);
        };

        /**
         * Encodes the specified CallStartRequestBody message. Does not implicitly {@link rpc.CallStartRequestBody.verify|verify} messages.
         * @function encode
         * @memberof rpc.CallStartRequestBody
         * @static
         * @param {rpc.ICallStartRequestBody} message CallStartRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CallStartRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.method != null && Object.hasOwnProperty.call(message, "method"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.method);
            if (message.req != null && Object.hasOwnProperty.call(message, "req"))
                $root.rpc.PassedDatum.encode(message.req, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified CallStartRequestBody message, length delimited. Does not implicitly {@link rpc.CallStartRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof rpc.CallStartRequestBody
         * @static
         * @param {rpc.ICallStartRequestBody} message CallStartRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CallStartRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a CallStartRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof rpc.CallStartRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {rpc.CallStartRequestBody} CallStartRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CallStartRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.rpc.CallStartRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.method = reader.string();
                        break;
                    }
                case 2: {
                        message.req = $root.rpc.PassedDatum.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a CallStartRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof rpc.CallStartRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {rpc.CallStartRequestBody} CallStartRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CallStartRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a CallStartRequestBody message.
         * @function verify
         * @memberof rpc.CallStartRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        CallStartRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.method != null && Object.hasOwnProperty.call(message, "method"))
                if (!$util.isString(message.method))
                    return "method: string expected";
            if (message.req != null && Object.hasOwnProperty.call(message, "req")) {
                var error = $root.rpc.PassedDatum.verify(message.req, long + 1);
                if (error)
                    return "req." + error;
            }
            return null;
        };

        /**
         * Creates a CallStartRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof rpc.CallStartRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {rpc.CallStartRequestBody} CallStartRequestBody
         */
        CallStartRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.rpc.CallStartRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".rpc.CallStartRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.rpc.CallStartRequestBody();
            if (object.method != null)
                message.method = String(object.method);
            if (object.req != null) {
                if (!$util.isObject(object.req))
                    throw TypeError(".rpc.CallStartRequestBody.req: object expected");
                message.req = $root.rpc.PassedDatum.fromObject(object.req, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a CallStartRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof rpc.CallStartRequestBody
         * @static
         * @param {rpc.CallStartRequestBody} message CallStartRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        CallStartRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.method = "";
                object.req = null;
            }
            if (message.method != null && Object.hasOwnProperty.call(message, "method"))
                object.method = message.method;
            if (message.req != null && Object.hasOwnProperty.call(message, "req"))
                object.req = $root.rpc.PassedDatum.toObject(message.req, options, q + 1);
            return object;
        };

        /**
         * Converts this CallStartRequestBody to JSON.
         * @function toJSON
         * @memberof rpc.CallStartRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        CallStartRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for CallStartRequestBody
         * @function getTypeUrl
         * @memberof rpc.CallStartRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        CallStartRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/rpc.CallStartRequestBody";
        };

        return CallStartRequestBody;
    })();

    rpc.PassedDatum = (function() {

        /**
         * Properties of a PassedDatum.
         * @memberof rpc
         * @interface IPassedDatum
         * @property {Uint8Array|null} [bytes] PassedDatum bytes
         * @property {Array.<rpc.PassedDatum.IPassedObj>|null} [passedObjs] PassedDatum passedObjs
         */

        /**
         * Constructs a new PassedDatum.
         * @memberof rpc
         * @classdesc Represents a PassedDatum.
         * @implements IPassedDatum
         * @constructor
         * @param {rpc.IPassedDatum=} [properties] Properties to set
         */
        function PassedDatum(properties) {
            this.passedObjs = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * PassedDatum bytes.
         * @member {Uint8Array} bytes
         * @memberof rpc.PassedDatum
         * @instance
         */
        PassedDatum.prototype.bytes = $util.newBuffer([]);

        /**
         * PassedDatum passedObjs.
         * @member {Array.<rpc.PassedDatum.IPassedObj>} passedObjs
         * @memberof rpc.PassedDatum
         * @instance
         */
        PassedDatum.prototype.passedObjs = $util.emptyArray;

        /**
         * Creates a new PassedDatum instance using the specified properties.
         * @function create
         * @memberof rpc.PassedDatum
         * @static
         * @param {rpc.IPassedDatum=} [properties] Properties to set
         * @returns {rpc.PassedDatum} PassedDatum instance
         */
        PassedDatum.create = function create(properties) {
            return new PassedDatum(properties);
        };

        /**
         * Encodes the specified PassedDatum message. Does not implicitly {@link rpc.PassedDatum.verify|verify} messages.
         * @function encode
         * @memberof rpc.PassedDatum
         * @static
         * @param {rpc.IPassedDatum} message PassedDatum message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        PassedDatum.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.bytes);
            if (message.passedObjs != null && message.passedObjs.length)
                for (var i = 0; i < message.passedObjs.length; ++i)
                    $root.rpc.PassedDatum.PassedObj.encode(message.passedObjs[i], writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified PassedDatum message, length delimited. Does not implicitly {@link rpc.PassedDatum.verify|verify} messages.
         * @function encodeDelimited
         * @memberof rpc.PassedDatum
         * @static
         * @param {rpc.IPassedDatum} message PassedDatum message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        PassedDatum.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a PassedDatum message from the specified reader or buffer.
         * @function decode
         * @memberof rpc.PassedDatum
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {rpc.PassedDatum} PassedDatum
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        PassedDatum.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.rpc.PassedDatum();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.bytes = reader.bytes();
                        break;
                    }
                case 2: {
                        if (!(message.passedObjs && message.passedObjs.length))
                            message.passedObjs = [];
                        message.passedObjs.push($root.rpc.PassedDatum.PassedObj.decode(reader, reader.uint32(), undefined, long + 1));
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a PassedDatum message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof rpc.PassedDatum
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {rpc.PassedDatum} PassedDatum
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        PassedDatum.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a PassedDatum message.
         * @function verify
         * @memberof rpc.PassedDatum
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        PassedDatum.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                if (!(message.bytes && typeof message.bytes.length === "number" || $util.isString(message.bytes)))
                    return "bytes: buffer expected";
            if (message.passedObjs != null && Object.hasOwnProperty.call(message, "passedObjs")) {
                if (!Array.isArray(message.passedObjs))
                    return "passedObjs: array expected";
                for (var i = 0; i < message.passedObjs.length; ++i) {
                    var error = $root.rpc.PassedDatum.PassedObj.verify(message.passedObjs[i], long + 1);
                    if (error)
                        return "passedObjs." + error;
                }
            }
            return null;
        };

        /**
         * Creates a PassedDatum message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof rpc.PassedDatum
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {rpc.PassedDatum} PassedDatum
         */
        PassedDatum.fromObject = function fromObject(object, long) {
            if (object instanceof $root.rpc.PassedDatum)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".rpc.PassedDatum: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.rpc.PassedDatum();
            if (object.bytes != null)
                if (typeof object.bytes === "string")
                    $util.base64.decode(object.bytes, message.bytes = $util.newBuffer($util.base64.length(object.bytes)), 0);
                else if (object.bytes.length >= 0)
                    message.bytes = object.bytes;
            if (object.passedObjs) {
                if (!Array.isArray(object.passedObjs))
                    throw TypeError(".rpc.PassedDatum.passedObjs: array expected");
                message.passedObjs = [];
                for (var i = 0; i < object.passedObjs.length; ++i) {
                    if (!$util.isObject(object.passedObjs[i]))
                        throw TypeError(".rpc.PassedDatum.passedObjs: object expected");
                    message.passedObjs[i] = $root.rpc.PassedDatum.PassedObj.fromObject(object.passedObjs[i], long + 1);
                }
            }
            return message;
        };

        /**
         * Creates a plain object from a PassedDatum message. Also converts values to other types if specified.
         * @function toObject
         * @memberof rpc.PassedDatum
         * @static
         * @param {rpc.PassedDatum} message PassedDatum
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        PassedDatum.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.passedObjs = [];
            if (options.defaults)
                if (options.bytes === String)
                    object.bytes = "";
                else {
                    object.bytes = [];
                    if (options.bytes !== Array)
                        object.bytes = $util.newBuffer(object.bytes);
                }
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = options.bytes === String ? $util.base64.encode(message.bytes, 0, message.bytes.length) : options.bytes === Array ? Array.prototype.slice.call(message.bytes) : message.bytes;
            if (message.passedObjs && message.passedObjs.length) {
                object.passedObjs = [];
                for (var j = 0; j < message.passedObjs.length; ++j)
                    object.passedObjs[j] = $root.rpc.PassedDatum.PassedObj.toObject(message.passedObjs[j], options, q + 1);
            }
            return object;
        };

        /**
         * Converts this PassedDatum to JSON.
         * @function toJSON
         * @memberof rpc.PassedDatum
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        PassedDatum.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for PassedDatum
         * @function getTypeUrl
         * @memberof rpc.PassedDatum
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        PassedDatum.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/rpc.PassedDatum";
        };

        PassedDatum.PassedObj = (function() {

            /**
             * Properties of a PassedObj.
             * @memberof rpc.PassedDatum
             * @interface IPassedObj
             * @property {common.IObjectReference|null} [ref] PassedObj ref
             * @property {fs.IFS|null} [fs] PassedObj fs
             * @property {file.IFile|null} [file] PassedObj file
             */

            /**
             * Constructs a new PassedObj.
             * @memberof rpc.PassedDatum
             * @classdesc Represents a PassedObj.
             * @implements IPassedObj
             * @constructor
             * @param {rpc.PassedDatum.IPassedObj=} [properties] Properties to set
             */
            function PassedObj(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * PassedObj ref.
             * @member {common.IObjectReference|null|undefined} ref
             * @memberof rpc.PassedDatum.PassedObj
             * @instance
             */
            PassedObj.prototype.ref = null;

            /**
             * PassedObj fs.
             * @member {fs.IFS|null|undefined} fs
             * @memberof rpc.PassedDatum.PassedObj
             * @instance
             */
            PassedObj.prototype.fs = null;

            /**
             * PassedObj file.
             * @member {file.IFile|null|undefined} file
             * @memberof rpc.PassedDatum.PassedObj
             * @instance
             */
            PassedObj.prototype.file = null;

            /**
             * Creates a new PassedObj instance using the specified properties.
             * @function create
             * @memberof rpc.PassedDatum.PassedObj
             * @static
             * @param {rpc.PassedDatum.IPassedObj=} [properties] Properties to set
             * @returns {rpc.PassedDatum.PassedObj} PassedObj instance
             */
            PassedObj.create = function create(properties) {
                return new PassedObj(properties);
            };

            /**
             * Encodes the specified PassedObj message. Does not implicitly {@link rpc.PassedDatum.PassedObj.verify|verify} messages.
             * @function encode
             * @memberof rpc.PassedDatum.PassedObj
             * @static
             * @param {rpc.PassedDatum.IPassedObj} message PassedObj message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            PassedObj.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.ref != null && Object.hasOwnProperty.call(message, "ref"))
                    $root.common.ObjectReference.encode(message.ref, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
                if (message.fs != null && Object.hasOwnProperty.call(message, "fs"))
                    $root.fs.FS.encode(message.fs, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
                if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                    $root.file.File.encode(message.file, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
                return writer;
            };

            /**
             * Encodes the specified PassedObj message, length delimited. Does not implicitly {@link rpc.PassedDatum.PassedObj.verify|verify} messages.
             * @function encodeDelimited
             * @memberof rpc.PassedDatum.PassedObj
             * @static
             * @param {rpc.PassedDatum.IPassedObj} message PassedObj message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            PassedObj.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes a PassedObj message from the specified reader or buffer.
             * @function decode
             * @memberof rpc.PassedDatum.PassedObj
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {rpc.PassedDatum.PassedObj} PassedObj
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            PassedObj.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.rpc.PassedDatum.PassedObj();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.ref = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 2: {
                            message.fs = $root.fs.FS.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 3: {
                            message.file = $root.file.File.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a PassedObj message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof rpc.PassedDatum.PassedObj
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {rpc.PassedDatum.PassedObj} PassedObj
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            PassedObj.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a PassedObj message.
             * @function verify
             * @memberof rpc.PassedDatum.PassedObj
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            PassedObj.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.ref != null && Object.hasOwnProperty.call(message, "ref")) {
                    var error = $root.common.ObjectReference.verify(message.ref, long + 1);
                    if (error)
                        return "ref." + error;
                }
                if (message.fs != null && Object.hasOwnProperty.call(message, "fs")) {
                    var error = $root.fs.FS.verify(message.fs, long + 1);
                    if (error)
                        return "fs." + error;
                }
                if (message.file != null && Object.hasOwnProperty.call(message, "file")) {
                    var error = $root.file.File.verify(message.file, long + 1);
                    if (error)
                        return "file." + error;
                }
                return null;
            };

            /**
             * Creates a PassedObj message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof rpc.PassedDatum.PassedObj
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {rpc.PassedDatum.PassedObj} PassedObj
             */
            PassedObj.fromObject = function fromObject(object, long) {
                if (object instanceof $root.rpc.PassedDatum.PassedObj)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".rpc.PassedDatum.PassedObj: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.rpc.PassedDatum.PassedObj();
                if (object.ref != null) {
                    if (!$util.isObject(object.ref))
                        throw TypeError(".rpc.PassedDatum.PassedObj.ref: object expected");
                    message.ref = $root.common.ObjectReference.fromObject(object.ref, long + 1);
                }
                if (object.fs != null) {
                    if (!$util.isObject(object.fs))
                        throw TypeError(".rpc.PassedDatum.PassedObj.fs: object expected");
                    message.fs = $root.fs.FS.fromObject(object.fs, long + 1);
                }
                if (object.file != null) {
                    if (!$util.isObject(object.file))
                        throw TypeError(".rpc.PassedDatum.PassedObj.file: object expected");
                    message.file = $root.file.File.fromObject(object.file, long + 1);
                }
                return message;
            };

            /**
             * Creates a plain object from a PassedObj message. Also converts values to other types if specified.
             * @function toObject
             * @memberof rpc.PassedDatum.PassedObj
             * @static
             * @param {rpc.PassedDatum.PassedObj} message PassedObj
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            PassedObj.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults) {
                    object.ref = null;
                    object.fs = null;
                    object.file = null;
                }
                if (message.ref != null && Object.hasOwnProperty.call(message, "ref"))
                    object.ref = $root.common.ObjectReference.toObject(message.ref, options, q + 1);
                if (message.fs != null && Object.hasOwnProperty.call(message, "fs"))
                    object.fs = $root.fs.FS.toObject(message.fs, options, q + 1);
                if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                    object.file = $root.file.File.toObject(message.file, options, q + 1);
                return object;
            };

            /**
             * Converts this PassedObj to JSON.
             * @function toJSON
             * @memberof rpc.PassedDatum.PassedObj
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            PassedObj.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for PassedObj
             * @function getTypeUrl
             * @memberof rpc.PassedDatum.PassedObj
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            PassedObj.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/rpc.PassedDatum.PassedObj";
            };

            return PassedObj;
        })();

        return PassedDatum;
    })();

    rpc.ExposeSrvRequestBody = (function() {

        /**
         * Properties of an ExposeSrvRequestBody.
         * @memberof rpc
         * @interface IExposeSrvRequestBody
         * @property {string|null} [service] ExposeSrvRequestBody service
         */

        /**
         * Constructs a new ExposeSrvRequestBody.
         * @memberof rpc
         * @classdesc Represents an ExposeSrvRequestBody.
         * @implements IExposeSrvRequestBody
         * @constructor
         * @param {rpc.IExposeSrvRequestBody=} [properties] Properties to set
         */
        function ExposeSrvRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ExposeSrvRequestBody service.
         * @member {string} service
         * @memberof rpc.ExposeSrvRequestBody
         * @instance
         */
        ExposeSrvRequestBody.prototype.service = "";

        /**
         * Creates a new ExposeSrvRequestBody instance using the specified properties.
         * @function create
         * @memberof rpc.ExposeSrvRequestBody
         * @static
         * @param {rpc.IExposeSrvRequestBody=} [properties] Properties to set
         * @returns {rpc.ExposeSrvRequestBody} ExposeSrvRequestBody instance
         */
        ExposeSrvRequestBody.create = function create(properties) {
            return new ExposeSrvRequestBody(properties);
        };

        /**
         * Encodes the specified ExposeSrvRequestBody message. Does not implicitly {@link rpc.ExposeSrvRequestBody.verify|verify} messages.
         * @function encode
         * @memberof rpc.ExposeSrvRequestBody
         * @static
         * @param {rpc.IExposeSrvRequestBody} message ExposeSrvRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ExposeSrvRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.service != null && Object.hasOwnProperty.call(message, "service"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.service);
            return writer;
        };

        /**
         * Encodes the specified ExposeSrvRequestBody message, length delimited. Does not implicitly {@link rpc.ExposeSrvRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof rpc.ExposeSrvRequestBody
         * @static
         * @param {rpc.IExposeSrvRequestBody} message ExposeSrvRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ExposeSrvRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an ExposeSrvRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof rpc.ExposeSrvRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {rpc.ExposeSrvRequestBody} ExposeSrvRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ExposeSrvRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.rpc.ExposeSrvRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.service = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an ExposeSrvRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof rpc.ExposeSrvRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {rpc.ExposeSrvRequestBody} ExposeSrvRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ExposeSrvRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an ExposeSrvRequestBody message.
         * @function verify
         * @memberof rpc.ExposeSrvRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ExposeSrvRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.service != null && Object.hasOwnProperty.call(message, "service"))
                if (!$util.isString(message.service))
                    return "service: string expected";
            return null;
        };

        /**
         * Creates an ExposeSrvRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof rpc.ExposeSrvRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {rpc.ExposeSrvRequestBody} ExposeSrvRequestBody
         */
        ExposeSrvRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.rpc.ExposeSrvRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".rpc.ExposeSrvRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.rpc.ExposeSrvRequestBody();
            if (object.service != null)
                message.service = String(object.service);
            return message;
        };

        /**
         * Creates a plain object from an ExposeSrvRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof rpc.ExposeSrvRequestBody
         * @static
         * @param {rpc.ExposeSrvRequestBody} message ExposeSrvRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ExposeSrvRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.service = "";
            if (message.service != null && Object.hasOwnProperty.call(message, "service"))
                object.service = message.service;
            return object;
        };

        /**
         * Converts this ExposeSrvRequestBody to JSON.
         * @function toJSON
         * @memberof rpc.ExposeSrvRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ExposeSrvRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ExposeSrvRequestBody
         * @function getTypeUrl
         * @memberof rpc.ExposeSrvRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ExposeSrvRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/rpc.ExposeSrvRequestBody";
        };

        return ExposeSrvRequestBody;
    })();

    rpc.IncomingMsg = (function() {

        /**
         * Properties of an IncomingMsg.
         * @memberof rpc
         * @interface IIncomingMsg
         * @property {string|null} [msgType] IncomingMsg msgType
         * @property {number|null} [callNum] IncomingMsg callNum
         * @property {string|null} [method] IncomingMsg method
         * @property {rpc.IPassedDatum|null} [data] IncomingMsg data
         */

        /**
         * Constructs a new IncomingMsg.
         * @memberof rpc
         * @classdesc Represents an IncomingMsg.
         * @implements IIncomingMsg
         * @constructor
         * @param {rpc.IIncomingMsg=} [properties] Properties to set
         */
        function IncomingMsg(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * IncomingMsg msgType.
         * @member {string} msgType
         * @memberof rpc.IncomingMsg
         * @instance
         */
        IncomingMsg.prototype.msgType = "";

        /**
         * IncomingMsg callNum.
         * @member {number} callNum
         * @memberof rpc.IncomingMsg
         * @instance
         */
        IncomingMsg.prototype.callNum = 0;

        /**
         * IncomingMsg method.
         * @member {string} method
         * @memberof rpc.IncomingMsg
         * @instance
         */
        IncomingMsg.prototype.method = "";

        /**
         * IncomingMsg data.
         * @member {rpc.IPassedDatum|null|undefined} data
         * @memberof rpc.IncomingMsg
         * @instance
         */
        IncomingMsg.prototype.data = null;

        /**
         * Creates a new IncomingMsg instance using the specified properties.
         * @function create
         * @memberof rpc.IncomingMsg
         * @static
         * @param {rpc.IIncomingMsg=} [properties] Properties to set
         * @returns {rpc.IncomingMsg} IncomingMsg instance
         */
        IncomingMsg.create = function create(properties) {
            return new IncomingMsg(properties);
        };

        /**
         * Encodes the specified IncomingMsg message. Does not implicitly {@link rpc.IncomingMsg.verify|verify} messages.
         * @function encode
         * @memberof rpc.IncomingMsg
         * @static
         * @param {rpc.IIncomingMsg} message IncomingMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        IncomingMsg.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.msgType != null && Object.hasOwnProperty.call(message, "msgType"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.msgType);
            if (message.callNum != null && Object.hasOwnProperty.call(message, "callNum"))
                writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.callNum);
            if (message.method != null && Object.hasOwnProperty.call(message, "method"))
                writer.uint32(/* id 3, wireType 2 =*/26).string(message.method);
            if (message.data != null && Object.hasOwnProperty.call(message, "data"))
                $root.rpc.PassedDatum.encode(message.data, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified IncomingMsg message, length delimited. Does not implicitly {@link rpc.IncomingMsg.verify|verify} messages.
         * @function encodeDelimited
         * @memberof rpc.IncomingMsg
         * @static
         * @param {rpc.IIncomingMsg} message IncomingMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        IncomingMsg.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an IncomingMsg message from the specified reader or buffer.
         * @function decode
         * @memberof rpc.IncomingMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {rpc.IncomingMsg} IncomingMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        IncomingMsg.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.rpc.IncomingMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.msgType = reader.string();
                        break;
                    }
                case 2: {
                        message.callNum = reader.uint32();
                        break;
                    }
                case 3: {
                        message.method = reader.string();
                        break;
                    }
                case 4: {
                        message.data = $root.rpc.PassedDatum.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an IncomingMsg message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof rpc.IncomingMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {rpc.IncomingMsg} IncomingMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        IncomingMsg.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an IncomingMsg message.
         * @function verify
         * @memberof rpc.IncomingMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        IncomingMsg.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.msgType != null && Object.hasOwnProperty.call(message, "msgType"))
                if (!$util.isString(message.msgType))
                    return "msgType: string expected";
            if (message.callNum != null && Object.hasOwnProperty.call(message, "callNum"))
                if (!$util.isInteger(message.callNum))
                    return "callNum: integer expected";
            if (message.method != null && Object.hasOwnProperty.call(message, "method"))
                if (!$util.isString(message.method))
                    return "method: string expected";
            if (message.data != null && Object.hasOwnProperty.call(message, "data")) {
                var error = $root.rpc.PassedDatum.verify(message.data, long + 1);
                if (error)
                    return "data." + error;
            }
            return null;
        };

        /**
         * Creates an IncomingMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof rpc.IncomingMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {rpc.IncomingMsg} IncomingMsg
         */
        IncomingMsg.fromObject = function fromObject(object, long) {
            if (object instanceof $root.rpc.IncomingMsg)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".rpc.IncomingMsg: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.rpc.IncomingMsg();
            if (object.msgType != null)
                message.msgType = String(object.msgType);
            if (object.callNum != null)
                message.callNum = object.callNum >>> 0;
            if (object.method != null)
                message.method = String(object.method);
            if (object.data != null) {
                if (!$util.isObject(object.data))
                    throw TypeError(".rpc.IncomingMsg.data: object expected");
                message.data = $root.rpc.PassedDatum.fromObject(object.data, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an IncomingMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof rpc.IncomingMsg
         * @static
         * @param {rpc.IncomingMsg} message IncomingMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        IncomingMsg.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.msgType = "";
                object.callNum = 0;
                object.method = "";
                object.data = null;
            }
            if (message.msgType != null && Object.hasOwnProperty.call(message, "msgType"))
                object.msgType = message.msgType;
            if (message.callNum != null && Object.hasOwnProperty.call(message, "callNum"))
                object.callNum = message.callNum;
            if (message.method != null && Object.hasOwnProperty.call(message, "method"))
                object.method = message.method;
            if (message.data != null && Object.hasOwnProperty.call(message, "data"))
                object.data = $root.rpc.PassedDatum.toObject(message.data, options, q + 1);
            return object;
        };

        /**
         * Converts this IncomingMsg to JSON.
         * @function toJSON
         * @memberof rpc.IncomingMsg
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        IncomingMsg.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for IncomingMsg
         * @function getTypeUrl
         * @memberof rpc.IncomingMsg
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        IncomingMsg.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/rpc.IncomingMsg";
        };

        return IncomingMsg;
    })();

    rpc.OutgoingMsg = (function() {

        /**
         * Properties of an OutgoingMsg.
         * @memberof rpc
         * @interface IOutgoingMsg
         * @property {number|null} [callNum] OutgoingMsg callNum
         * @property {string|null} [callStatus] OutgoingMsg callStatus
         * @property {rpc.IPassedDatum|null} [data] OutgoingMsg data
         * @property {common.IErrorValue|null} [err] OutgoingMsg err
         */

        /**
         * Constructs a new OutgoingMsg.
         * @memberof rpc
         * @classdesc Represents an OutgoingMsg.
         * @implements IOutgoingMsg
         * @constructor
         * @param {rpc.IOutgoingMsg=} [properties] Properties to set
         */
        function OutgoingMsg(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * OutgoingMsg callNum.
         * @member {number} callNum
         * @memberof rpc.OutgoingMsg
         * @instance
         */
        OutgoingMsg.prototype.callNum = 0;

        /**
         * OutgoingMsg callStatus.
         * @member {string} callStatus
         * @memberof rpc.OutgoingMsg
         * @instance
         */
        OutgoingMsg.prototype.callStatus = "";

        /**
         * OutgoingMsg data.
         * @member {rpc.IPassedDatum|null|undefined} data
         * @memberof rpc.OutgoingMsg
         * @instance
         */
        OutgoingMsg.prototype.data = null;

        /**
         * OutgoingMsg err.
         * @member {common.IErrorValue|null|undefined} err
         * @memberof rpc.OutgoingMsg
         * @instance
         */
        OutgoingMsg.prototype.err = null;

        /**
         * Creates a new OutgoingMsg instance using the specified properties.
         * @function create
         * @memberof rpc.OutgoingMsg
         * @static
         * @param {rpc.IOutgoingMsg=} [properties] Properties to set
         * @returns {rpc.OutgoingMsg} OutgoingMsg instance
         */
        OutgoingMsg.create = function create(properties) {
            return new OutgoingMsg(properties);
        };

        /**
         * Encodes the specified OutgoingMsg message. Does not implicitly {@link rpc.OutgoingMsg.verify|verify} messages.
         * @function encode
         * @memberof rpc.OutgoingMsg
         * @static
         * @param {rpc.IOutgoingMsg} message OutgoingMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        OutgoingMsg.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.callNum != null && Object.hasOwnProperty.call(message, "callNum"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.callNum);
            if (message.callStatus != null && Object.hasOwnProperty.call(message, "callStatus"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.callStatus);
            if (message.data != null && Object.hasOwnProperty.call(message, "data"))
                $root.rpc.PassedDatum.encode(message.data, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.err != null && Object.hasOwnProperty.call(message, "err"))
                $root.common.ErrorValue.encode(message.err, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified OutgoingMsg message, length delimited. Does not implicitly {@link rpc.OutgoingMsg.verify|verify} messages.
         * @function encodeDelimited
         * @memberof rpc.OutgoingMsg
         * @static
         * @param {rpc.IOutgoingMsg} message OutgoingMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        OutgoingMsg.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an OutgoingMsg message from the specified reader or buffer.
         * @function decode
         * @memberof rpc.OutgoingMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {rpc.OutgoingMsg} OutgoingMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        OutgoingMsg.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.rpc.OutgoingMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.callNum = reader.uint32();
                        break;
                    }
                case 2: {
                        message.callStatus = reader.string();
                        break;
                    }
                case 3: {
                        message.data = $root.rpc.PassedDatum.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.err = $root.common.ErrorValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an OutgoingMsg message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof rpc.OutgoingMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {rpc.OutgoingMsg} OutgoingMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        OutgoingMsg.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an OutgoingMsg message.
         * @function verify
         * @memberof rpc.OutgoingMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        OutgoingMsg.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.callNum != null && Object.hasOwnProperty.call(message, "callNum"))
                if (!$util.isInteger(message.callNum))
                    return "callNum: integer expected";
            if (message.callStatus != null && Object.hasOwnProperty.call(message, "callStatus"))
                if (!$util.isString(message.callStatus))
                    return "callStatus: string expected";
            if (message.data != null && Object.hasOwnProperty.call(message, "data")) {
                var error = $root.rpc.PassedDatum.verify(message.data, long + 1);
                if (error)
                    return "data." + error;
            }
            if (message.err != null && Object.hasOwnProperty.call(message, "err")) {
                var error = $root.common.ErrorValue.verify(message.err, long + 1);
                if (error)
                    return "err." + error;
            }
            return null;
        };

        /**
         * Creates an OutgoingMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof rpc.OutgoingMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {rpc.OutgoingMsg} OutgoingMsg
         */
        OutgoingMsg.fromObject = function fromObject(object, long) {
            if (object instanceof $root.rpc.OutgoingMsg)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".rpc.OutgoingMsg: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.rpc.OutgoingMsg();
            if (object.callNum != null)
                message.callNum = object.callNum >>> 0;
            if (object.callStatus != null)
                message.callStatus = String(object.callStatus);
            if (object.data != null) {
                if (!$util.isObject(object.data))
                    throw TypeError(".rpc.OutgoingMsg.data: object expected");
                message.data = $root.rpc.PassedDatum.fromObject(object.data, long + 1);
            }
            if (object.err != null) {
                if (!$util.isObject(object.err))
                    throw TypeError(".rpc.OutgoingMsg.err: object expected");
                message.err = $root.common.ErrorValue.fromObject(object.err, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an OutgoingMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof rpc.OutgoingMsg
         * @static
         * @param {rpc.OutgoingMsg} message OutgoingMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        OutgoingMsg.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.callNum = 0;
                object.callStatus = "";
                object.data = null;
                object.err = null;
            }
            if (message.callNum != null && Object.hasOwnProperty.call(message, "callNum"))
                object.callNum = message.callNum;
            if (message.callStatus != null && Object.hasOwnProperty.call(message, "callStatus"))
                object.callStatus = message.callStatus;
            if (message.data != null && Object.hasOwnProperty.call(message, "data"))
                object.data = $root.rpc.PassedDatum.toObject(message.data, options, q + 1);
            if (message.err != null && Object.hasOwnProperty.call(message, "err"))
                object.err = $root.common.ErrorValue.toObject(message.err, options, q + 1);
            return object;
        };

        /**
         * Converts this OutgoingMsg to JSON.
         * @function toJSON
         * @memberof rpc.OutgoingMsg
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        OutgoingMsg.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for OutgoingMsg
         * @function getTypeUrl
         * @memberof rpc.OutgoingMsg
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        OutgoingMsg.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/rpc.OutgoingMsg";
        };

        return OutgoingMsg;
    })();

    return rpc;
})();

$root.common = (function() {

    /**
     * Namespace common.
     * @exports common
     * @namespace
     */
    var common = {};

    common.ObjectReference = (function() {

        /**
         * Properties of an ObjectReference.
         * @memberof common
         * @interface IObjectReference
         * @property {string|null} [objType] ObjectReference objType
         * @property {Array.<string>|null} [path] ObjectReference path
         */

        /**
         * Constructs a new ObjectReference.
         * @memberof common
         * @classdesc Represents an ObjectReference.
         * @implements IObjectReference
         * @constructor
         * @param {common.IObjectReference=} [properties] Properties to set
         */
        function ObjectReference(properties) {
            this.path = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ObjectReference objType.
         * @member {string} objType
         * @memberof common.ObjectReference
         * @instance
         */
        ObjectReference.prototype.objType = "";

        /**
         * ObjectReference path.
         * @member {Array.<string>} path
         * @memberof common.ObjectReference
         * @instance
         */
        ObjectReference.prototype.path = $util.emptyArray;

        /**
         * Creates a new ObjectReference instance using the specified properties.
         * @function create
         * @memberof common.ObjectReference
         * @static
         * @param {common.IObjectReference=} [properties] Properties to set
         * @returns {common.ObjectReference} ObjectReference instance
         */
        ObjectReference.create = function create(properties) {
            return new ObjectReference(properties);
        };

        /**
         * Encodes the specified ObjectReference message. Does not implicitly {@link common.ObjectReference.verify|verify} messages.
         * @function encode
         * @memberof common.ObjectReference
         * @static
         * @param {common.IObjectReference} message ObjectReference message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ObjectReference.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.objType != null && Object.hasOwnProperty.call(message, "objType"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.objType);
            if (message.path != null && message.path.length)
                for (var i = 0; i < message.path.length; ++i)
                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.path[i]);
            return writer;
        };

        /**
         * Encodes the specified ObjectReference message, length delimited. Does not implicitly {@link common.ObjectReference.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.ObjectReference
         * @static
         * @param {common.IObjectReference} message ObjectReference message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ObjectReference.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an ObjectReference message from the specified reader or buffer.
         * @function decode
         * @memberof common.ObjectReference
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.ObjectReference} ObjectReference
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ObjectReference.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ObjectReference();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.objType = reader.string();
                        break;
                    }
                case 2: {
                        if (!(message.path && message.path.length))
                            message.path = [];
                        message.path.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an ObjectReference message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.ObjectReference
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.ObjectReference} ObjectReference
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ObjectReference.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an ObjectReference message.
         * @function verify
         * @memberof common.ObjectReference
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ObjectReference.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.objType != null && Object.hasOwnProperty.call(message, "objType"))
                if (!$util.isString(message.objType))
                    return "objType: string expected";
            if (message.path != null && Object.hasOwnProperty.call(message, "path")) {
                if (!Array.isArray(message.path))
                    return "path: array expected";
                for (var i = 0; i < message.path.length; ++i)
                    if (!$util.isString(message.path[i]))
                        return "path: string[] expected";
            }
            return null;
        };

        /**
         * Creates an ObjectReference message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.ObjectReference
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.ObjectReference} ObjectReference
         */
        ObjectReference.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.ObjectReference)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.ObjectReference: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.ObjectReference();
            if (object.objType != null)
                message.objType = String(object.objType);
            if (object.path) {
                if (!Array.isArray(object.path))
                    throw TypeError(".common.ObjectReference.path: array expected");
                message.path = [];
                for (var i = 0; i < object.path.length; ++i)
                    message.path[i] = String(object.path[i]);
            }
            return message;
        };

        /**
         * Creates a plain object from an ObjectReference message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.ObjectReference
         * @static
         * @param {common.ObjectReference} message ObjectReference
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ObjectReference.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.path = [];
            if (options.defaults)
                object.objType = "";
            if (message.objType != null && Object.hasOwnProperty.call(message, "objType"))
                object.objType = message.objType;
            if (message.path && message.path.length) {
                object.path = [];
                for (var j = 0; j < message.path.length; ++j)
                    object.path[j] = message.path[j];
            }
            return object;
        };

        /**
         * Converts this ObjectReference to JSON.
         * @function toJSON
         * @memberof common.ObjectReference
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ObjectReference.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ObjectReference
         * @function getTypeUrl
         * @memberof common.ObjectReference
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ObjectReference.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.ObjectReference";
        };

        return ObjectReference;
    })();

    common.BooleanValue = (function() {

        /**
         * Properties of a BooleanValue.
         * @memberof common
         * @interface IBooleanValue
         * @property {boolean|null} [value] BooleanValue value
         */

        /**
         * Constructs a new BooleanValue.
         * @memberof common
         * @classdesc Represents a BooleanValue.
         * @implements IBooleanValue
         * @constructor
         * @param {common.IBooleanValue=} [properties] Properties to set
         */
        function BooleanValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * BooleanValue value.
         * @member {boolean} value
         * @memberof common.BooleanValue
         * @instance
         */
        BooleanValue.prototype.value = false;

        /**
         * Creates a new BooleanValue instance using the specified properties.
         * @function create
         * @memberof common.BooleanValue
         * @static
         * @param {common.IBooleanValue=} [properties] Properties to set
         * @returns {common.BooleanValue} BooleanValue instance
         */
        BooleanValue.create = function create(properties) {
            return new BooleanValue(properties);
        };

        /**
         * Encodes the specified BooleanValue message. Does not implicitly {@link common.BooleanValue.verify|verify} messages.
         * @function encode
         * @memberof common.BooleanValue
         * @static
         * @param {common.IBooleanValue} message BooleanValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BooleanValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 0 =*/8).bool(message.value);
            return writer;
        };

        /**
         * Encodes the specified BooleanValue message, length delimited. Does not implicitly {@link common.BooleanValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.BooleanValue
         * @static
         * @param {common.IBooleanValue} message BooleanValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BooleanValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a BooleanValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.BooleanValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.BooleanValue} BooleanValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BooleanValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BooleanValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.bool();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a BooleanValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.BooleanValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.BooleanValue} BooleanValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BooleanValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a BooleanValue message.
         * @function verify
         * @memberof common.BooleanValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        BooleanValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (typeof message.value !== "boolean")
                    return "value: boolean expected";
            return null;
        };

        /**
         * Creates a BooleanValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.BooleanValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.BooleanValue} BooleanValue
         */
        BooleanValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.BooleanValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.BooleanValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.BooleanValue();
            if (object.value != null)
                message.value = Boolean(object.value);
            return message;
        };

        /**
         * Creates a plain object from a BooleanValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.BooleanValue
         * @static
         * @param {common.BooleanValue} message BooleanValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        BooleanValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.value = false;
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = message.value;
            return object;
        };

        /**
         * Converts this BooleanValue to JSON.
         * @function toJSON
         * @memberof common.BooleanValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        BooleanValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for BooleanValue
         * @function getTypeUrl
         * @memberof common.BooleanValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        BooleanValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.BooleanValue";
        };

        return BooleanValue;
    })();

    common.StringArrayValue = (function() {

        /**
         * Properties of a StringArrayValue.
         * @memberof common
         * @interface IStringArrayValue
         * @property {Array.<string>|null} [values] StringArrayValue values
         */

        /**
         * Constructs a new StringArrayValue.
         * @memberof common
         * @classdesc Represents a StringArrayValue.
         * @implements IStringArrayValue
         * @constructor
         * @param {common.IStringArrayValue=} [properties] Properties to set
         */
        function StringArrayValue(properties) {
            this.values = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * StringArrayValue values.
         * @member {Array.<string>} values
         * @memberof common.StringArrayValue
         * @instance
         */
        StringArrayValue.prototype.values = $util.emptyArray;

        /**
         * Creates a new StringArrayValue instance using the specified properties.
         * @function create
         * @memberof common.StringArrayValue
         * @static
         * @param {common.IStringArrayValue=} [properties] Properties to set
         * @returns {common.StringArrayValue} StringArrayValue instance
         */
        StringArrayValue.create = function create(properties) {
            return new StringArrayValue(properties);
        };

        /**
         * Encodes the specified StringArrayValue message. Does not implicitly {@link common.StringArrayValue.verify|verify} messages.
         * @function encode
         * @memberof common.StringArrayValue
         * @static
         * @param {common.IStringArrayValue} message StringArrayValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringArrayValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.values != null && message.values.length)
                for (var i = 0; i < message.values.length; ++i)
                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.values[i]);
            return writer;
        };

        /**
         * Encodes the specified StringArrayValue message, length delimited. Does not implicitly {@link common.StringArrayValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.StringArrayValue
         * @static
         * @param {common.IStringArrayValue} message StringArrayValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringArrayValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a StringArrayValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.StringArrayValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.StringArrayValue} StringArrayValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringArrayValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringArrayValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.values && message.values.length))
                            message.values = [];
                        message.values.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a StringArrayValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.StringArrayValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.StringArrayValue} StringArrayValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringArrayValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a StringArrayValue message.
         * @function verify
         * @memberof common.StringArrayValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        StringArrayValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.values != null && Object.hasOwnProperty.call(message, "values")) {
                if (!Array.isArray(message.values))
                    return "values: array expected";
                for (var i = 0; i < message.values.length; ++i)
                    if (!$util.isString(message.values[i]))
                        return "values: string[] expected";
            }
            return null;
        };

        /**
         * Creates a StringArrayValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.StringArrayValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.StringArrayValue} StringArrayValue
         */
        StringArrayValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.StringArrayValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.StringArrayValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.StringArrayValue();
            if (object.values) {
                if (!Array.isArray(object.values))
                    throw TypeError(".common.StringArrayValue.values: array expected");
                message.values = [];
                for (var i = 0; i < object.values.length; ++i)
                    message.values[i] = String(object.values[i]);
            }
            return message;
        };

        /**
         * Creates a plain object from a StringArrayValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.StringArrayValue
         * @static
         * @param {common.StringArrayValue} message StringArrayValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        StringArrayValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.values = [];
            if (message.values && message.values.length) {
                object.values = [];
                for (var j = 0; j < message.values.length; ++j)
                    object.values[j] = message.values[j];
            }
            return object;
        };

        /**
         * Converts this StringArrayValue to JSON.
         * @function toJSON
         * @memberof common.StringArrayValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        StringArrayValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for StringArrayValue
         * @function getTypeUrl
         * @memberof common.StringArrayValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        StringArrayValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.StringArrayValue";
        };

        return StringArrayValue;
    })();

    common.UInt64Value = (function() {

        /**
         * Properties of a UInt64Value.
         * @memberof common
         * @interface IUInt64Value
         * @property {number|Long|null} [value] UInt64Value value
         */

        /**
         * Constructs a new UInt64Value.
         * @memberof common
         * @classdesc Represents a UInt64Value.
         * @implements IUInt64Value
         * @constructor
         * @param {common.IUInt64Value=} [properties] Properties to set
         */
        function UInt64Value(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * UInt64Value value.
         * @member {number|Long} value
         * @memberof common.UInt64Value
         * @instance
         */
        UInt64Value.prototype.value = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new UInt64Value instance using the specified properties.
         * @function create
         * @memberof common.UInt64Value
         * @static
         * @param {common.IUInt64Value=} [properties] Properties to set
         * @returns {common.UInt64Value} UInt64Value instance
         */
        UInt64Value.create = function create(properties) {
            return new UInt64Value(properties);
        };

        /**
         * Encodes the specified UInt64Value message. Does not implicitly {@link common.UInt64Value.verify|verify} messages.
         * @function encode
         * @memberof common.UInt64Value
         * @static
         * @param {common.IUInt64Value} message UInt64Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt64Value.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.value);
            return writer;
        };

        /**
         * Encodes the specified UInt64Value message, length delimited. Does not implicitly {@link common.UInt64Value.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.UInt64Value
         * @static
         * @param {common.IUInt64Value} message UInt64Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt64Value.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a UInt64Value message from the specified reader or buffer.
         * @function decode
         * @memberof common.UInt64Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.UInt64Value} UInt64Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt64Value.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt64Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a UInt64Value message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.UInt64Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.UInt64Value} UInt64Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt64Value.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a UInt64Value message.
         * @function verify
         * @memberof common.UInt64Value
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        UInt64Value.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!$util.isInteger(message.value) && !(message.value && $util.isInteger(message.value.low) && $util.isInteger(message.value.high)))
                    return "value: integer|Long expected";
            return null;
        };

        /**
         * Creates a UInt64Value message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.UInt64Value
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.UInt64Value} UInt64Value
         */
        UInt64Value.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.UInt64Value)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.UInt64Value: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.UInt64Value();
            if (object.value != null)
                if ($util.Long)
                    message.value = $util.Long.fromValue(object.value, true);
                else if (typeof object.value === "string")
                    message.value = parseInt(object.value, 10);
                else if (typeof object.value === "number")
                    message.value = object.value;
                else if (typeof object.value === "object")
                    message.value = new $util.LongBits(object.value.low >>> 0, object.value.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from a UInt64Value message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.UInt64Value
         * @static
         * @param {common.UInt64Value} message UInt64Value
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        UInt64Value.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.value = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.value = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.value = typeof message.value === "number" ? BigInt(message.value) : $util.Long.fromBits(message.value.low >>> 0, message.value.high >>> 0, true).toBigInt();
                else if (typeof message.value === "number")
                    object.value = options.longs === String ? String(message.value) : message.value;
                else
                    object.value = options.longs === String ? $util.Long.prototype.toString.call(message.value) : options.longs === Number ? new $util.LongBits(message.value.low >>> 0, message.value.high >>> 0).toNumber(true) : message.value;
            return object;
        };

        /**
         * Converts this UInt64Value to JSON.
         * @function toJSON
         * @memberof common.UInt64Value
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        UInt64Value.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for UInt64Value
         * @function getTypeUrl
         * @memberof common.UInt64Value
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        UInt64Value.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.UInt64Value";
        };

        return UInt64Value;
    })();

    common.UInt32Value = (function() {

        /**
         * Properties of a UInt32Value.
         * @memberof common
         * @interface IUInt32Value
         * @property {number|null} [value] UInt32Value value
         */

        /**
         * Constructs a new UInt32Value.
         * @memberof common
         * @classdesc Represents a UInt32Value.
         * @implements IUInt32Value
         * @constructor
         * @param {common.IUInt32Value=} [properties] Properties to set
         */
        function UInt32Value(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * UInt32Value value.
         * @member {number} value
         * @memberof common.UInt32Value
         * @instance
         */
        UInt32Value.prototype.value = 0;

        /**
         * Creates a new UInt32Value instance using the specified properties.
         * @function create
         * @memberof common.UInt32Value
         * @static
         * @param {common.IUInt32Value=} [properties] Properties to set
         * @returns {common.UInt32Value} UInt32Value instance
         */
        UInt32Value.create = function create(properties) {
            return new UInt32Value(properties);
        };

        /**
         * Encodes the specified UInt32Value message. Does not implicitly {@link common.UInt32Value.verify|verify} messages.
         * @function encode
         * @memberof common.UInt32Value
         * @static
         * @param {common.IUInt32Value} message UInt32Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt32Value.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.value);
            return writer;
        };

        /**
         * Encodes the specified UInt32Value message, length delimited. Does not implicitly {@link common.UInt32Value.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.UInt32Value
         * @static
         * @param {common.IUInt32Value} message UInt32Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt32Value.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a UInt32Value message from the specified reader or buffer.
         * @function decode
         * @memberof common.UInt32Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.UInt32Value} UInt32Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt32Value.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt32Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.uint32();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a UInt32Value message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.UInt32Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.UInt32Value} UInt32Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt32Value.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a UInt32Value message.
         * @function verify
         * @memberof common.UInt32Value
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        UInt32Value.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!$util.isInteger(message.value))
                    return "value: integer expected";
            return null;
        };

        /**
         * Creates a UInt32Value message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.UInt32Value
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.UInt32Value} UInt32Value
         */
        UInt32Value.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.UInt32Value)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.UInt32Value: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.UInt32Value();
            if (object.value != null)
                message.value = object.value >>> 0;
            return message;
        };

        /**
         * Creates a plain object from a UInt32Value message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.UInt32Value
         * @static
         * @param {common.UInt32Value} message UInt32Value
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        UInt32Value.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.value = 0;
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = message.value;
            return object;
        };

        /**
         * Converts this UInt32Value to JSON.
         * @function toJSON
         * @memberof common.UInt32Value
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        UInt32Value.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for UInt32Value
         * @function getTypeUrl
         * @memberof common.UInt32Value
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        UInt32Value.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.UInt32Value";
        };

        return UInt32Value;
    })();

    common.StringValue = (function() {

        /**
         * Properties of a StringValue.
         * @memberof common
         * @interface IStringValue
         * @property {string|null} [value] StringValue value
         */

        /**
         * Constructs a new StringValue.
         * @memberof common
         * @classdesc Represents a StringValue.
         * @implements IStringValue
         * @constructor
         * @param {common.IStringValue=} [properties] Properties to set
         */
        function StringValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * StringValue value.
         * @member {string} value
         * @memberof common.StringValue
         * @instance
         */
        StringValue.prototype.value = "";

        /**
         * Creates a new StringValue instance using the specified properties.
         * @function create
         * @memberof common.StringValue
         * @static
         * @param {common.IStringValue=} [properties] Properties to set
         * @returns {common.StringValue} StringValue instance
         */
        StringValue.create = function create(properties) {
            return new StringValue(properties);
        };

        /**
         * Encodes the specified StringValue message. Does not implicitly {@link common.StringValue.verify|verify} messages.
         * @function encode
         * @memberof common.StringValue
         * @static
         * @param {common.IStringValue} message StringValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.value);
            return writer;
        };

        /**
         * Encodes the specified StringValue message, length delimited. Does not implicitly {@link common.StringValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.StringValue
         * @static
         * @param {common.IStringValue} message StringValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a StringValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.StringValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.StringValue} StringValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a StringValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.StringValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.StringValue} StringValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a StringValue message.
         * @function verify
         * @memberof common.StringValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        StringValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!$util.isString(message.value))
                    return "value: string expected";
            return null;
        };

        /**
         * Creates a StringValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.StringValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.StringValue} StringValue
         */
        StringValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.StringValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.StringValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.StringValue();
            if (object.value != null)
                message.value = String(object.value);
            return message;
        };

        /**
         * Creates a plain object from a StringValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.StringValue
         * @static
         * @param {common.StringValue} message StringValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        StringValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.value = "";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = message.value;
            return object;
        };

        /**
         * Converts this StringValue to JSON.
         * @function toJSON
         * @memberof common.StringValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        StringValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for StringValue
         * @function getTypeUrl
         * @memberof common.StringValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        StringValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.StringValue";
        };

        return StringValue;
    })();

    common.BytesValue = (function() {

        /**
         * Properties of a BytesValue.
         * @memberof common
         * @interface IBytesValue
         * @property {Uint8Array|null} [value] BytesValue value
         */

        /**
         * Constructs a new BytesValue.
         * @memberof common
         * @classdesc Represents a BytesValue.
         * @implements IBytesValue
         * @constructor
         * @param {common.IBytesValue=} [properties] Properties to set
         */
        function BytesValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * BytesValue value.
         * @member {Uint8Array} value
         * @memberof common.BytesValue
         * @instance
         */
        BytesValue.prototype.value = $util.newBuffer([]);

        /**
         * Creates a new BytesValue instance using the specified properties.
         * @function create
         * @memberof common.BytesValue
         * @static
         * @param {common.IBytesValue=} [properties] Properties to set
         * @returns {common.BytesValue} BytesValue instance
         */
        BytesValue.create = function create(properties) {
            return new BytesValue(properties);
        };

        /**
         * Encodes the specified BytesValue message. Does not implicitly {@link common.BytesValue.verify|verify} messages.
         * @function encode
         * @memberof common.BytesValue
         * @static
         * @param {common.IBytesValue} message BytesValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BytesValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.value);
            return writer;
        };

        /**
         * Encodes the specified BytesValue message, length delimited. Does not implicitly {@link common.BytesValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.BytesValue
         * @static
         * @param {common.IBytesValue} message BytesValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BytesValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a BytesValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.BytesValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.BytesValue} BytesValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BytesValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BytesValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.bytes();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a BytesValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.BytesValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.BytesValue} BytesValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BytesValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a BytesValue message.
         * @function verify
         * @memberof common.BytesValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        BytesValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!(message.value && typeof message.value.length === "number" || $util.isString(message.value)))
                    return "value: buffer expected";
            return null;
        };

        /**
         * Creates a BytesValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.BytesValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.BytesValue} BytesValue
         */
        BytesValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.BytesValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.BytesValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.BytesValue();
            if (object.value != null)
                if (typeof object.value === "string")
                    $util.base64.decode(object.value, message.value = $util.newBuffer($util.base64.length(object.value)), 0);
                else if (object.value.length >= 0)
                    message.value = object.value;
            return message;
        };

        /**
         * Creates a plain object from a BytesValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.BytesValue
         * @static
         * @param {common.BytesValue} message BytesValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        BytesValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if (options.bytes === String)
                    object.value = "";
                else {
                    object.value = [];
                    if (options.bytes !== Array)
                        object.value = $util.newBuffer(object.value);
                }
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = options.bytes === String ? $util.base64.encode(message.value, 0, message.value.length) : options.bytes === Array ? Array.prototype.slice.call(message.value) : message.value;
            return object;
        };

        /**
         * Converts this BytesValue to JSON.
         * @function toJSON
         * @memberof common.BytesValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        BytesValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for BytesValue
         * @function getTypeUrl
         * @memberof common.BytesValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        BytesValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.BytesValue";
        };

        return BytesValue;
    })();

    common.ErrorValue = (function() {

        /**
         * Properties of an ErrorValue.
         * @memberof common
         * @interface IErrorValue
         * @property {string|null} [runtimeExcJson] ErrorValue runtimeExcJson
         * @property {string|null} [err] ErrorValue err
         */

        /**
         * Constructs a new ErrorValue.
         * @memberof common
         * @classdesc Represents an ErrorValue.
         * @implements IErrorValue
         * @constructor
         * @param {common.IErrorValue=} [properties] Properties to set
         */
        function ErrorValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ErrorValue runtimeExcJson.
         * @member {string} runtimeExcJson
         * @memberof common.ErrorValue
         * @instance
         */
        ErrorValue.prototype.runtimeExcJson = "";

        /**
         * ErrorValue err.
         * @member {string} err
         * @memberof common.ErrorValue
         * @instance
         */
        ErrorValue.prototype.err = "";

        /**
         * Creates a new ErrorValue instance using the specified properties.
         * @function create
         * @memberof common.ErrorValue
         * @static
         * @param {common.IErrorValue=} [properties] Properties to set
         * @returns {common.ErrorValue} ErrorValue instance
         */
        ErrorValue.create = function create(properties) {
            return new ErrorValue(properties);
        };

        /**
         * Encodes the specified ErrorValue message. Does not implicitly {@link common.ErrorValue.verify|verify} messages.
         * @function encode
         * @memberof common.ErrorValue
         * @static
         * @param {common.IErrorValue} message ErrorValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ErrorValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.runtimeExcJson != null && Object.hasOwnProperty.call(message, "runtimeExcJson"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.runtimeExcJson);
            if (message.err != null && Object.hasOwnProperty.call(message, "err"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.err);
            return writer;
        };

        /**
         * Encodes the specified ErrorValue message, length delimited. Does not implicitly {@link common.ErrorValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.ErrorValue
         * @static
         * @param {common.IErrorValue} message ErrorValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ErrorValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an ErrorValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.ErrorValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.ErrorValue} ErrorValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ErrorValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ErrorValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.runtimeExcJson = reader.string();
                        break;
                    }
                case 2: {
                        message.err = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an ErrorValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.ErrorValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.ErrorValue} ErrorValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ErrorValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an ErrorValue message.
         * @function verify
         * @memberof common.ErrorValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ErrorValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.runtimeExcJson != null && Object.hasOwnProperty.call(message, "runtimeExcJson"))
                if (!$util.isString(message.runtimeExcJson))
                    return "runtimeExcJson: string expected";
            if (message.err != null && Object.hasOwnProperty.call(message, "err"))
                if (!$util.isString(message.err))
                    return "err: string expected";
            return null;
        };

        /**
         * Creates an ErrorValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.ErrorValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.ErrorValue} ErrorValue
         */
        ErrorValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.ErrorValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.ErrorValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.ErrorValue();
            if (object.runtimeExcJson != null)
                message.runtimeExcJson = String(object.runtimeExcJson);
            if (object.err != null)
                message.err = String(object.err);
            return message;
        };

        /**
         * Creates a plain object from an ErrorValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.ErrorValue
         * @static
         * @param {common.ErrorValue} message ErrorValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ErrorValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.runtimeExcJson = "";
                object.err = "";
            }
            if (message.runtimeExcJson != null && Object.hasOwnProperty.call(message, "runtimeExcJson"))
                object.runtimeExcJson = message.runtimeExcJson;
            if (message.err != null && Object.hasOwnProperty.call(message, "err"))
                object.err = message.err;
            return object;
        };

        /**
         * Converts this ErrorValue to JSON.
         * @function toJSON
         * @memberof common.ErrorValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ErrorValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ErrorValue
         * @function getTypeUrl
         * @memberof common.ErrorValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ErrorValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.ErrorValue";
        };

        return ErrorValue;
    })();

    common.AnyValue = (function() {

        /**
         * Properties of an AnyValue.
         * @memberof common
         * @interface IAnyValue
         * @property {string|null} [type] AnyValue type
         * @property {common.IStringValue|null} [json] AnyValue json
         * @property {common.IBytesValue|null} [bytes] AnyValue bytes
         */

        /**
         * Constructs a new AnyValue.
         * @memberof common
         * @classdesc Represents an AnyValue.
         * @implements IAnyValue
         * @constructor
         * @param {common.IAnyValue=} [properties] Properties to set
         */
        function AnyValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * AnyValue type.
         * @member {string} type
         * @memberof common.AnyValue
         * @instance
         */
        AnyValue.prototype.type = "";

        /**
         * AnyValue json.
         * @member {common.IStringValue|null|undefined} json
         * @memberof common.AnyValue
         * @instance
         */
        AnyValue.prototype.json = null;

        /**
         * AnyValue bytes.
         * @member {common.IBytesValue|null|undefined} bytes
         * @memberof common.AnyValue
         * @instance
         */
        AnyValue.prototype.bytes = null;

        /**
         * Creates a new AnyValue instance using the specified properties.
         * @function create
         * @memberof common.AnyValue
         * @static
         * @param {common.IAnyValue=} [properties] Properties to set
         * @returns {common.AnyValue} AnyValue instance
         */
        AnyValue.create = function create(properties) {
            return new AnyValue(properties);
        };

        /**
         * Encodes the specified AnyValue message. Does not implicitly {@link common.AnyValue.verify|verify} messages.
         * @function encode
         * @memberof common.AnyValue
         * @static
         * @param {common.IAnyValue} message AnyValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AnyValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.type);
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified AnyValue message, length delimited. Does not implicitly {@link common.AnyValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.AnyValue
         * @static
         * @param {common.IAnyValue} message AnyValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AnyValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an AnyValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.AnyValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.AnyValue} AnyValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AnyValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.AnyValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.type = reader.string();
                        break;
                    }
                case 2: {
                        message.json = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an AnyValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.AnyValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.AnyValue} AnyValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AnyValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an AnyValue message.
         * @function verify
         * @memberof common.AnyValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        AnyValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.json != null && Object.hasOwnProperty.call(message, "json")) {
                var error = $root.common.StringValue.verify(message.json, long + 1);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes, long + 1);
                if (error)
                    return "bytes." + error;
            }
            return null;
        };

        /**
         * Creates an AnyValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.AnyValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.AnyValue} AnyValue
         */
        AnyValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.AnyValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.AnyValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.AnyValue();
            if (object.type != null)
                message.type = String(object.type);
            if (object.json != null) {
                if (!$util.isObject(object.json))
                    throw TypeError(".common.AnyValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json, long + 1);
            }
            if (object.bytes != null) {
                if (!$util.isObject(object.bytes))
                    throw TypeError(".common.AnyValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an AnyValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.AnyValue
         * @static
         * @param {common.AnyValue} message AnyValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        AnyValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.json = null;
                object.bytes = null;
            }
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                object.type = message.type;
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = $root.common.StringValue.toObject(message.json, options, q + 1);
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options, q + 1);
            return object;
        };

        /**
         * Converts this AnyValue to JSON.
         * @function toJSON
         * @memberof common.AnyValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        AnyValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for AnyValue
         * @function getTypeUrl
         * @memberof common.AnyValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        AnyValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.AnyValue";
        };

        return AnyValue;
    })();

    return common;
})();

$root.file = (function() {

    /**
     * Namespace file.
     * @exports file
     * @namespace
     */
    var file = {};

    file.File = (function() {

        /**
         * Properties of a File.
         * @memberof file
         * @interface IFile
         * @property {boolean|null} [writable] File writable
         * @property {boolean|null} [isVersioned] File isVersioned
         * @property {string|null} [name] File name
         * @property {boolean|null} [isNew] File isNew
         * @property {common.IObjectReference|null} [impl] File impl
         * @property {boolean|null} [isSynced] File isSynced
         */

        /**
         * Constructs a new File.
         * @memberof file
         * @classdesc Represents a File.
         * @implements IFile
         * @constructor
         * @param {file.IFile=} [properties] Properties to set
         */
        function File(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * File writable.
         * @member {boolean} writable
         * @memberof file.File
         * @instance
         */
        File.prototype.writable = false;

        /**
         * File isVersioned.
         * @member {boolean} isVersioned
         * @memberof file.File
         * @instance
         */
        File.prototype.isVersioned = false;

        /**
         * File name.
         * @member {string} name
         * @memberof file.File
         * @instance
         */
        File.prototype.name = "";

        /**
         * File isNew.
         * @member {boolean} isNew
         * @memberof file.File
         * @instance
         */
        File.prototype.isNew = false;

        /**
         * File impl.
         * @member {common.IObjectReference|null|undefined} impl
         * @memberof file.File
         * @instance
         */
        File.prototype.impl = null;

        /**
         * File isSynced.
         * @member {boolean} isSynced
         * @memberof file.File
         * @instance
         */
        File.prototype.isSynced = false;

        /**
         * Creates a new File instance using the specified properties.
         * @function create
         * @memberof file.File
         * @static
         * @param {file.IFile=} [properties] Properties to set
         * @returns {file.File} File instance
         */
        File.create = function create(properties) {
            return new File(properties);
        };

        /**
         * Encodes the specified File message. Does not implicitly {@link file.File.verify|verify} messages.
         * @function encode
         * @memberof file.File
         * @static
         * @param {file.IFile} message File message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        File.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.writable != null && Object.hasOwnProperty.call(message, "writable"))
                writer.uint32(/* id 1, wireType 0 =*/8).bool(message.writable);
            if (message.isVersioned != null && Object.hasOwnProperty.call(message, "isVersioned"))
                writer.uint32(/* id 2, wireType 0 =*/16).bool(message.isVersioned);
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                writer.uint32(/* id 3, wireType 2 =*/26).string(message.name);
            if (message.isNew != null && Object.hasOwnProperty.call(message, "isNew"))
                writer.uint32(/* id 4, wireType 0 =*/32).bool(message.isNew);
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl"))
                $root.common.ObjectReference.encode(message.impl, writer.uint32(/* id 5, wireType 2 =*/42).fork(), q + 1).ldelim();
            if (message.isSynced != null && Object.hasOwnProperty.call(message, "isSynced"))
                writer.uint32(/* id 6, wireType 0 =*/48).bool(message.isSynced);
            return writer;
        };

        /**
         * Encodes the specified File message, length delimited. Does not implicitly {@link file.File.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.File
         * @static
         * @param {file.IFile} message File message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        File.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a File message from the specified reader or buffer.
         * @function decode
         * @memberof file.File
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.File} File
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        File.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.File();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.writable = reader.bool();
                        break;
                    }
                case 2: {
                        message.isVersioned = reader.bool();
                        break;
                    }
                case 3: {
                        message.name = reader.string();
                        break;
                    }
                case 4: {
                        message.isNew = reader.bool();
                        break;
                    }
                case 5: {
                        message.impl = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 6: {
                        message.isSynced = reader.bool();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a File message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.File
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.File} File
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        File.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a File message.
         * @function verify
         * @memberof file.File
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        File.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.writable != null && Object.hasOwnProperty.call(message, "writable"))
                if (typeof message.writable !== "boolean")
                    return "writable: boolean expected";
            if (message.isVersioned != null && Object.hasOwnProperty.call(message, "isVersioned"))
                if (typeof message.isVersioned !== "boolean")
                    return "isVersioned: boolean expected";
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.isNew != null && Object.hasOwnProperty.call(message, "isNew"))
                if (typeof message.isNew !== "boolean")
                    return "isNew: boolean expected";
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl")) {
                var error = $root.common.ObjectReference.verify(message.impl, long + 1);
                if (error)
                    return "impl." + error;
            }
            if (message.isSynced != null && Object.hasOwnProperty.call(message, "isSynced"))
                if (typeof message.isSynced !== "boolean")
                    return "isSynced: boolean expected";
            return null;
        };

        /**
         * Creates a File message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.File
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.File} File
         */
        File.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.File)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.File: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.File();
            if (object.writable != null)
                message.writable = Boolean(object.writable);
            if (object.isVersioned != null)
                message.isVersioned = Boolean(object.isVersioned);
            if (object.name != null)
                message.name = String(object.name);
            if (object.isNew != null)
                message.isNew = Boolean(object.isNew);
            if (object.impl != null) {
                if (!$util.isObject(object.impl))
                    throw TypeError(".file.File.impl: object expected");
                message.impl = $root.common.ObjectReference.fromObject(object.impl, long + 1);
            }
            if (object.isSynced != null)
                message.isSynced = Boolean(object.isSynced);
            return message;
        };

        /**
         * Creates a plain object from a File message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.File
         * @static
         * @param {file.File} message File
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        File.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.writable = false;
                object.isVersioned = false;
                object.name = "";
                object.isNew = false;
                object.impl = null;
                object.isSynced = false;
            }
            if (message.writable != null && Object.hasOwnProperty.call(message, "writable"))
                object.writable = message.writable;
            if (message.isVersioned != null && Object.hasOwnProperty.call(message, "isVersioned"))
                object.isVersioned = message.isVersioned;
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                object.name = message.name;
            if (message.isNew != null && Object.hasOwnProperty.call(message, "isNew"))
                object.isNew = message.isNew;
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl"))
                object.impl = $root.common.ObjectReference.toObject(message.impl, options, q + 1);
            if (message.isSynced != null && Object.hasOwnProperty.call(message, "isSynced"))
                object.isSynced = message.isSynced;
            return object;
        };

        /**
         * Converts this File to JSON.
         * @function toJSON
         * @memberof file.File
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        File.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for File
         * @function getTypeUrl
         * @memberof file.File
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        File.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.File";
        };

        return File;
    })();

    file.SyncStatusMsg = (function() {

        /**
         * Properties of a SyncStatusMsg.
         * @memberof file
         * @interface ISyncStatusMsg
         * @property {string|null} [state] SyncStatusMsg state
         * @property {file.ISyncVersionsBranchMsg|null} [local] SyncStatusMsg local
         * @property {file.ISyncVersionsBranchMsg|null} [synced] SyncStatusMsg synced
         * @property {file.ISyncVersionsBranchMsg|null} [remote] SyncStatusMsg remote
         * @property {common.IBooleanValue|null} [existsInSyncedParent] SyncStatusMsg existsInSyncedParent
         * @property {file.IUploadingStateMsg|null} [uploading] SyncStatusMsg uploading
         */

        /**
         * Constructs a new SyncStatusMsg.
         * @memberof file
         * @classdesc Represents a SyncStatusMsg.
         * @implements ISyncStatusMsg
         * @constructor
         * @param {file.ISyncStatusMsg=} [properties] Properties to set
         */
        function SyncStatusMsg(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * SyncStatusMsg state.
         * @member {string} state
         * @memberof file.SyncStatusMsg
         * @instance
         */
        SyncStatusMsg.prototype.state = "";

        /**
         * SyncStatusMsg local.
         * @member {file.ISyncVersionsBranchMsg|null|undefined} local
         * @memberof file.SyncStatusMsg
         * @instance
         */
        SyncStatusMsg.prototype.local = null;

        /**
         * SyncStatusMsg synced.
         * @member {file.ISyncVersionsBranchMsg|null|undefined} synced
         * @memberof file.SyncStatusMsg
         * @instance
         */
        SyncStatusMsg.prototype.synced = null;

        /**
         * SyncStatusMsg remote.
         * @member {file.ISyncVersionsBranchMsg|null|undefined} remote
         * @memberof file.SyncStatusMsg
         * @instance
         */
        SyncStatusMsg.prototype.remote = null;

        /**
         * SyncStatusMsg existsInSyncedParent.
         * @member {common.IBooleanValue|null|undefined} existsInSyncedParent
         * @memberof file.SyncStatusMsg
         * @instance
         */
        SyncStatusMsg.prototype.existsInSyncedParent = null;

        /**
         * SyncStatusMsg uploading.
         * @member {file.IUploadingStateMsg|null|undefined} uploading
         * @memberof file.SyncStatusMsg
         * @instance
         */
        SyncStatusMsg.prototype.uploading = null;

        /**
         * Creates a new SyncStatusMsg instance using the specified properties.
         * @function create
         * @memberof file.SyncStatusMsg
         * @static
         * @param {file.ISyncStatusMsg=} [properties] Properties to set
         * @returns {file.SyncStatusMsg} SyncStatusMsg instance
         */
        SyncStatusMsg.create = function create(properties) {
            return new SyncStatusMsg(properties);
        };

        /**
         * Encodes the specified SyncStatusMsg message. Does not implicitly {@link file.SyncStatusMsg.verify|verify} messages.
         * @function encode
         * @memberof file.SyncStatusMsg
         * @static
         * @param {file.ISyncStatusMsg} message SyncStatusMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SyncStatusMsg.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.state != null && Object.hasOwnProperty.call(message, "state"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.state);
            if (message.local != null && Object.hasOwnProperty.call(message, "local"))
                $root.file.SyncVersionsBranchMsg.encode(message.local, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.synced != null && Object.hasOwnProperty.call(message, "synced"))
                $root.file.SyncVersionsBranchMsg.encode(message.synced, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                $root.file.SyncVersionsBranchMsg.encode(message.remote, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            if (message.existsInSyncedParent != null && Object.hasOwnProperty.call(message, "existsInSyncedParent"))
                $root.common.BooleanValue.encode(message.existsInSyncedParent, writer.uint32(/* id 5, wireType 2 =*/42).fork(), q + 1).ldelim();
            if (message.uploading != null && Object.hasOwnProperty.call(message, "uploading"))
                $root.file.UploadingStateMsg.encode(message.uploading, writer.uint32(/* id 6, wireType 2 =*/50).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified SyncStatusMsg message, length delimited. Does not implicitly {@link file.SyncStatusMsg.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.SyncStatusMsg
         * @static
         * @param {file.ISyncStatusMsg} message SyncStatusMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SyncStatusMsg.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a SyncStatusMsg message from the specified reader or buffer.
         * @function decode
         * @memberof file.SyncStatusMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.SyncStatusMsg} SyncStatusMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SyncStatusMsg.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.SyncStatusMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.state = reader.string();
                        break;
                    }
                case 2: {
                        message.local = $root.file.SyncVersionsBranchMsg.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.synced = $root.file.SyncVersionsBranchMsg.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.remote = $root.file.SyncVersionsBranchMsg.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 5: {
                        message.existsInSyncedParent = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 6: {
                        message.uploading = $root.file.UploadingStateMsg.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a SyncStatusMsg message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.SyncStatusMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.SyncStatusMsg} SyncStatusMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SyncStatusMsg.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a SyncStatusMsg message.
         * @function verify
         * @memberof file.SyncStatusMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        SyncStatusMsg.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.state != null && Object.hasOwnProperty.call(message, "state"))
                if (!$util.isString(message.state))
                    return "state: string expected";
            if (message.local != null && Object.hasOwnProperty.call(message, "local")) {
                var error = $root.file.SyncVersionsBranchMsg.verify(message.local, long + 1);
                if (error)
                    return "local." + error;
            }
            if (message.synced != null && Object.hasOwnProperty.call(message, "synced")) {
                var error = $root.file.SyncVersionsBranchMsg.verify(message.synced, long + 1);
                if (error)
                    return "synced." + error;
            }
            if (message.remote != null && Object.hasOwnProperty.call(message, "remote")) {
                var error = $root.file.SyncVersionsBranchMsg.verify(message.remote, long + 1);
                if (error)
                    return "remote." + error;
            }
            if (message.existsInSyncedParent != null && Object.hasOwnProperty.call(message, "existsInSyncedParent")) {
                var error = $root.common.BooleanValue.verify(message.existsInSyncedParent, long + 1);
                if (error)
                    return "existsInSyncedParent." + error;
            }
            if (message.uploading != null && Object.hasOwnProperty.call(message, "uploading")) {
                var error = $root.file.UploadingStateMsg.verify(message.uploading, long + 1);
                if (error)
                    return "uploading." + error;
            }
            return null;
        };

        /**
         * Creates a SyncStatusMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.SyncStatusMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.SyncStatusMsg} SyncStatusMsg
         */
        SyncStatusMsg.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.SyncStatusMsg)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.SyncStatusMsg: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.SyncStatusMsg();
            if (object.state != null)
                message.state = String(object.state);
            if (object.local != null) {
                if (!$util.isObject(object.local))
                    throw TypeError(".file.SyncStatusMsg.local: object expected");
                message.local = $root.file.SyncVersionsBranchMsg.fromObject(object.local, long + 1);
            }
            if (object.synced != null) {
                if (!$util.isObject(object.synced))
                    throw TypeError(".file.SyncStatusMsg.synced: object expected");
                message.synced = $root.file.SyncVersionsBranchMsg.fromObject(object.synced, long + 1);
            }
            if (object.remote != null) {
                if (!$util.isObject(object.remote))
                    throw TypeError(".file.SyncStatusMsg.remote: object expected");
                message.remote = $root.file.SyncVersionsBranchMsg.fromObject(object.remote, long + 1);
            }
            if (object.existsInSyncedParent != null) {
                if (!$util.isObject(object.existsInSyncedParent))
                    throw TypeError(".file.SyncStatusMsg.existsInSyncedParent: object expected");
                message.existsInSyncedParent = $root.common.BooleanValue.fromObject(object.existsInSyncedParent, long + 1);
            }
            if (object.uploading != null) {
                if (!$util.isObject(object.uploading))
                    throw TypeError(".file.SyncStatusMsg.uploading: object expected");
                message.uploading = $root.file.UploadingStateMsg.fromObject(object.uploading, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a SyncStatusMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.SyncStatusMsg
         * @static
         * @param {file.SyncStatusMsg} message SyncStatusMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        SyncStatusMsg.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.state = "";
                object.local = null;
                object.synced = null;
                object.remote = null;
                object.existsInSyncedParent = null;
                object.uploading = null;
            }
            if (message.state != null && Object.hasOwnProperty.call(message, "state"))
                object.state = message.state;
            if (message.local != null && Object.hasOwnProperty.call(message, "local"))
                object.local = $root.file.SyncVersionsBranchMsg.toObject(message.local, options, q + 1);
            if (message.synced != null && Object.hasOwnProperty.call(message, "synced"))
                object.synced = $root.file.SyncVersionsBranchMsg.toObject(message.synced, options, q + 1);
            if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                object.remote = $root.file.SyncVersionsBranchMsg.toObject(message.remote, options, q + 1);
            if (message.existsInSyncedParent != null && Object.hasOwnProperty.call(message, "existsInSyncedParent"))
                object.existsInSyncedParent = $root.common.BooleanValue.toObject(message.existsInSyncedParent, options, q + 1);
            if (message.uploading != null && Object.hasOwnProperty.call(message, "uploading"))
                object.uploading = $root.file.UploadingStateMsg.toObject(message.uploading, options, q + 1);
            return object;
        };

        /**
         * Converts this SyncStatusMsg to JSON.
         * @function toJSON
         * @memberof file.SyncStatusMsg
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        SyncStatusMsg.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for SyncStatusMsg
         * @function getTypeUrl
         * @memberof file.SyncStatusMsg
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        SyncStatusMsg.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.SyncStatusMsg";
        };

        return SyncStatusMsg;
    })();

    file.SyncVersionsBranchMsg = (function() {

        /**
         * Properties of a SyncVersionsBranchMsg.
         * @memberof file
         * @interface ISyncVersionsBranchMsg
         * @property {common.IUInt64Value|null} [latest] SyncVersionsBranchMsg latest
         * @property {Array.<number|Long>|null} [archived] SyncVersionsBranchMsg archived
         * @property {common.IBooleanValue|null} [isArchived] SyncVersionsBranchMsg isArchived
         */

        /**
         * Constructs a new SyncVersionsBranchMsg.
         * @memberof file
         * @classdesc Represents a SyncVersionsBranchMsg.
         * @implements ISyncVersionsBranchMsg
         * @constructor
         * @param {file.ISyncVersionsBranchMsg=} [properties] Properties to set
         */
        function SyncVersionsBranchMsg(properties) {
            this.archived = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * SyncVersionsBranchMsg latest.
         * @member {common.IUInt64Value|null|undefined} latest
         * @memberof file.SyncVersionsBranchMsg
         * @instance
         */
        SyncVersionsBranchMsg.prototype.latest = null;

        /**
         * SyncVersionsBranchMsg archived.
         * @member {Array.<number|Long>} archived
         * @memberof file.SyncVersionsBranchMsg
         * @instance
         */
        SyncVersionsBranchMsg.prototype.archived = $util.emptyArray;

        /**
         * SyncVersionsBranchMsg isArchived.
         * @member {common.IBooleanValue|null|undefined} isArchived
         * @memberof file.SyncVersionsBranchMsg
         * @instance
         */
        SyncVersionsBranchMsg.prototype.isArchived = null;

        /**
         * Creates a new SyncVersionsBranchMsg instance using the specified properties.
         * @function create
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {file.ISyncVersionsBranchMsg=} [properties] Properties to set
         * @returns {file.SyncVersionsBranchMsg} SyncVersionsBranchMsg instance
         */
        SyncVersionsBranchMsg.create = function create(properties) {
            return new SyncVersionsBranchMsg(properties);
        };

        /**
         * Encodes the specified SyncVersionsBranchMsg message. Does not implicitly {@link file.SyncVersionsBranchMsg.verify|verify} messages.
         * @function encode
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {file.ISyncVersionsBranchMsg} message SyncVersionsBranchMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SyncVersionsBranchMsg.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.latest != null && Object.hasOwnProperty.call(message, "latest"))
                $root.common.UInt64Value.encode(message.latest, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.archived != null && message.archived.length) {
                writer.uint32(/* id 2, wireType 2 =*/18).fork();
                for (var i = 0; i < message.archived.length; ++i)
                    writer.uint64(message.archived[i]);
                writer.ldelim();
            }
            if (message.isArchived != null && Object.hasOwnProperty.call(message, "isArchived"))
                $root.common.BooleanValue.encode(message.isArchived, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified SyncVersionsBranchMsg message, length delimited. Does not implicitly {@link file.SyncVersionsBranchMsg.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {file.ISyncVersionsBranchMsg} message SyncVersionsBranchMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SyncVersionsBranchMsg.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a SyncVersionsBranchMsg message from the specified reader or buffer.
         * @function decode
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.SyncVersionsBranchMsg} SyncVersionsBranchMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SyncVersionsBranchMsg.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.SyncVersionsBranchMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.latest = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        if (!(message.archived && message.archived.length))
                            message.archived = [];
                        if ((tag & 7) === 2) {
                            var end2 = reader.uint32() + reader.pos;
                            while (reader.pos < end2)
                                message.archived.push(reader.uint64());
                        } else
                            message.archived.push(reader.uint64());
                        break;
                    }
                case 3: {
                        message.isArchived = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a SyncVersionsBranchMsg message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.SyncVersionsBranchMsg} SyncVersionsBranchMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SyncVersionsBranchMsg.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a SyncVersionsBranchMsg message.
         * @function verify
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        SyncVersionsBranchMsg.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.latest != null && Object.hasOwnProperty.call(message, "latest")) {
                var error = $root.common.UInt64Value.verify(message.latest, long + 1);
                if (error)
                    return "latest." + error;
            }
            if (message.archived != null && Object.hasOwnProperty.call(message, "archived")) {
                if (!Array.isArray(message.archived))
                    return "archived: array expected";
                for (var i = 0; i < message.archived.length; ++i)
                    if (!$util.isInteger(message.archived[i]) && !(message.archived[i] && $util.isInteger(message.archived[i].low) && $util.isInteger(message.archived[i].high)))
                        return "archived: integer|Long[] expected";
            }
            if (message.isArchived != null && Object.hasOwnProperty.call(message, "isArchived")) {
                var error = $root.common.BooleanValue.verify(message.isArchived, long + 1);
                if (error)
                    return "isArchived." + error;
            }
            return null;
        };

        /**
         * Creates a SyncVersionsBranchMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.SyncVersionsBranchMsg} SyncVersionsBranchMsg
         */
        SyncVersionsBranchMsg.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.SyncVersionsBranchMsg)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.SyncVersionsBranchMsg: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.SyncVersionsBranchMsg();
            if (object.latest != null) {
                if (!$util.isObject(object.latest))
                    throw TypeError(".file.SyncVersionsBranchMsg.latest: object expected");
                message.latest = $root.common.UInt64Value.fromObject(object.latest, long + 1);
            }
            if (object.archived) {
                if (!Array.isArray(object.archived))
                    throw TypeError(".file.SyncVersionsBranchMsg.archived: array expected");
                message.archived = [];
                for (var i = 0; i < object.archived.length; ++i)
                    if ($util.Long)
                        message.archived[i] = $util.Long.fromValue(object.archived[i], true);
                    else if (typeof object.archived[i] === "string")
                        message.archived[i] = parseInt(object.archived[i], 10);
                    else if (typeof object.archived[i] === "number")
                        message.archived[i] = object.archived[i];
                    else if (typeof object.archived[i] === "object")
                        message.archived[i] = new $util.LongBits(object.archived[i].low >>> 0, object.archived[i].high >>> 0).toNumber(true);
            }
            if (object.isArchived != null) {
                if (!$util.isObject(object.isArchived))
                    throw TypeError(".file.SyncVersionsBranchMsg.isArchived: object expected");
                message.isArchived = $root.common.BooleanValue.fromObject(object.isArchived, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a SyncVersionsBranchMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {file.SyncVersionsBranchMsg} message SyncVersionsBranchMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        SyncVersionsBranchMsg.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.archived = [];
            if (options.defaults) {
                object.latest = null;
                object.isArchived = null;
            }
            if (message.latest != null && Object.hasOwnProperty.call(message, "latest"))
                object.latest = $root.common.UInt64Value.toObject(message.latest, options, q + 1);
            if (message.archived && message.archived.length) {
                object.archived = [];
                for (var j = 0; j < message.archived.length; ++j)
                    if (typeof BigInt !== "undefined" && options.longs === BigInt)
                        object.archived[j] = typeof message.archived[j] === "number" ? BigInt(message.archived[j]) : $util.Long.fromBits(message.archived[j].low >>> 0, message.archived[j].high >>> 0, true).toBigInt();
                    else if (typeof message.archived[j] === "number")
                        object.archived[j] = options.longs === String ? String(message.archived[j]) : message.archived[j];
                    else
                        object.archived[j] = options.longs === String ? $util.Long.prototype.toString.call(message.archived[j]) : options.longs === Number ? new $util.LongBits(message.archived[j].low >>> 0, message.archived[j].high >>> 0).toNumber(true) : message.archived[j];
            }
            if (message.isArchived != null && Object.hasOwnProperty.call(message, "isArchived"))
                object.isArchived = $root.common.BooleanValue.toObject(message.isArchived, options, q + 1);
            return object;
        };

        /**
         * Converts this SyncVersionsBranchMsg to JSON.
         * @function toJSON
         * @memberof file.SyncVersionsBranchMsg
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        SyncVersionsBranchMsg.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for SyncVersionsBranchMsg
         * @function getTypeUrl
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        SyncVersionsBranchMsg.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.SyncVersionsBranchMsg";
        };

        return SyncVersionsBranchMsg;
    })();

    file.UploadingStateMsg = (function() {

        /**
         * Properties of an UploadingStateMsg.
         * @memberof file
         * @interface IUploadingStateMsg
         * @property {number|Long|null} [localVersion] UploadingStateMsg localVersion
         * @property {number|Long|null} [remoteVersion] UploadingStateMsg remoteVersion
         * @property {number|Long|null} [bytesLeftToUpload] UploadingStateMsg bytesLeftToUpload
         * @property {boolean|null} [uploadStarted] UploadingStateMsg uploadStarted
         */

        /**
         * Constructs a new UploadingStateMsg.
         * @memberof file
         * @classdesc Represents an UploadingStateMsg.
         * @implements IUploadingStateMsg
         * @constructor
         * @param {file.IUploadingStateMsg=} [properties] Properties to set
         */
        function UploadingStateMsg(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * UploadingStateMsg localVersion.
         * @member {number|Long} localVersion
         * @memberof file.UploadingStateMsg
         * @instance
         */
        UploadingStateMsg.prototype.localVersion = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * UploadingStateMsg remoteVersion.
         * @member {number|Long} remoteVersion
         * @memberof file.UploadingStateMsg
         * @instance
         */
        UploadingStateMsg.prototype.remoteVersion = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * UploadingStateMsg bytesLeftToUpload.
         * @member {number|Long} bytesLeftToUpload
         * @memberof file.UploadingStateMsg
         * @instance
         */
        UploadingStateMsg.prototype.bytesLeftToUpload = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * UploadingStateMsg uploadStarted.
         * @member {boolean} uploadStarted
         * @memberof file.UploadingStateMsg
         * @instance
         */
        UploadingStateMsg.prototype.uploadStarted = false;

        /**
         * Creates a new UploadingStateMsg instance using the specified properties.
         * @function create
         * @memberof file.UploadingStateMsg
         * @static
         * @param {file.IUploadingStateMsg=} [properties] Properties to set
         * @returns {file.UploadingStateMsg} UploadingStateMsg instance
         */
        UploadingStateMsg.create = function create(properties) {
            return new UploadingStateMsg(properties);
        };

        /**
         * Encodes the specified UploadingStateMsg message. Does not implicitly {@link file.UploadingStateMsg.verify|verify} messages.
         * @function encode
         * @memberof file.UploadingStateMsg
         * @static
         * @param {file.IUploadingStateMsg} message UploadingStateMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UploadingStateMsg.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.localVersion);
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.remoteVersion);
            if (message.bytesLeftToUpload != null && Object.hasOwnProperty.call(message, "bytesLeftToUpload"))
                writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.bytesLeftToUpload);
            if (message.uploadStarted != null && Object.hasOwnProperty.call(message, "uploadStarted"))
                writer.uint32(/* id 4, wireType 0 =*/32).bool(message.uploadStarted);
            return writer;
        };

        /**
         * Encodes the specified UploadingStateMsg message, length delimited. Does not implicitly {@link file.UploadingStateMsg.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.UploadingStateMsg
         * @static
         * @param {file.IUploadingStateMsg} message UploadingStateMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UploadingStateMsg.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an UploadingStateMsg message from the specified reader or buffer.
         * @function decode
         * @memberof file.UploadingStateMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.UploadingStateMsg} UploadingStateMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UploadingStateMsg.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.UploadingStateMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.localVersion = reader.uint64();
                        break;
                    }
                case 2: {
                        message.remoteVersion = reader.uint64();
                        break;
                    }
                case 3: {
                        message.bytesLeftToUpload = reader.uint64();
                        break;
                    }
                case 4: {
                        message.uploadStarted = reader.bool();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an UploadingStateMsg message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.UploadingStateMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.UploadingStateMsg} UploadingStateMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UploadingStateMsg.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an UploadingStateMsg message.
         * @function verify
         * @memberof file.UploadingStateMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        UploadingStateMsg.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                if (!$util.isInteger(message.localVersion) && !(message.localVersion && $util.isInteger(message.localVersion.low) && $util.isInteger(message.localVersion.high)))
                    return "localVersion: integer|Long expected";
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                if (!$util.isInteger(message.remoteVersion) && !(message.remoteVersion && $util.isInteger(message.remoteVersion.low) && $util.isInteger(message.remoteVersion.high)))
                    return "remoteVersion: integer|Long expected";
            if (message.bytesLeftToUpload != null && Object.hasOwnProperty.call(message, "bytesLeftToUpload"))
                if (!$util.isInteger(message.bytesLeftToUpload) && !(message.bytesLeftToUpload && $util.isInteger(message.bytesLeftToUpload.low) && $util.isInteger(message.bytesLeftToUpload.high)))
                    return "bytesLeftToUpload: integer|Long expected";
            if (message.uploadStarted != null && Object.hasOwnProperty.call(message, "uploadStarted"))
                if (typeof message.uploadStarted !== "boolean")
                    return "uploadStarted: boolean expected";
            return null;
        };

        /**
         * Creates an UploadingStateMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.UploadingStateMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.UploadingStateMsg} UploadingStateMsg
         */
        UploadingStateMsg.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.UploadingStateMsg)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.UploadingStateMsg: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.UploadingStateMsg();
            if (object.localVersion != null)
                if ($util.Long)
                    message.localVersion = $util.Long.fromValue(object.localVersion, true);
                else if (typeof object.localVersion === "string")
                    message.localVersion = parseInt(object.localVersion, 10);
                else if (typeof object.localVersion === "number")
                    message.localVersion = object.localVersion;
                else if (typeof object.localVersion === "object")
                    message.localVersion = new $util.LongBits(object.localVersion.low >>> 0, object.localVersion.high >>> 0).toNumber(true);
            if (object.remoteVersion != null)
                if ($util.Long)
                    message.remoteVersion = $util.Long.fromValue(object.remoteVersion, true);
                else if (typeof object.remoteVersion === "string")
                    message.remoteVersion = parseInt(object.remoteVersion, 10);
                else if (typeof object.remoteVersion === "number")
                    message.remoteVersion = object.remoteVersion;
                else if (typeof object.remoteVersion === "object")
                    message.remoteVersion = new $util.LongBits(object.remoteVersion.low >>> 0, object.remoteVersion.high >>> 0).toNumber(true);
            if (object.bytesLeftToUpload != null)
                if ($util.Long)
                    message.bytesLeftToUpload = $util.Long.fromValue(object.bytesLeftToUpload, true);
                else if (typeof object.bytesLeftToUpload === "string")
                    message.bytesLeftToUpload = parseInt(object.bytesLeftToUpload, 10);
                else if (typeof object.bytesLeftToUpload === "number")
                    message.bytesLeftToUpload = object.bytesLeftToUpload;
                else if (typeof object.bytesLeftToUpload === "object")
                    message.bytesLeftToUpload = new $util.LongBits(object.bytesLeftToUpload.low >>> 0, object.bytesLeftToUpload.high >>> 0).toNumber(true);
            if (object.uploadStarted != null)
                message.uploadStarted = Boolean(object.uploadStarted);
            return message;
        };

        /**
         * Creates a plain object from an UploadingStateMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.UploadingStateMsg
         * @static
         * @param {file.UploadingStateMsg} message UploadingStateMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        UploadingStateMsg.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.localVersion = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.localVersion = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.remoteVersion = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.remoteVersion = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.bytesLeftToUpload = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.bytesLeftToUpload = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.uploadStarted = false;
            }
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.localVersion = typeof message.localVersion === "number" ? BigInt(message.localVersion) : $util.Long.fromBits(message.localVersion.low >>> 0, message.localVersion.high >>> 0, true).toBigInt();
                else if (typeof message.localVersion === "number")
                    object.localVersion = options.longs === String ? String(message.localVersion) : message.localVersion;
                else
                    object.localVersion = options.longs === String ? $util.Long.prototype.toString.call(message.localVersion) : options.longs === Number ? new $util.LongBits(message.localVersion.low >>> 0, message.localVersion.high >>> 0).toNumber(true) : message.localVersion;
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.remoteVersion = typeof message.remoteVersion === "number" ? BigInt(message.remoteVersion) : $util.Long.fromBits(message.remoteVersion.low >>> 0, message.remoteVersion.high >>> 0, true).toBigInt();
                else if (typeof message.remoteVersion === "number")
                    object.remoteVersion = options.longs === String ? String(message.remoteVersion) : message.remoteVersion;
                else
                    object.remoteVersion = options.longs === String ? $util.Long.prototype.toString.call(message.remoteVersion) : options.longs === Number ? new $util.LongBits(message.remoteVersion.low >>> 0, message.remoteVersion.high >>> 0).toNumber(true) : message.remoteVersion;
            if (message.bytesLeftToUpload != null && Object.hasOwnProperty.call(message, "bytesLeftToUpload"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.bytesLeftToUpload = typeof message.bytesLeftToUpload === "number" ? BigInt(message.bytesLeftToUpload) : $util.Long.fromBits(message.bytesLeftToUpload.low >>> 0, message.bytesLeftToUpload.high >>> 0, true).toBigInt();
                else if (typeof message.bytesLeftToUpload === "number")
                    object.bytesLeftToUpload = options.longs === String ? String(message.bytesLeftToUpload) : message.bytesLeftToUpload;
                else
                    object.bytesLeftToUpload = options.longs === String ? $util.Long.prototype.toString.call(message.bytesLeftToUpload) : options.longs === Number ? new $util.LongBits(message.bytesLeftToUpload.low >>> 0, message.bytesLeftToUpload.high >>> 0).toNumber(true) : message.bytesLeftToUpload;
            if (message.uploadStarted != null && Object.hasOwnProperty.call(message, "uploadStarted"))
                object.uploadStarted = message.uploadStarted;
            return object;
        };

        /**
         * Converts this UploadingStateMsg to JSON.
         * @function toJSON
         * @memberof file.UploadingStateMsg
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        UploadingStateMsg.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for UploadingStateMsg
         * @function getTypeUrl
         * @memberof file.UploadingStateMsg
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        UploadingStateMsg.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.UploadingStateMsg";
        };

        return UploadingStateMsg;
    })();

    file.StatsMsg = (function() {

        /**
         * Properties of a StatsMsg.
         * @memberof file
         * @interface IStatsMsg
         * @property {common.IBooleanValue|null} [isFile] StatsMsg isFile
         * @property {common.IBooleanValue|null} [isFolder] StatsMsg isFolder
         * @property {common.IBooleanValue|null} [isLink] StatsMsg isLink
         * @property {boolean|null} [writable] StatsMsg writable
         * @property {common.IUInt64Value|null} [size] StatsMsg size
         * @property {common.IUInt64Value|null} [mtime] StatsMsg mtime
         * @property {common.IUInt64Value|null} [ctime] StatsMsg ctime
         * @property {common.IUInt64Value|null} [version] StatsMsg version
         * @property {common.IUInt64Value|null} [bytesNeedDownload] StatsMsg bytesNeedDownload
         * @property {common.IStringValue|null} [versionSyncBranch] StatsMsg versionSyncBranch
         */

        /**
         * Constructs a new StatsMsg.
         * @memberof file
         * @classdesc Represents a StatsMsg.
         * @implements IStatsMsg
         * @constructor
         * @param {file.IStatsMsg=} [properties] Properties to set
         */
        function StatsMsg(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * StatsMsg isFile.
         * @member {common.IBooleanValue|null|undefined} isFile
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.isFile = null;

        /**
         * StatsMsg isFolder.
         * @member {common.IBooleanValue|null|undefined} isFolder
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.isFolder = null;

        /**
         * StatsMsg isLink.
         * @member {common.IBooleanValue|null|undefined} isLink
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.isLink = null;

        /**
         * StatsMsg writable.
         * @member {boolean} writable
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.writable = false;

        /**
         * StatsMsg size.
         * @member {common.IUInt64Value|null|undefined} size
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.size = null;

        /**
         * StatsMsg mtime.
         * @member {common.IUInt64Value|null|undefined} mtime
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.mtime = null;

        /**
         * StatsMsg ctime.
         * @member {common.IUInt64Value|null|undefined} ctime
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.ctime = null;

        /**
         * StatsMsg version.
         * @member {common.IUInt64Value|null|undefined} version
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.version = null;

        /**
         * StatsMsg bytesNeedDownload.
         * @member {common.IUInt64Value|null|undefined} bytesNeedDownload
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.bytesNeedDownload = null;

        /**
         * StatsMsg versionSyncBranch.
         * @member {common.IStringValue|null|undefined} versionSyncBranch
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.versionSyncBranch = null;

        /**
         * Creates a new StatsMsg instance using the specified properties.
         * @function create
         * @memberof file.StatsMsg
         * @static
         * @param {file.IStatsMsg=} [properties] Properties to set
         * @returns {file.StatsMsg} StatsMsg instance
         */
        StatsMsg.create = function create(properties) {
            return new StatsMsg(properties);
        };

        /**
         * Encodes the specified StatsMsg message. Does not implicitly {@link file.StatsMsg.verify|verify} messages.
         * @function encode
         * @memberof file.StatsMsg
         * @static
         * @param {file.IStatsMsg} message StatsMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StatsMsg.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                $root.common.BooleanValue.encode(message.isFile, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                $root.common.BooleanValue.encode(message.isFolder, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink"))
                $root.common.BooleanValue.encode(message.isLink, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.writable != null && Object.hasOwnProperty.call(message, "writable"))
                writer.uint32(/* id 4, wireType 0 =*/32).bool(message.writable);
            if (message.size != null && Object.hasOwnProperty.call(message, "size"))
                $root.common.UInt64Value.encode(message.size, writer.uint32(/* id 5, wireType 2 =*/42).fork(), q + 1).ldelim();
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime"))
                $root.common.UInt64Value.encode(message.mtime, writer.uint32(/* id 6, wireType 2 =*/50).fork(), q + 1).ldelim();
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime"))
                $root.common.UInt64Value.encode(message.ctime, writer.uint32(/* id 7, wireType 2 =*/58).fork(), q + 1).ldelim();
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                $root.common.UInt64Value.encode(message.version, writer.uint32(/* id 8, wireType 2 =*/66).fork(), q + 1).ldelim();
            if (message.bytesNeedDownload != null && Object.hasOwnProperty.call(message, "bytesNeedDownload"))
                $root.common.UInt64Value.encode(message.bytesNeedDownload, writer.uint32(/* id 9, wireType 2 =*/74).fork(), q + 1).ldelim();
            if (message.versionSyncBranch != null && Object.hasOwnProperty.call(message, "versionSyncBranch"))
                $root.common.StringValue.encode(message.versionSyncBranch, writer.uint32(/* id 10, wireType 2 =*/82).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified StatsMsg message, length delimited. Does not implicitly {@link file.StatsMsg.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.StatsMsg
         * @static
         * @param {file.IStatsMsg} message StatsMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StatsMsg.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a StatsMsg message from the specified reader or buffer.
         * @function decode
         * @memberof file.StatsMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.StatsMsg} StatsMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StatsMsg.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.StatsMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.isFile = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.isFolder = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.isLink = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.writable = reader.bool();
                        break;
                    }
                case 5: {
                        message.size = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 6: {
                        message.mtime = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 7: {
                        message.ctime = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 8: {
                        message.version = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 9: {
                        message.bytesNeedDownload = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 10: {
                        message.versionSyncBranch = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a StatsMsg message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.StatsMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.StatsMsg} StatsMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StatsMsg.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a StatsMsg message.
         * @function verify
         * @memberof file.StatsMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        StatsMsg.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile")) {
                var error = $root.common.BooleanValue.verify(message.isFile, long + 1);
                if (error)
                    return "isFile." + error;
            }
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder")) {
                var error = $root.common.BooleanValue.verify(message.isFolder, long + 1);
                if (error)
                    return "isFolder." + error;
            }
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink")) {
                var error = $root.common.BooleanValue.verify(message.isLink, long + 1);
                if (error)
                    return "isLink." + error;
            }
            if (message.writable != null && Object.hasOwnProperty.call(message, "writable"))
                if (typeof message.writable !== "boolean")
                    return "writable: boolean expected";
            if (message.size != null && Object.hasOwnProperty.call(message, "size")) {
                var error = $root.common.UInt64Value.verify(message.size, long + 1);
                if (error)
                    return "size." + error;
            }
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime")) {
                var error = $root.common.UInt64Value.verify(message.mtime, long + 1);
                if (error)
                    return "mtime." + error;
            }
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime")) {
                var error = $root.common.UInt64Value.verify(message.ctime, long + 1);
                if (error)
                    return "ctime." + error;
            }
            if (message.version != null && Object.hasOwnProperty.call(message, "version")) {
                var error = $root.common.UInt64Value.verify(message.version, long + 1);
                if (error)
                    return "version." + error;
            }
            if (message.bytesNeedDownload != null && Object.hasOwnProperty.call(message, "bytesNeedDownload")) {
                var error = $root.common.UInt64Value.verify(message.bytesNeedDownload, long + 1);
                if (error)
                    return "bytesNeedDownload." + error;
            }
            if (message.versionSyncBranch != null && Object.hasOwnProperty.call(message, "versionSyncBranch")) {
                var error = $root.common.StringValue.verify(message.versionSyncBranch, long + 1);
                if (error)
                    return "versionSyncBranch." + error;
            }
            return null;
        };

        /**
         * Creates a StatsMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.StatsMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.StatsMsg} StatsMsg
         */
        StatsMsg.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.StatsMsg)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.StatsMsg: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.StatsMsg();
            if (object.isFile != null) {
                if (!$util.isObject(object.isFile))
                    throw TypeError(".file.StatsMsg.isFile: object expected");
                message.isFile = $root.common.BooleanValue.fromObject(object.isFile, long + 1);
            }
            if (object.isFolder != null) {
                if (!$util.isObject(object.isFolder))
                    throw TypeError(".file.StatsMsg.isFolder: object expected");
                message.isFolder = $root.common.BooleanValue.fromObject(object.isFolder, long + 1);
            }
            if (object.isLink != null) {
                if (!$util.isObject(object.isLink))
                    throw TypeError(".file.StatsMsg.isLink: object expected");
                message.isLink = $root.common.BooleanValue.fromObject(object.isLink, long + 1);
            }
            if (object.writable != null)
                message.writable = Boolean(object.writable);
            if (object.size != null) {
                if (!$util.isObject(object.size))
                    throw TypeError(".file.StatsMsg.size: object expected");
                message.size = $root.common.UInt64Value.fromObject(object.size, long + 1);
            }
            if (object.mtime != null) {
                if (!$util.isObject(object.mtime))
                    throw TypeError(".file.StatsMsg.mtime: object expected");
                message.mtime = $root.common.UInt64Value.fromObject(object.mtime, long + 1);
            }
            if (object.ctime != null) {
                if (!$util.isObject(object.ctime))
                    throw TypeError(".file.StatsMsg.ctime: object expected");
                message.ctime = $root.common.UInt64Value.fromObject(object.ctime, long + 1);
            }
            if (object.version != null) {
                if (!$util.isObject(object.version))
                    throw TypeError(".file.StatsMsg.version: object expected");
                message.version = $root.common.UInt64Value.fromObject(object.version, long + 1);
            }
            if (object.bytesNeedDownload != null) {
                if (!$util.isObject(object.bytesNeedDownload))
                    throw TypeError(".file.StatsMsg.bytesNeedDownload: object expected");
                message.bytesNeedDownload = $root.common.UInt64Value.fromObject(object.bytesNeedDownload, long + 1);
            }
            if (object.versionSyncBranch != null) {
                if (!$util.isObject(object.versionSyncBranch))
                    throw TypeError(".file.StatsMsg.versionSyncBranch: object expected");
                message.versionSyncBranch = $root.common.StringValue.fromObject(object.versionSyncBranch, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a StatsMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.StatsMsg
         * @static
         * @param {file.StatsMsg} message StatsMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        StatsMsg.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.isFile = null;
                object.isFolder = null;
                object.isLink = null;
                object.writable = false;
                object.size = null;
                object.mtime = null;
                object.ctime = null;
                object.version = null;
                object.bytesNeedDownload = null;
                object.versionSyncBranch = null;
            }
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                object.isFile = $root.common.BooleanValue.toObject(message.isFile, options, q + 1);
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                object.isFolder = $root.common.BooleanValue.toObject(message.isFolder, options, q + 1);
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink"))
                object.isLink = $root.common.BooleanValue.toObject(message.isLink, options, q + 1);
            if (message.writable != null && Object.hasOwnProperty.call(message, "writable"))
                object.writable = message.writable;
            if (message.size != null && Object.hasOwnProperty.call(message, "size"))
                object.size = $root.common.UInt64Value.toObject(message.size, options, q + 1);
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime"))
                object.mtime = $root.common.UInt64Value.toObject(message.mtime, options, q + 1);
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime"))
                object.ctime = $root.common.UInt64Value.toObject(message.ctime, options, q + 1);
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                object.version = $root.common.UInt64Value.toObject(message.version, options, q + 1);
            if (message.bytesNeedDownload != null && Object.hasOwnProperty.call(message, "bytesNeedDownload"))
                object.bytesNeedDownload = $root.common.UInt64Value.toObject(message.bytesNeedDownload, options, q + 1);
            if (message.versionSyncBranch != null && Object.hasOwnProperty.call(message, "versionSyncBranch"))
                object.versionSyncBranch = $root.common.StringValue.toObject(message.versionSyncBranch, options, q + 1);
            return object;
        };

        /**
         * Converts this StatsMsg to JSON.
         * @function toJSON
         * @memberof file.StatsMsg
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        StatsMsg.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for StatsMsg
         * @function getTypeUrl
         * @memberof file.StatsMsg
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        StatsMsg.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.StatsMsg";
        };

        return StatsMsg;
    })();

    file.GetXAttrRequestBody = (function() {

        /**
         * Properties of a GetXAttrRequestBody.
         * @memberof file
         * @interface IGetXAttrRequestBody
         * @property {string|null} [xaName] GetXAttrRequestBody xaName
         */

        /**
         * Constructs a new GetXAttrRequestBody.
         * @memberof file
         * @classdesc Represents a GetXAttrRequestBody.
         * @implements IGetXAttrRequestBody
         * @constructor
         * @param {file.IGetXAttrRequestBody=} [properties] Properties to set
         */
        function GetXAttrRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * GetXAttrRequestBody xaName.
         * @member {string} xaName
         * @memberof file.GetXAttrRequestBody
         * @instance
         */
        GetXAttrRequestBody.prototype.xaName = "";

        /**
         * Creates a new GetXAttrRequestBody instance using the specified properties.
         * @function create
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {file.IGetXAttrRequestBody=} [properties] Properties to set
         * @returns {file.GetXAttrRequestBody} GetXAttrRequestBody instance
         */
        GetXAttrRequestBody.create = function create(properties) {
            return new GetXAttrRequestBody(properties);
        };

        /**
         * Encodes the specified GetXAttrRequestBody message. Does not implicitly {@link file.GetXAttrRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {file.IGetXAttrRequestBody} message GetXAttrRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        GetXAttrRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.xaName);
            return writer;
        };

        /**
         * Encodes the specified GetXAttrRequestBody message, length delimited. Does not implicitly {@link file.GetXAttrRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {file.IGetXAttrRequestBody} message GetXAttrRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        GetXAttrRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a GetXAttrRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.GetXAttrRequestBody} GetXAttrRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        GetXAttrRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.GetXAttrRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.xaName = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a GetXAttrRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.GetXAttrRequestBody} GetXAttrRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        GetXAttrRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a GetXAttrRequestBody message.
         * @function verify
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        GetXAttrRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                if (!$util.isString(message.xaName))
                    return "xaName: string expected";
            return null;
        };

        /**
         * Creates a GetXAttrRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.GetXAttrRequestBody} GetXAttrRequestBody
         */
        GetXAttrRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.GetXAttrRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.GetXAttrRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.GetXAttrRequestBody();
            if (object.xaName != null)
                message.xaName = String(object.xaName);
            return message;
        };

        /**
         * Creates a plain object from a GetXAttrRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {file.GetXAttrRequestBody} message GetXAttrRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        GetXAttrRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.xaName = "";
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                object.xaName = message.xaName;
            return object;
        };

        /**
         * Converts this GetXAttrRequestBody to JSON.
         * @function toJSON
         * @memberof file.GetXAttrRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        GetXAttrRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for GetXAttrRequestBody
         * @function getTypeUrl
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        GetXAttrRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.GetXAttrRequestBody";
        };

        return GetXAttrRequestBody;
    })();

    file.XAttrValue = (function() {

        /**
         * Properties of a XAttrValue.
         * @memberof file
         * @interface IXAttrValue
         * @property {common.IStringValue|null} [str] XAttrValue str
         * @property {common.IStringValue|null} [json] XAttrValue json
         * @property {common.IBytesValue|null} [bytes] XAttrValue bytes
         */

        /**
         * Constructs a new XAttrValue.
         * @memberof file
         * @classdesc Represents a XAttrValue.
         * @implements IXAttrValue
         * @constructor
         * @param {file.IXAttrValue=} [properties] Properties to set
         */
        function XAttrValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * XAttrValue str.
         * @member {common.IStringValue|null|undefined} str
         * @memberof file.XAttrValue
         * @instance
         */
        XAttrValue.prototype.str = null;

        /**
         * XAttrValue json.
         * @member {common.IStringValue|null|undefined} json
         * @memberof file.XAttrValue
         * @instance
         */
        XAttrValue.prototype.json = null;

        /**
         * XAttrValue bytes.
         * @member {common.IBytesValue|null|undefined} bytes
         * @memberof file.XAttrValue
         * @instance
         */
        XAttrValue.prototype.bytes = null;

        /**
         * Creates a new XAttrValue instance using the specified properties.
         * @function create
         * @memberof file.XAttrValue
         * @static
         * @param {file.IXAttrValue=} [properties] Properties to set
         * @returns {file.XAttrValue} XAttrValue instance
         */
        XAttrValue.create = function create(properties) {
            return new XAttrValue(properties);
        };

        /**
         * Encodes the specified XAttrValue message. Does not implicitly {@link file.XAttrValue.verify|verify} messages.
         * @function encode
         * @memberof file.XAttrValue
         * @static
         * @param {file.IXAttrValue} message XAttrValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        XAttrValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.str != null && Object.hasOwnProperty.call(message, "str"))
                $root.common.StringValue.encode(message.str, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified XAttrValue message, length delimited. Does not implicitly {@link file.XAttrValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.XAttrValue
         * @static
         * @param {file.IXAttrValue} message XAttrValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        XAttrValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a XAttrValue message from the specified reader or buffer.
         * @function decode
         * @memberof file.XAttrValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.XAttrValue} XAttrValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        XAttrValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.XAttrValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.str = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.json = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a XAttrValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.XAttrValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.XAttrValue} XAttrValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        XAttrValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a XAttrValue message.
         * @function verify
         * @memberof file.XAttrValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        XAttrValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.str != null && Object.hasOwnProperty.call(message, "str")) {
                var error = $root.common.StringValue.verify(message.str, long + 1);
                if (error)
                    return "str." + error;
            }
            if (message.json != null && Object.hasOwnProperty.call(message, "json")) {
                var error = $root.common.StringValue.verify(message.json, long + 1);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes, long + 1);
                if (error)
                    return "bytes." + error;
            }
            return null;
        };

        /**
         * Creates a XAttrValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.XAttrValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.XAttrValue} XAttrValue
         */
        XAttrValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.XAttrValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.XAttrValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.XAttrValue();
            if (object.str != null) {
                if (!$util.isObject(object.str))
                    throw TypeError(".file.XAttrValue.str: object expected");
                message.str = $root.common.StringValue.fromObject(object.str, long + 1);
            }
            if (object.json != null) {
                if (!$util.isObject(object.json))
                    throw TypeError(".file.XAttrValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json, long + 1);
            }
            if (object.bytes != null) {
                if (!$util.isObject(object.bytes))
                    throw TypeError(".file.XAttrValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a XAttrValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.XAttrValue
         * @static
         * @param {file.XAttrValue} message XAttrValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        XAttrValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.str = null;
                object.json = null;
                object.bytes = null;
            }
            if (message.str != null && Object.hasOwnProperty.call(message, "str"))
                object.str = $root.common.StringValue.toObject(message.str, options, q + 1);
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = $root.common.StringValue.toObject(message.json, options, q + 1);
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options, q + 1);
            return object;
        };

        /**
         * Converts this XAttrValue to JSON.
         * @function toJSON
         * @memberof file.XAttrValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        XAttrValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for XAttrValue
         * @function getTypeUrl
         * @memberof file.XAttrValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        XAttrValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.XAttrValue";
        };

        return XAttrValue;
    })();

    file.ReadBytesRequestBody = (function() {

        /**
         * Properties of a ReadBytesRequestBody.
         * @memberof file
         * @interface IReadBytesRequestBody
         * @property {common.IUInt64Value|null} [start] ReadBytesRequestBody start
         * @property {common.IUInt64Value|null} [end] ReadBytesRequestBody end
         */

        /**
         * Constructs a new ReadBytesRequestBody.
         * @memberof file
         * @classdesc Represents a ReadBytesRequestBody.
         * @implements IReadBytesRequestBody
         * @constructor
         * @param {file.IReadBytesRequestBody=} [properties] Properties to set
         */
        function ReadBytesRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ReadBytesRequestBody start.
         * @member {common.IUInt64Value|null|undefined} start
         * @memberof file.ReadBytesRequestBody
         * @instance
         */
        ReadBytesRequestBody.prototype.start = null;

        /**
         * ReadBytesRequestBody end.
         * @member {common.IUInt64Value|null|undefined} end
         * @memberof file.ReadBytesRequestBody
         * @instance
         */
        ReadBytesRequestBody.prototype.end = null;

        /**
         * Creates a new ReadBytesRequestBody instance using the specified properties.
         * @function create
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {file.IReadBytesRequestBody=} [properties] Properties to set
         * @returns {file.ReadBytesRequestBody} ReadBytesRequestBody instance
         */
        ReadBytesRequestBody.create = function create(properties) {
            return new ReadBytesRequestBody(properties);
        };

        /**
         * Encodes the specified ReadBytesRequestBody message. Does not implicitly {@link file.ReadBytesRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {file.IReadBytesRequestBody} message ReadBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ReadBytesRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                $root.common.UInt64Value.encode(message.start, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                $root.common.UInt64Value.encode(message.end, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified ReadBytesRequestBody message, length delimited. Does not implicitly {@link file.ReadBytesRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {file.IReadBytesRequestBody} message ReadBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ReadBytesRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a ReadBytesRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.ReadBytesRequestBody} ReadBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ReadBytesRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ReadBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.start = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.end = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a ReadBytesRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.ReadBytesRequestBody} ReadBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ReadBytesRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a ReadBytesRequestBody message.
         * @function verify
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ReadBytesRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.start != null && Object.hasOwnProperty.call(message, "start")) {
                var error = $root.common.UInt64Value.verify(message.start, long + 1);
                if (error)
                    return "start." + error;
            }
            if (message.end != null && Object.hasOwnProperty.call(message, "end")) {
                var error = $root.common.UInt64Value.verify(message.end, long + 1);
                if (error)
                    return "end." + error;
            }
            return null;
        };

        /**
         * Creates a ReadBytesRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.ReadBytesRequestBody} ReadBytesRequestBody
         */
        ReadBytesRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.ReadBytesRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.ReadBytesRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.ReadBytesRequestBody();
            if (object.start != null) {
                if (!$util.isObject(object.start))
                    throw TypeError(".file.ReadBytesRequestBody.start: object expected");
                message.start = $root.common.UInt64Value.fromObject(object.start, long + 1);
            }
            if (object.end != null) {
                if (!$util.isObject(object.end))
                    throw TypeError(".file.ReadBytesRequestBody.end: object expected");
                message.end = $root.common.UInt64Value.fromObject(object.end, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a ReadBytesRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {file.ReadBytesRequestBody} message ReadBytesRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ReadBytesRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.start = null;
                object.end = null;
            }
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                object.start = $root.common.UInt64Value.toObject(message.start, options, q + 1);
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                object.end = $root.common.UInt64Value.toObject(message.end, options, q + 1);
            return object;
        };

        /**
         * Converts this ReadBytesRequestBody to JSON.
         * @function toJSON
         * @memberof file.ReadBytesRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ReadBytesRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ReadBytesRequestBody
         * @function getTypeUrl
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ReadBytesRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.ReadBytesRequestBody";
        };

        return ReadBytesRequestBody;
    })();

    file.ReadBytesReplyBody = (function() {

        /**
         * Properties of a ReadBytesReplyBody.
         * @memberof file
         * @interface IReadBytesReplyBody
         * @property {common.IBytesValue|null} [bytes] ReadBytesReplyBody bytes
         */

        /**
         * Constructs a new ReadBytesReplyBody.
         * @memberof file
         * @classdesc Represents a ReadBytesReplyBody.
         * @implements IReadBytesReplyBody
         * @constructor
         * @param {file.IReadBytesReplyBody=} [properties] Properties to set
         */
        function ReadBytesReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ReadBytesReplyBody bytes.
         * @member {common.IBytesValue|null|undefined} bytes
         * @memberof file.ReadBytesReplyBody
         * @instance
         */
        ReadBytesReplyBody.prototype.bytes = null;

        /**
         * Creates a new ReadBytesReplyBody instance using the specified properties.
         * @function create
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {file.IReadBytesReplyBody=} [properties] Properties to set
         * @returns {file.ReadBytesReplyBody} ReadBytesReplyBody instance
         */
        ReadBytesReplyBody.create = function create(properties) {
            return new ReadBytesReplyBody(properties);
        };

        /**
         * Encodes the specified ReadBytesReplyBody message. Does not implicitly {@link file.ReadBytesReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {file.IReadBytesReplyBody} message ReadBytesReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ReadBytesReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified ReadBytesReplyBody message, length delimited. Does not implicitly {@link file.ReadBytesReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {file.IReadBytesReplyBody} message ReadBytesReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ReadBytesReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a ReadBytesReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.ReadBytesReplyBody} ReadBytesReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ReadBytesReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ReadBytesReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a ReadBytesReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.ReadBytesReplyBody} ReadBytesReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ReadBytesReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a ReadBytesReplyBody message.
         * @function verify
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ReadBytesReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes, long + 1);
                if (error)
                    return "bytes." + error;
            }
            return null;
        };

        /**
         * Creates a ReadBytesReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.ReadBytesReplyBody} ReadBytesReplyBody
         */
        ReadBytesReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.ReadBytesReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.ReadBytesReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.ReadBytesReplyBody();
            if (object.bytes != null) {
                if (!$util.isObject(object.bytes))
                    throw TypeError(".file.ReadBytesReplyBody.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a ReadBytesReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {file.ReadBytesReplyBody} message ReadBytesReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ReadBytesReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.bytes = null;
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options, q + 1);
            return object;
        };

        /**
         * Converts this ReadBytesReplyBody to JSON.
         * @function toJSON
         * @memberof file.ReadBytesReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ReadBytesReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ReadBytesReplyBody
         * @function getTypeUrl
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ReadBytesReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.ReadBytesReplyBody";
        };

        return ReadBytesReplyBody;
    })();

    file.VersionedReadFlags = (function() {

        /**
         * Properties of a VersionedReadFlags.
         * @memberof file
         * @interface IVersionedReadFlags
         * @property {common.IUInt64Value|null} [archivedVersion] VersionedReadFlags archivedVersion
         * @property {common.IUInt64Value|null} [remoteVersion] VersionedReadFlags remoteVersion
         */

        /**
         * Constructs a new VersionedReadFlags.
         * @memberof file
         * @classdesc Represents a VersionedReadFlags.
         * @implements IVersionedReadFlags
         * @constructor
         * @param {file.IVersionedReadFlags=} [properties] Properties to set
         */
        function VersionedReadFlags(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedReadFlags archivedVersion.
         * @member {common.IUInt64Value|null|undefined} archivedVersion
         * @memberof file.VersionedReadFlags
         * @instance
         */
        VersionedReadFlags.prototype.archivedVersion = null;

        /**
         * VersionedReadFlags remoteVersion.
         * @member {common.IUInt64Value|null|undefined} remoteVersion
         * @memberof file.VersionedReadFlags
         * @instance
         */
        VersionedReadFlags.prototype.remoteVersion = null;

        /**
         * Creates a new VersionedReadFlags instance using the specified properties.
         * @function create
         * @memberof file.VersionedReadFlags
         * @static
         * @param {file.IVersionedReadFlags=} [properties] Properties to set
         * @returns {file.VersionedReadFlags} VersionedReadFlags instance
         */
        VersionedReadFlags.create = function create(properties) {
            return new VersionedReadFlags(properties);
        };

        /**
         * Encodes the specified VersionedReadFlags message. Does not implicitly {@link file.VersionedReadFlags.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedReadFlags
         * @static
         * @param {file.IVersionedReadFlags} message VersionedReadFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadFlags.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.archivedVersion != null && Object.hasOwnProperty.call(message, "archivedVersion"))
                $root.common.UInt64Value.encode(message.archivedVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedReadFlags message, length delimited. Does not implicitly {@link file.VersionedReadFlags.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedReadFlags
         * @static
         * @param {file.IVersionedReadFlags} message VersionedReadFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadFlags.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedReadFlags message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedReadFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedReadFlags} VersionedReadFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadFlags.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.archivedVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedReadFlags message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedReadFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedReadFlags} VersionedReadFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadFlags.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedReadFlags message.
         * @function verify
         * @memberof file.VersionedReadFlags
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedReadFlags.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.archivedVersion != null && Object.hasOwnProperty.call(message, "archivedVersion")) {
                var error = $root.common.UInt64Value.verify(message.archivedVersion, long + 1);
                if (error)
                    return "archivedVersion." + error;
            }
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion, long + 1);
                if (error)
                    return "remoteVersion." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedReadFlags message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedReadFlags
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedReadFlags} VersionedReadFlags
         */
        VersionedReadFlags.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedReadFlags)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedReadFlags: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedReadFlags();
            if (object.archivedVersion != null) {
                if (!$util.isObject(object.archivedVersion))
                    throw TypeError(".file.VersionedReadFlags.archivedVersion: object expected");
                message.archivedVersion = $root.common.UInt64Value.fromObject(object.archivedVersion, long + 1);
            }
            if (object.remoteVersion != null) {
                if (!$util.isObject(object.remoteVersion))
                    throw TypeError(".file.VersionedReadFlags.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedReadFlags message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedReadFlags
         * @static
         * @param {file.VersionedReadFlags} message VersionedReadFlags
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedReadFlags.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.archivedVersion = null;
                object.remoteVersion = null;
            }
            if (message.archivedVersion != null && Object.hasOwnProperty.call(message, "archivedVersion"))
                object.archivedVersion = $root.common.UInt64Value.toObject(message.archivedVersion, options, q + 1);
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedReadFlags to JSON.
         * @function toJSON
         * @memberof file.VersionedReadFlags
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedReadFlags.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedReadFlags
         * @function getTypeUrl
         * @memberof file.VersionedReadFlags
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedReadFlags.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedReadFlags";
        };

        return VersionedReadFlags;
    })();

    file.RequestWithVersionedReadFlags = (function() {

        /**
         * Properties of a RequestWithVersionedReadFlags.
         * @memberof file
         * @interface IRequestWithVersionedReadFlags
         * @property {file.IVersionedReadFlags|null} [flags] RequestWithVersionedReadFlags flags
         */

        /**
         * Constructs a new RequestWithVersionedReadFlags.
         * @memberof file
         * @classdesc Represents a RequestWithVersionedReadFlags.
         * @implements IRequestWithVersionedReadFlags
         * @constructor
         * @param {file.IRequestWithVersionedReadFlags=} [properties] Properties to set
         */
        function RequestWithVersionedReadFlags(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * RequestWithVersionedReadFlags flags.
         * @member {file.IVersionedReadFlags|null|undefined} flags
         * @memberof file.RequestWithVersionedReadFlags
         * @instance
         */
        RequestWithVersionedReadFlags.prototype.flags = null;

        /**
         * Creates a new RequestWithVersionedReadFlags instance using the specified properties.
         * @function create
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {file.IRequestWithVersionedReadFlags=} [properties] Properties to set
         * @returns {file.RequestWithVersionedReadFlags} RequestWithVersionedReadFlags instance
         */
        RequestWithVersionedReadFlags.create = function create(properties) {
            return new RequestWithVersionedReadFlags(properties);
        };

        /**
         * Encodes the specified RequestWithVersionedReadFlags message. Does not implicitly {@link file.RequestWithVersionedReadFlags.verify|verify} messages.
         * @function encode
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {file.IRequestWithVersionedReadFlags} message RequestWithVersionedReadFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        RequestWithVersionedReadFlags.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified RequestWithVersionedReadFlags message, length delimited. Does not implicitly {@link file.RequestWithVersionedReadFlags.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {file.IRequestWithVersionedReadFlags} message RequestWithVersionedReadFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        RequestWithVersionedReadFlags.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a RequestWithVersionedReadFlags message from the specified reader or buffer.
         * @function decode
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.RequestWithVersionedReadFlags} RequestWithVersionedReadFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        RequestWithVersionedReadFlags.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.RequestWithVersionedReadFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a RequestWithVersionedReadFlags message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.RequestWithVersionedReadFlags} RequestWithVersionedReadFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        RequestWithVersionedReadFlags.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a RequestWithVersionedReadFlags message.
         * @function verify
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        RequestWithVersionedReadFlags.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a RequestWithVersionedReadFlags message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.RequestWithVersionedReadFlags} RequestWithVersionedReadFlags
         */
        RequestWithVersionedReadFlags.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.RequestWithVersionedReadFlags)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.RequestWithVersionedReadFlags: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.RequestWithVersionedReadFlags();
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".file.RequestWithVersionedReadFlags.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a RequestWithVersionedReadFlags message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {file.RequestWithVersionedReadFlags} message RequestWithVersionedReadFlags
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        RequestWithVersionedReadFlags.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.flags = null;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this RequestWithVersionedReadFlags to JSON.
         * @function toJSON
         * @memberof file.RequestWithVersionedReadFlags
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        RequestWithVersionedReadFlags.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for RequestWithVersionedReadFlags
         * @function getTypeUrl
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        RequestWithVersionedReadFlags.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.RequestWithVersionedReadFlags";
        };

        return RequestWithVersionedReadFlags;
    })();

    file.VersionedGetXAttrRequestBody = (function() {

        /**
         * Properties of a VersionedGetXAttrRequestBody.
         * @memberof file
         * @interface IVersionedGetXAttrRequestBody
         * @property {string|null} [xaName] VersionedGetXAttrRequestBody xaName
         * @property {file.IVersionedReadFlags|null} [flags] VersionedGetXAttrRequestBody flags
         */

        /**
         * Constructs a new VersionedGetXAttrRequestBody.
         * @memberof file
         * @classdesc Represents a VersionedGetXAttrRequestBody.
         * @implements IVersionedGetXAttrRequestBody
         * @constructor
         * @param {file.IVersionedGetXAttrRequestBody=} [properties] Properties to set
         */
        function VersionedGetXAttrRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedGetXAttrRequestBody xaName.
         * @member {string} xaName
         * @memberof file.VersionedGetXAttrRequestBody
         * @instance
         */
        VersionedGetXAttrRequestBody.prototype.xaName = "";

        /**
         * VersionedGetXAttrRequestBody flags.
         * @member {file.IVersionedReadFlags|null|undefined} flags
         * @memberof file.VersionedGetXAttrRequestBody
         * @instance
         */
        VersionedGetXAttrRequestBody.prototype.flags = null;

        /**
         * Creates a new VersionedGetXAttrRequestBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {file.IVersionedGetXAttrRequestBody=} [properties] Properties to set
         * @returns {file.VersionedGetXAttrRequestBody} VersionedGetXAttrRequestBody instance
         */
        VersionedGetXAttrRequestBody.create = function create(properties) {
            return new VersionedGetXAttrRequestBody(properties);
        };

        /**
         * Encodes the specified VersionedGetXAttrRequestBody message. Does not implicitly {@link file.VersionedGetXAttrRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {file.IVersionedGetXAttrRequestBody} message VersionedGetXAttrRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetXAttrRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.xaName);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedGetXAttrRequestBody message, length delimited. Does not implicitly {@link file.VersionedGetXAttrRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {file.IVersionedGetXAttrRequestBody} message VersionedGetXAttrRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetXAttrRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedGetXAttrRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedGetXAttrRequestBody} VersionedGetXAttrRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetXAttrRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetXAttrRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.xaName = reader.string();
                        break;
                    }
                case 2: {
                        message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedGetXAttrRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedGetXAttrRequestBody} VersionedGetXAttrRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetXAttrRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedGetXAttrRequestBody message.
         * @function verify
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedGetXAttrRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                if (!$util.isString(message.xaName))
                    return "xaName: string expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedGetXAttrRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedGetXAttrRequestBody} VersionedGetXAttrRequestBody
         */
        VersionedGetXAttrRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedGetXAttrRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedGetXAttrRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedGetXAttrRequestBody();
            if (object.xaName != null)
                message.xaName = String(object.xaName);
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".file.VersionedGetXAttrRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedGetXAttrRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {file.VersionedGetXAttrRequestBody} message VersionedGetXAttrRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedGetXAttrRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.xaName = "";
                object.flags = null;
            }
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                object.xaName = message.xaName;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedGetXAttrRequestBody to JSON.
         * @function toJSON
         * @memberof file.VersionedGetXAttrRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedGetXAttrRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedGetXAttrRequestBody
         * @function getTypeUrl
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedGetXAttrRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedGetXAttrRequestBody";
        };

        return VersionedGetXAttrRequestBody;
    })();

    file.VersionedGetXAttrReplyBody = (function() {

        /**
         * Properties of a VersionedGetXAttrReplyBody.
         * @memberof file
         * @interface IVersionedGetXAttrReplyBody
         * @property {number|Long|null} [version] VersionedGetXAttrReplyBody version
         * @property {common.IStringValue|null} [str] VersionedGetXAttrReplyBody str
         * @property {common.IStringValue|null} [json] VersionedGetXAttrReplyBody json
         * @property {common.IBytesValue|null} [bytes] VersionedGetXAttrReplyBody bytes
         */

        /**
         * Constructs a new VersionedGetXAttrReplyBody.
         * @memberof file
         * @classdesc Represents a VersionedGetXAttrReplyBody.
         * @implements IVersionedGetXAttrReplyBody
         * @constructor
         * @param {file.IVersionedGetXAttrReplyBody=} [properties] Properties to set
         */
        function VersionedGetXAttrReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedGetXAttrReplyBody version.
         * @member {number|Long} version
         * @memberof file.VersionedGetXAttrReplyBody
         * @instance
         */
        VersionedGetXAttrReplyBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * VersionedGetXAttrReplyBody str.
         * @member {common.IStringValue|null|undefined} str
         * @memberof file.VersionedGetXAttrReplyBody
         * @instance
         */
        VersionedGetXAttrReplyBody.prototype.str = null;

        /**
         * VersionedGetXAttrReplyBody json.
         * @member {common.IStringValue|null|undefined} json
         * @memberof file.VersionedGetXAttrReplyBody
         * @instance
         */
        VersionedGetXAttrReplyBody.prototype.json = null;

        /**
         * VersionedGetXAttrReplyBody bytes.
         * @member {common.IBytesValue|null|undefined} bytes
         * @memberof file.VersionedGetXAttrReplyBody
         * @instance
         */
        VersionedGetXAttrReplyBody.prototype.bytes = null;

        /**
         * Creates a new VersionedGetXAttrReplyBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {file.IVersionedGetXAttrReplyBody=} [properties] Properties to set
         * @returns {file.VersionedGetXAttrReplyBody} VersionedGetXAttrReplyBody instance
         */
        VersionedGetXAttrReplyBody.create = function create(properties) {
            return new VersionedGetXAttrReplyBody(properties);
        };

        /**
         * Encodes the specified VersionedGetXAttrReplyBody message. Does not implicitly {@link file.VersionedGetXAttrReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {file.IVersionedGetXAttrReplyBody} message VersionedGetXAttrReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetXAttrReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            if (message.str != null && Object.hasOwnProperty.call(message, "str"))
                $root.common.StringValue.encode(message.str, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedGetXAttrReplyBody message, length delimited. Does not implicitly {@link file.VersionedGetXAttrReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {file.IVersionedGetXAttrReplyBody} message VersionedGetXAttrReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetXAttrReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedGetXAttrReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedGetXAttrReplyBody} VersionedGetXAttrReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetXAttrReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetXAttrReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.str = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.json = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedGetXAttrReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedGetXAttrReplyBody} VersionedGetXAttrReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetXAttrReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedGetXAttrReplyBody message.
         * @function verify
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedGetXAttrReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            if (message.str != null && Object.hasOwnProperty.call(message, "str")) {
                var error = $root.common.StringValue.verify(message.str, long + 1);
                if (error)
                    return "str." + error;
            }
            if (message.json != null && Object.hasOwnProperty.call(message, "json")) {
                var error = $root.common.StringValue.verify(message.json, long + 1);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes, long + 1);
                if (error)
                    return "bytes." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedGetXAttrReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedGetXAttrReplyBody} VersionedGetXAttrReplyBody
         */
        VersionedGetXAttrReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedGetXAttrReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedGetXAttrReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedGetXAttrReplyBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            if (object.str != null) {
                if (!$util.isObject(object.str))
                    throw TypeError(".file.VersionedGetXAttrReplyBody.str: object expected");
                message.str = $root.common.StringValue.fromObject(object.str, long + 1);
            }
            if (object.json != null) {
                if (!$util.isObject(object.json))
                    throw TypeError(".file.VersionedGetXAttrReplyBody.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json, long + 1);
            }
            if (object.bytes != null) {
                if (!$util.isObject(object.bytes))
                    throw TypeError(".file.VersionedGetXAttrReplyBody.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedGetXAttrReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {file.VersionedGetXAttrReplyBody} message VersionedGetXAttrReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedGetXAttrReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.str = null;
                object.json = null;
                object.bytes = null;
            }
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            if (message.str != null && Object.hasOwnProperty.call(message, "str"))
                object.str = $root.common.StringValue.toObject(message.str, options, q + 1);
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = $root.common.StringValue.toObject(message.json, options, q + 1);
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedGetXAttrReplyBody to JSON.
         * @function toJSON
         * @memberof file.VersionedGetXAttrReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedGetXAttrReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedGetXAttrReplyBody
         * @function getTypeUrl
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedGetXAttrReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedGetXAttrReplyBody";
        };

        return VersionedGetXAttrReplyBody;
    })();

    file.VersionedListXAttrsReplyBody = (function() {

        /**
         * Properties of a VersionedListXAttrsReplyBody.
         * @memberof file
         * @interface IVersionedListXAttrsReplyBody
         * @property {number|Long|null} [version] VersionedListXAttrsReplyBody version
         * @property {Array.<string>|null} [xaNames] VersionedListXAttrsReplyBody xaNames
         */

        /**
         * Constructs a new VersionedListXAttrsReplyBody.
         * @memberof file
         * @classdesc Represents a VersionedListXAttrsReplyBody.
         * @implements IVersionedListXAttrsReplyBody
         * @constructor
         * @param {file.IVersionedListXAttrsReplyBody=} [properties] Properties to set
         */
        function VersionedListXAttrsReplyBody(properties) {
            this.xaNames = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedListXAttrsReplyBody version.
         * @member {number|Long} version
         * @memberof file.VersionedListXAttrsReplyBody
         * @instance
         */
        VersionedListXAttrsReplyBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * VersionedListXAttrsReplyBody xaNames.
         * @member {Array.<string>} xaNames
         * @memberof file.VersionedListXAttrsReplyBody
         * @instance
         */
        VersionedListXAttrsReplyBody.prototype.xaNames = $util.emptyArray;

        /**
         * Creates a new VersionedListXAttrsReplyBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {file.IVersionedListXAttrsReplyBody=} [properties] Properties to set
         * @returns {file.VersionedListXAttrsReplyBody} VersionedListXAttrsReplyBody instance
         */
        VersionedListXAttrsReplyBody.create = function create(properties) {
            return new VersionedListXAttrsReplyBody(properties);
        };

        /**
         * Encodes the specified VersionedListXAttrsReplyBody message. Does not implicitly {@link file.VersionedListXAttrsReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {file.IVersionedListXAttrsReplyBody} message VersionedListXAttrsReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedListXAttrsReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            if (message.xaNames != null && message.xaNames.length)
                for (var i = 0; i < message.xaNames.length; ++i)
                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.xaNames[i]);
            return writer;
        };

        /**
         * Encodes the specified VersionedListXAttrsReplyBody message, length delimited. Does not implicitly {@link file.VersionedListXAttrsReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {file.IVersionedListXAttrsReplyBody} message VersionedListXAttrsReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedListXAttrsReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedListXAttrsReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedListXAttrsReplyBody} VersionedListXAttrsReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedListXAttrsReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedListXAttrsReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        if (!(message.xaNames && message.xaNames.length))
                            message.xaNames = [];
                        message.xaNames.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedListXAttrsReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedListXAttrsReplyBody} VersionedListXAttrsReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedListXAttrsReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedListXAttrsReplyBody message.
         * @function verify
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedListXAttrsReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            if (message.xaNames != null && Object.hasOwnProperty.call(message, "xaNames")) {
                if (!Array.isArray(message.xaNames))
                    return "xaNames: array expected";
                for (var i = 0; i < message.xaNames.length; ++i)
                    if (!$util.isString(message.xaNames[i]))
                        return "xaNames: string[] expected";
            }
            return null;
        };

        /**
         * Creates a VersionedListXAttrsReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedListXAttrsReplyBody} VersionedListXAttrsReplyBody
         */
        VersionedListXAttrsReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedListXAttrsReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedListXAttrsReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedListXAttrsReplyBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            if (object.xaNames) {
                if (!Array.isArray(object.xaNames))
                    throw TypeError(".file.VersionedListXAttrsReplyBody.xaNames: array expected");
                message.xaNames = [];
                for (var i = 0; i < object.xaNames.length; ++i)
                    message.xaNames[i] = String(object.xaNames[i]);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedListXAttrsReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {file.VersionedListXAttrsReplyBody} message VersionedListXAttrsReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedListXAttrsReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.xaNames = [];
            if (options.defaults)
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            if (message.xaNames && message.xaNames.length) {
                object.xaNames = [];
                for (var j = 0; j < message.xaNames.length; ++j)
                    object.xaNames[j] = message.xaNames[j];
            }
            return object;
        };

        /**
         * Converts this VersionedListXAttrsReplyBody to JSON.
         * @function toJSON
         * @memberof file.VersionedListXAttrsReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedListXAttrsReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedListXAttrsReplyBody
         * @function getTypeUrl
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedListXAttrsReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedListXAttrsReplyBody";
        };

        return VersionedListXAttrsReplyBody;
    })();

    file.VersionedReadBytesRequestBody = (function() {

        /**
         * Properties of a VersionedReadBytesRequestBody.
         * @memberof file
         * @interface IVersionedReadBytesRequestBody
         * @property {common.IUInt64Value|null} [start] VersionedReadBytesRequestBody start
         * @property {common.IUInt64Value|null} [end] VersionedReadBytesRequestBody end
         * @property {file.IVersionedReadFlags|null} [flags] VersionedReadBytesRequestBody flags
         */

        /**
         * Constructs a new VersionedReadBytesRequestBody.
         * @memberof file
         * @classdesc Represents a VersionedReadBytesRequestBody.
         * @implements IVersionedReadBytesRequestBody
         * @constructor
         * @param {file.IVersionedReadBytesRequestBody=} [properties] Properties to set
         */
        function VersionedReadBytesRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedReadBytesRequestBody start.
         * @member {common.IUInt64Value|null|undefined} start
         * @memberof file.VersionedReadBytesRequestBody
         * @instance
         */
        VersionedReadBytesRequestBody.prototype.start = null;

        /**
         * VersionedReadBytesRequestBody end.
         * @member {common.IUInt64Value|null|undefined} end
         * @memberof file.VersionedReadBytesRequestBody
         * @instance
         */
        VersionedReadBytesRequestBody.prototype.end = null;

        /**
         * VersionedReadBytesRequestBody flags.
         * @member {file.IVersionedReadFlags|null|undefined} flags
         * @memberof file.VersionedReadBytesRequestBody
         * @instance
         */
        VersionedReadBytesRequestBody.prototype.flags = null;

        /**
         * Creates a new VersionedReadBytesRequestBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {file.IVersionedReadBytesRequestBody=} [properties] Properties to set
         * @returns {file.VersionedReadBytesRequestBody} VersionedReadBytesRequestBody instance
         */
        VersionedReadBytesRequestBody.create = function create(properties) {
            return new VersionedReadBytesRequestBody(properties);
        };

        /**
         * Encodes the specified VersionedReadBytesRequestBody message. Does not implicitly {@link file.VersionedReadBytesRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {file.IVersionedReadBytesRequestBody} message VersionedReadBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadBytesRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                $root.common.UInt64Value.encode(message.start, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                $root.common.UInt64Value.encode(message.end, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 10, wireType 2 =*/82).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedReadBytesRequestBody message, length delimited. Does not implicitly {@link file.VersionedReadBytesRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {file.IVersionedReadBytesRequestBody} message VersionedReadBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadBytesRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedReadBytesRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedReadBytesRequestBody} VersionedReadBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadBytesRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.start = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.end = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 10: {
                        message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedReadBytesRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedReadBytesRequestBody} VersionedReadBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadBytesRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedReadBytesRequestBody message.
         * @function verify
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedReadBytesRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.start != null && Object.hasOwnProperty.call(message, "start")) {
                var error = $root.common.UInt64Value.verify(message.start, long + 1);
                if (error)
                    return "start." + error;
            }
            if (message.end != null && Object.hasOwnProperty.call(message, "end")) {
                var error = $root.common.UInt64Value.verify(message.end, long + 1);
                if (error)
                    return "end." + error;
            }
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedReadBytesRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedReadBytesRequestBody} VersionedReadBytesRequestBody
         */
        VersionedReadBytesRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedReadBytesRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedReadBytesRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedReadBytesRequestBody();
            if (object.start != null) {
                if (!$util.isObject(object.start))
                    throw TypeError(".file.VersionedReadBytesRequestBody.start: object expected");
                message.start = $root.common.UInt64Value.fromObject(object.start, long + 1);
            }
            if (object.end != null) {
                if (!$util.isObject(object.end))
                    throw TypeError(".file.VersionedReadBytesRequestBody.end: object expected");
                message.end = $root.common.UInt64Value.fromObject(object.end, long + 1);
            }
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".file.VersionedReadBytesRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedReadBytesRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {file.VersionedReadBytesRequestBody} message VersionedReadBytesRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedReadBytesRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.start = null;
                object.end = null;
                object.flags = null;
            }
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                object.start = $root.common.UInt64Value.toObject(message.start, options, q + 1);
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                object.end = $root.common.UInt64Value.toObject(message.end, options, q + 1);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedReadBytesRequestBody to JSON.
         * @function toJSON
         * @memberof file.VersionedReadBytesRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedReadBytesRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedReadBytesRequestBody
         * @function getTypeUrl
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedReadBytesRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedReadBytesRequestBody";
        };

        return VersionedReadBytesRequestBody;
    })();

    file.VersionedReadBytesReplyBody = (function() {

        /**
         * Properties of a VersionedReadBytesReplyBody.
         * @memberof file
         * @interface IVersionedReadBytesReplyBody
         * @property {number|Long|null} [version] VersionedReadBytesReplyBody version
         * @property {common.IBytesValue|null} [bytes] VersionedReadBytesReplyBody bytes
         */

        /**
         * Constructs a new VersionedReadBytesReplyBody.
         * @memberof file
         * @classdesc Represents a VersionedReadBytesReplyBody.
         * @implements IVersionedReadBytesReplyBody
         * @constructor
         * @param {file.IVersionedReadBytesReplyBody=} [properties] Properties to set
         */
        function VersionedReadBytesReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedReadBytesReplyBody version.
         * @member {number|Long} version
         * @memberof file.VersionedReadBytesReplyBody
         * @instance
         */
        VersionedReadBytesReplyBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * VersionedReadBytesReplyBody bytes.
         * @member {common.IBytesValue|null|undefined} bytes
         * @memberof file.VersionedReadBytesReplyBody
         * @instance
         */
        VersionedReadBytesReplyBody.prototype.bytes = null;

        /**
         * Creates a new VersionedReadBytesReplyBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {file.IVersionedReadBytesReplyBody=} [properties] Properties to set
         * @returns {file.VersionedReadBytesReplyBody} VersionedReadBytesReplyBody instance
         */
        VersionedReadBytesReplyBody.create = function create(properties) {
            return new VersionedReadBytesReplyBody(properties);
        };

        /**
         * Encodes the specified VersionedReadBytesReplyBody message. Does not implicitly {@link file.VersionedReadBytesReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {file.IVersionedReadBytesReplyBody} message VersionedReadBytesReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadBytesReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedReadBytesReplyBody message, length delimited. Does not implicitly {@link file.VersionedReadBytesReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {file.IVersionedReadBytesReplyBody} message VersionedReadBytesReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadBytesReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedReadBytesReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedReadBytesReplyBody} VersionedReadBytesReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadBytesReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadBytesReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedReadBytesReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedReadBytesReplyBody} VersionedReadBytesReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadBytesReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedReadBytesReplyBody message.
         * @function verify
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedReadBytesReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes, long + 1);
                if (error)
                    return "bytes." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedReadBytesReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedReadBytesReplyBody} VersionedReadBytesReplyBody
         */
        VersionedReadBytesReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedReadBytesReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedReadBytesReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedReadBytesReplyBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            if (object.bytes != null) {
                if (!$util.isObject(object.bytes))
                    throw TypeError(".file.VersionedReadBytesReplyBody.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedReadBytesReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {file.VersionedReadBytesReplyBody} message VersionedReadBytesReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedReadBytesReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.bytes = null;
            }
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedReadBytesReplyBody to JSON.
         * @function toJSON
         * @memberof file.VersionedReadBytesReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedReadBytesReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedReadBytesReplyBody
         * @function getTypeUrl
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedReadBytesReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedReadBytesReplyBody";
        };

        return VersionedReadBytesReplyBody;
    })();

    file.VersionedReadTxtReplyBody = (function() {

        /**
         * Properties of a VersionedReadTxtReplyBody.
         * @memberof file
         * @interface IVersionedReadTxtReplyBody
         * @property {number|Long|null} [version] VersionedReadTxtReplyBody version
         * @property {string|null} [txt] VersionedReadTxtReplyBody txt
         */

        /**
         * Constructs a new VersionedReadTxtReplyBody.
         * @memberof file
         * @classdesc Represents a VersionedReadTxtReplyBody.
         * @implements IVersionedReadTxtReplyBody
         * @constructor
         * @param {file.IVersionedReadTxtReplyBody=} [properties] Properties to set
         */
        function VersionedReadTxtReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedReadTxtReplyBody version.
         * @member {number|Long} version
         * @memberof file.VersionedReadTxtReplyBody
         * @instance
         */
        VersionedReadTxtReplyBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * VersionedReadTxtReplyBody txt.
         * @member {string} txt
         * @memberof file.VersionedReadTxtReplyBody
         * @instance
         */
        VersionedReadTxtReplyBody.prototype.txt = "";

        /**
         * Creates a new VersionedReadTxtReplyBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {file.IVersionedReadTxtReplyBody=} [properties] Properties to set
         * @returns {file.VersionedReadTxtReplyBody} VersionedReadTxtReplyBody instance
         */
        VersionedReadTxtReplyBody.create = function create(properties) {
            return new VersionedReadTxtReplyBody(properties);
        };

        /**
         * Encodes the specified VersionedReadTxtReplyBody message. Does not implicitly {@link file.VersionedReadTxtReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {file.IVersionedReadTxtReplyBody} message VersionedReadTxtReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadTxtReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.txt);
            return writer;
        };

        /**
         * Encodes the specified VersionedReadTxtReplyBody message, length delimited. Does not implicitly {@link file.VersionedReadTxtReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {file.IVersionedReadTxtReplyBody} message VersionedReadTxtReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadTxtReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedReadTxtReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedReadTxtReplyBody} VersionedReadTxtReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadTxtReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadTxtReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.txt = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedReadTxtReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedReadTxtReplyBody} VersionedReadTxtReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadTxtReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedReadTxtReplyBody message.
         * @function verify
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedReadTxtReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                if (!$util.isString(message.txt))
                    return "txt: string expected";
            return null;
        };

        /**
         * Creates a VersionedReadTxtReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedReadTxtReplyBody} VersionedReadTxtReplyBody
         */
        VersionedReadTxtReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedReadTxtReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedReadTxtReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedReadTxtReplyBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            if (object.txt != null)
                message.txt = String(object.txt);
            return message;
        };

        /**
         * Creates a plain object from a VersionedReadTxtReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {file.VersionedReadTxtReplyBody} message VersionedReadTxtReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedReadTxtReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.txt = "";
            }
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                object.txt = message.txt;
            return object;
        };

        /**
         * Converts this VersionedReadTxtReplyBody to JSON.
         * @function toJSON
         * @memberof file.VersionedReadTxtReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedReadTxtReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedReadTxtReplyBody
         * @function getTypeUrl
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedReadTxtReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedReadTxtReplyBody";
        };

        return VersionedReadTxtReplyBody;
    })();

    file.VersionedReadJsonReplyBody = (function() {

        /**
         * Properties of a VersionedReadJsonReplyBody.
         * @memberof file
         * @interface IVersionedReadJsonReplyBody
         * @property {number|Long|null} [version] VersionedReadJsonReplyBody version
         * @property {string|null} [json] VersionedReadJsonReplyBody json
         */

        /**
         * Constructs a new VersionedReadJsonReplyBody.
         * @memberof file
         * @classdesc Represents a VersionedReadJsonReplyBody.
         * @implements IVersionedReadJsonReplyBody
         * @constructor
         * @param {file.IVersionedReadJsonReplyBody=} [properties] Properties to set
         */
        function VersionedReadJsonReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedReadJsonReplyBody version.
         * @member {number|Long} version
         * @memberof file.VersionedReadJsonReplyBody
         * @instance
         */
        VersionedReadJsonReplyBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * VersionedReadJsonReplyBody json.
         * @member {string} json
         * @memberof file.VersionedReadJsonReplyBody
         * @instance
         */
        VersionedReadJsonReplyBody.prototype.json = "";

        /**
         * Creates a new VersionedReadJsonReplyBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {file.IVersionedReadJsonReplyBody=} [properties] Properties to set
         * @returns {file.VersionedReadJsonReplyBody} VersionedReadJsonReplyBody instance
         */
        VersionedReadJsonReplyBody.create = function create(properties) {
            return new VersionedReadJsonReplyBody(properties);
        };

        /**
         * Encodes the specified VersionedReadJsonReplyBody message. Does not implicitly {@link file.VersionedReadJsonReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {file.IVersionedReadJsonReplyBody} message VersionedReadJsonReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadJsonReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.json);
            return writer;
        };

        /**
         * Encodes the specified VersionedReadJsonReplyBody message, length delimited. Does not implicitly {@link file.VersionedReadJsonReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {file.IVersionedReadJsonReplyBody} message VersionedReadJsonReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadJsonReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedReadJsonReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedReadJsonReplyBody} VersionedReadJsonReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadJsonReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadJsonReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.json = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedReadJsonReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedReadJsonReplyBody} VersionedReadJsonReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadJsonReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedReadJsonReplyBody message.
         * @function verify
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedReadJsonReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                if (!$util.isString(message.json))
                    return "json: string expected";
            return null;
        };

        /**
         * Creates a VersionedReadJsonReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedReadJsonReplyBody} VersionedReadJsonReplyBody
         */
        VersionedReadJsonReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedReadJsonReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedReadJsonReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedReadJsonReplyBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            if (object.json != null)
                message.json = String(object.json);
            return message;
        };

        /**
         * Creates a plain object from a VersionedReadJsonReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {file.VersionedReadJsonReplyBody} message VersionedReadJsonReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedReadJsonReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.json = "";
            }
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = message.json;
            return object;
        };

        /**
         * Converts this VersionedReadJsonReplyBody to JSON.
         * @function toJSON
         * @memberof file.VersionedReadJsonReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedReadJsonReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedReadJsonReplyBody
         * @function getTypeUrl
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedReadJsonReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedReadJsonReplyBody";
        };

        return VersionedReadJsonReplyBody;
    })();

    file.VersionedGetByteSourceReplyBody = (function() {

        /**
         * Properties of a VersionedGetByteSourceReplyBody.
         * @memberof file
         * @interface IVersionedGetByteSourceReplyBody
         * @property {number|Long|null} [version] VersionedGetByteSourceReplyBody version
         * @property {common.IObjectReference|null} [src] VersionedGetByteSourceReplyBody src
         */

        /**
         * Constructs a new VersionedGetByteSourceReplyBody.
         * @memberof file
         * @classdesc Represents a VersionedGetByteSourceReplyBody.
         * @implements IVersionedGetByteSourceReplyBody
         * @constructor
         * @param {file.IVersionedGetByteSourceReplyBody=} [properties] Properties to set
         */
        function VersionedGetByteSourceReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedGetByteSourceReplyBody version.
         * @member {number|Long} version
         * @memberof file.VersionedGetByteSourceReplyBody
         * @instance
         */
        VersionedGetByteSourceReplyBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * VersionedGetByteSourceReplyBody src.
         * @member {common.IObjectReference|null|undefined} src
         * @memberof file.VersionedGetByteSourceReplyBody
         * @instance
         */
        VersionedGetByteSourceReplyBody.prototype.src = null;

        /**
         * Creates a new VersionedGetByteSourceReplyBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {file.IVersionedGetByteSourceReplyBody=} [properties] Properties to set
         * @returns {file.VersionedGetByteSourceReplyBody} VersionedGetByteSourceReplyBody instance
         */
        VersionedGetByteSourceReplyBody.create = function create(properties) {
            return new VersionedGetByteSourceReplyBody(properties);
        };

        /**
         * Encodes the specified VersionedGetByteSourceReplyBody message. Does not implicitly {@link file.VersionedGetByteSourceReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {file.IVersionedGetByteSourceReplyBody} message VersionedGetByteSourceReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetByteSourceReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                $root.common.ObjectReference.encode(message.src, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedGetByteSourceReplyBody message, length delimited. Does not implicitly {@link file.VersionedGetByteSourceReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {file.IVersionedGetByteSourceReplyBody} message VersionedGetByteSourceReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetByteSourceReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedGetByteSourceReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedGetByteSourceReplyBody} VersionedGetByteSourceReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetByteSourceReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetByteSourceReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.src = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedGetByteSourceReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedGetByteSourceReplyBody} VersionedGetByteSourceReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetByteSourceReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedGetByteSourceReplyBody message.
         * @function verify
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedGetByteSourceReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            if (message.src != null && Object.hasOwnProperty.call(message, "src")) {
                var error = $root.common.ObjectReference.verify(message.src, long + 1);
                if (error)
                    return "src." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedGetByteSourceReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedGetByteSourceReplyBody} VersionedGetByteSourceReplyBody
         */
        VersionedGetByteSourceReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedGetByteSourceReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedGetByteSourceReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedGetByteSourceReplyBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            if (object.src != null) {
                if (!$util.isObject(object.src))
                    throw TypeError(".file.VersionedGetByteSourceReplyBody.src: object expected");
                message.src = $root.common.ObjectReference.fromObject(object.src, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedGetByteSourceReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {file.VersionedGetByteSourceReplyBody} message VersionedGetByteSourceReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedGetByteSourceReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.src = null;
            }
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                object.src = $root.common.ObjectReference.toObject(message.src, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedGetByteSourceReplyBody to JSON.
         * @function toJSON
         * @memberof file.VersionedGetByteSourceReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedGetByteSourceReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedGetByteSourceReplyBody
         * @function getTypeUrl
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedGetByteSourceReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedGetByteSourceReplyBody";
        };

        return VersionedGetByteSourceReplyBody;
    })();

    file.ListVersionsReplyBody = (function() {

        /**
         * Properties of a ListVersionsReplyBody.
         * @memberof file
         * @interface IListVersionsReplyBody
         * @property {common.IUInt64Value|null} [current] ListVersionsReplyBody current
         * @property {Array.<number|Long>|null} [archived] ListVersionsReplyBody archived
         */

        /**
         * Constructs a new ListVersionsReplyBody.
         * @memberof file
         * @classdesc Represents a ListVersionsReplyBody.
         * @implements IListVersionsReplyBody
         * @constructor
         * @param {file.IListVersionsReplyBody=} [properties] Properties to set
         */
        function ListVersionsReplyBody(properties) {
            this.archived = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ListVersionsReplyBody current.
         * @member {common.IUInt64Value|null|undefined} current
         * @memberof file.ListVersionsReplyBody
         * @instance
         */
        ListVersionsReplyBody.prototype.current = null;

        /**
         * ListVersionsReplyBody archived.
         * @member {Array.<number|Long>} archived
         * @memberof file.ListVersionsReplyBody
         * @instance
         */
        ListVersionsReplyBody.prototype.archived = $util.emptyArray;

        /**
         * Creates a new ListVersionsReplyBody instance using the specified properties.
         * @function create
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {file.IListVersionsReplyBody=} [properties] Properties to set
         * @returns {file.ListVersionsReplyBody} ListVersionsReplyBody instance
         */
        ListVersionsReplyBody.create = function create(properties) {
            return new ListVersionsReplyBody(properties);
        };

        /**
         * Encodes the specified ListVersionsReplyBody message. Does not implicitly {@link file.ListVersionsReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {file.IListVersionsReplyBody} message ListVersionsReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ListVersionsReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                $root.common.UInt64Value.encode(message.current, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.archived != null && message.archived.length) {
                writer.uint32(/* id 2, wireType 2 =*/18).fork();
                for (var i = 0; i < message.archived.length; ++i)
                    writer.uint64(message.archived[i]);
                writer.ldelim();
            }
            return writer;
        };

        /**
         * Encodes the specified ListVersionsReplyBody message, length delimited. Does not implicitly {@link file.ListVersionsReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {file.IListVersionsReplyBody} message ListVersionsReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ListVersionsReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a ListVersionsReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.ListVersionsReplyBody} ListVersionsReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ListVersionsReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ListVersionsReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.current = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        if (!(message.archived && message.archived.length))
                            message.archived = [];
                        if ((tag & 7) === 2) {
                            var end2 = reader.uint32() + reader.pos;
                            while (reader.pos < end2)
                                message.archived.push(reader.uint64());
                        } else
                            message.archived.push(reader.uint64());
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a ListVersionsReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.ListVersionsReplyBody} ListVersionsReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ListVersionsReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a ListVersionsReplyBody message.
         * @function verify
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ListVersionsReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.current != null && Object.hasOwnProperty.call(message, "current")) {
                var error = $root.common.UInt64Value.verify(message.current, long + 1);
                if (error)
                    return "current." + error;
            }
            if (message.archived != null && Object.hasOwnProperty.call(message, "archived")) {
                if (!Array.isArray(message.archived))
                    return "archived: array expected";
                for (var i = 0; i < message.archived.length; ++i)
                    if (!$util.isInteger(message.archived[i]) && !(message.archived[i] && $util.isInteger(message.archived[i].low) && $util.isInteger(message.archived[i].high)))
                        return "archived: integer|Long[] expected";
            }
            return null;
        };

        /**
         * Creates a ListVersionsReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.ListVersionsReplyBody} ListVersionsReplyBody
         */
        ListVersionsReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.ListVersionsReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.ListVersionsReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.ListVersionsReplyBody();
            if (object.current != null) {
                if (!$util.isObject(object.current))
                    throw TypeError(".file.ListVersionsReplyBody.current: object expected");
                message.current = $root.common.UInt64Value.fromObject(object.current, long + 1);
            }
            if (object.archived) {
                if (!Array.isArray(object.archived))
                    throw TypeError(".file.ListVersionsReplyBody.archived: array expected");
                message.archived = [];
                for (var i = 0; i < object.archived.length; ++i)
                    if ($util.Long)
                        message.archived[i] = $util.Long.fromValue(object.archived[i], true);
                    else if (typeof object.archived[i] === "string")
                        message.archived[i] = parseInt(object.archived[i], 10);
                    else if (typeof object.archived[i] === "number")
                        message.archived[i] = object.archived[i];
                    else if (typeof object.archived[i] === "object")
                        message.archived[i] = new $util.LongBits(object.archived[i].low >>> 0, object.archived[i].high >>> 0).toNumber(true);
            }
            return message;
        };

        /**
         * Creates a plain object from a ListVersionsReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {file.ListVersionsReplyBody} message ListVersionsReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ListVersionsReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.archived = [];
            if (options.defaults)
                object.current = null;
            if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                object.current = $root.common.UInt64Value.toObject(message.current, options, q + 1);
            if (message.archived && message.archived.length) {
                object.archived = [];
                for (var j = 0; j < message.archived.length; ++j)
                    if (typeof BigInt !== "undefined" && options.longs === BigInt)
                        object.archived[j] = typeof message.archived[j] === "number" ? BigInt(message.archived[j]) : $util.Long.fromBits(message.archived[j].low >>> 0, message.archived[j].high >>> 0, true).toBigInt();
                    else if (typeof message.archived[j] === "number")
                        object.archived[j] = options.longs === String ? String(message.archived[j]) : message.archived[j];
                    else
                        object.archived[j] = options.longs === String ? $util.Long.prototype.toString.call(message.archived[j]) : options.longs === Number ? new $util.LongBits(message.archived[j].low >>> 0, message.archived[j].high >>> 0).toNumber(true) : message.archived[j];
            }
            return object;
        };

        /**
         * Converts this ListVersionsReplyBody to JSON.
         * @function toJSON
         * @memberof file.ListVersionsReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ListVersionsReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ListVersionsReplyBody
         * @function getTypeUrl
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ListVersionsReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.ListVersionsReplyBody";
        };

        return ListVersionsReplyBody;
    })();

    file.UpdateXAttrsRequestBody = (function() {

        /**
         * Properties of an UpdateXAttrsRequestBody.
         * @memberof file
         * @interface IUpdateXAttrsRequestBody
         * @property {file.IXAttrsChanges|null} [changes] UpdateXAttrsRequestBody changes
         */

        /**
         * Constructs a new UpdateXAttrsRequestBody.
         * @memberof file
         * @classdesc Represents an UpdateXAttrsRequestBody.
         * @implements IUpdateXAttrsRequestBody
         * @constructor
         * @param {file.IUpdateXAttrsRequestBody=} [properties] Properties to set
         */
        function UpdateXAttrsRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * UpdateXAttrsRequestBody changes.
         * @member {file.IXAttrsChanges|null|undefined} changes
         * @memberof file.UpdateXAttrsRequestBody
         * @instance
         */
        UpdateXAttrsRequestBody.prototype.changes = null;

        /**
         * Creates a new UpdateXAttrsRequestBody instance using the specified properties.
         * @function create
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {file.IUpdateXAttrsRequestBody=} [properties] Properties to set
         * @returns {file.UpdateXAttrsRequestBody} UpdateXAttrsRequestBody instance
         */
        UpdateXAttrsRequestBody.create = function create(properties) {
            return new UpdateXAttrsRequestBody(properties);
        };

        /**
         * Encodes the specified UpdateXAttrsRequestBody message. Does not implicitly {@link file.UpdateXAttrsRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {file.IUpdateXAttrsRequestBody} message UpdateXAttrsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UpdateXAttrsRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.changes != null && Object.hasOwnProperty.call(message, "changes"))
                $root.file.XAttrsChanges.encode(message.changes, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified UpdateXAttrsRequestBody message, length delimited. Does not implicitly {@link file.UpdateXAttrsRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {file.IUpdateXAttrsRequestBody} message UpdateXAttrsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UpdateXAttrsRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an UpdateXAttrsRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.UpdateXAttrsRequestBody} UpdateXAttrsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UpdateXAttrsRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.UpdateXAttrsRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.changes = $root.file.XAttrsChanges.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an UpdateXAttrsRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.UpdateXAttrsRequestBody} UpdateXAttrsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UpdateXAttrsRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an UpdateXAttrsRequestBody message.
         * @function verify
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        UpdateXAttrsRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.changes != null && Object.hasOwnProperty.call(message, "changes")) {
                var error = $root.file.XAttrsChanges.verify(message.changes, long + 1);
                if (error)
                    return "changes." + error;
            }
            return null;
        };

        /**
         * Creates an UpdateXAttrsRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.UpdateXAttrsRequestBody} UpdateXAttrsRequestBody
         */
        UpdateXAttrsRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.UpdateXAttrsRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.UpdateXAttrsRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.UpdateXAttrsRequestBody();
            if (object.changes != null) {
                if (!$util.isObject(object.changes))
                    throw TypeError(".file.UpdateXAttrsRequestBody.changes: object expected");
                message.changes = $root.file.XAttrsChanges.fromObject(object.changes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an UpdateXAttrsRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {file.UpdateXAttrsRequestBody} message UpdateXAttrsRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        UpdateXAttrsRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.changes = null;
            if (message.changes != null && Object.hasOwnProperty.call(message, "changes"))
                object.changes = $root.file.XAttrsChanges.toObject(message.changes, options, q + 1);
            return object;
        };

        /**
         * Converts this UpdateXAttrsRequestBody to JSON.
         * @function toJSON
         * @memberof file.UpdateXAttrsRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        UpdateXAttrsRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for UpdateXAttrsRequestBody
         * @function getTypeUrl
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        UpdateXAttrsRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.UpdateXAttrsRequestBody";
        };

        return UpdateXAttrsRequestBody;
    })();

    file.NameAndXAttrValue = (function() {

        /**
         * Properties of a NameAndXAttrValue.
         * @memberof file
         * @interface INameAndXAttrValue
         * @property {string|null} [xaName] NameAndXAttrValue xaName
         * @property {common.IStringValue|null} [str] NameAndXAttrValue str
         * @property {common.IStringValue|null} [json] NameAndXAttrValue json
         * @property {common.IBytesValue|null} [bytes] NameAndXAttrValue bytes
         */

        /**
         * Constructs a new NameAndXAttrValue.
         * @memberof file
         * @classdesc Represents a NameAndXAttrValue.
         * @implements INameAndXAttrValue
         * @constructor
         * @param {file.INameAndXAttrValue=} [properties] Properties to set
         */
        function NameAndXAttrValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * NameAndXAttrValue xaName.
         * @member {string} xaName
         * @memberof file.NameAndXAttrValue
         * @instance
         */
        NameAndXAttrValue.prototype.xaName = "";

        /**
         * NameAndXAttrValue str.
         * @member {common.IStringValue|null|undefined} str
         * @memberof file.NameAndXAttrValue
         * @instance
         */
        NameAndXAttrValue.prototype.str = null;

        /**
         * NameAndXAttrValue json.
         * @member {common.IStringValue|null|undefined} json
         * @memberof file.NameAndXAttrValue
         * @instance
         */
        NameAndXAttrValue.prototype.json = null;

        /**
         * NameAndXAttrValue bytes.
         * @member {common.IBytesValue|null|undefined} bytes
         * @memberof file.NameAndXAttrValue
         * @instance
         */
        NameAndXAttrValue.prototype.bytes = null;

        /**
         * Creates a new NameAndXAttrValue instance using the specified properties.
         * @function create
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {file.INameAndXAttrValue=} [properties] Properties to set
         * @returns {file.NameAndXAttrValue} NameAndXAttrValue instance
         */
        NameAndXAttrValue.create = function create(properties) {
            return new NameAndXAttrValue(properties);
        };

        /**
         * Encodes the specified NameAndXAttrValue message. Does not implicitly {@link file.NameAndXAttrValue.verify|verify} messages.
         * @function encode
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {file.INameAndXAttrValue} message NameAndXAttrValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        NameAndXAttrValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.xaName);
            if (message.str != null && Object.hasOwnProperty.call(message, "str"))
                $root.common.StringValue.encode(message.str, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified NameAndXAttrValue message, length delimited. Does not implicitly {@link file.NameAndXAttrValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {file.INameAndXAttrValue} message NameAndXAttrValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        NameAndXAttrValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a NameAndXAttrValue message from the specified reader or buffer.
         * @function decode
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.NameAndXAttrValue} NameAndXAttrValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        NameAndXAttrValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.NameAndXAttrValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.xaName = reader.string();
                        break;
                    }
                case 2: {
                        message.str = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.json = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a NameAndXAttrValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.NameAndXAttrValue} NameAndXAttrValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        NameAndXAttrValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a NameAndXAttrValue message.
         * @function verify
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        NameAndXAttrValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                if (!$util.isString(message.xaName))
                    return "xaName: string expected";
            if (message.str != null && Object.hasOwnProperty.call(message, "str")) {
                var error = $root.common.StringValue.verify(message.str, long + 1);
                if (error)
                    return "str." + error;
            }
            if (message.json != null && Object.hasOwnProperty.call(message, "json")) {
                var error = $root.common.StringValue.verify(message.json, long + 1);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes, long + 1);
                if (error)
                    return "bytes." + error;
            }
            return null;
        };

        /**
         * Creates a NameAndXAttrValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.NameAndXAttrValue} NameAndXAttrValue
         */
        NameAndXAttrValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.NameAndXAttrValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.NameAndXAttrValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.NameAndXAttrValue();
            if (object.xaName != null)
                message.xaName = String(object.xaName);
            if (object.str != null) {
                if (!$util.isObject(object.str))
                    throw TypeError(".file.NameAndXAttrValue.str: object expected");
                message.str = $root.common.StringValue.fromObject(object.str, long + 1);
            }
            if (object.json != null) {
                if (!$util.isObject(object.json))
                    throw TypeError(".file.NameAndXAttrValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json, long + 1);
            }
            if (object.bytes != null) {
                if (!$util.isObject(object.bytes))
                    throw TypeError(".file.NameAndXAttrValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a NameAndXAttrValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {file.NameAndXAttrValue} message NameAndXAttrValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        NameAndXAttrValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.xaName = "";
                object.str = null;
                object.json = null;
                object.bytes = null;
            }
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                object.xaName = message.xaName;
            if (message.str != null && Object.hasOwnProperty.call(message, "str"))
                object.str = $root.common.StringValue.toObject(message.str, options, q + 1);
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = $root.common.StringValue.toObject(message.json, options, q + 1);
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options, q + 1);
            return object;
        };

        /**
         * Converts this NameAndXAttrValue to JSON.
         * @function toJSON
         * @memberof file.NameAndXAttrValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        NameAndXAttrValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for NameAndXAttrValue
         * @function getTypeUrl
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        NameAndXAttrValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.NameAndXAttrValue";
        };

        return NameAndXAttrValue;
    })();

    file.XAttrsChanges = (function() {

        /**
         * Properties of a XAttrsChanges.
         * @memberof file
         * @interface IXAttrsChanges
         * @property {Array.<file.INameAndXAttrValue>|null} [set] XAttrsChanges set
         * @property {Array.<string>|null} [remove] XAttrsChanges remove
         */

        /**
         * Constructs a new XAttrsChanges.
         * @memberof file
         * @classdesc Represents a XAttrsChanges.
         * @implements IXAttrsChanges
         * @constructor
         * @param {file.IXAttrsChanges=} [properties] Properties to set
         */
        function XAttrsChanges(properties) {
            this.set = [];
            this.remove = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * XAttrsChanges set.
         * @member {Array.<file.INameAndXAttrValue>} set
         * @memberof file.XAttrsChanges
         * @instance
         */
        XAttrsChanges.prototype.set = $util.emptyArray;

        /**
         * XAttrsChanges remove.
         * @member {Array.<string>} remove
         * @memberof file.XAttrsChanges
         * @instance
         */
        XAttrsChanges.prototype.remove = $util.emptyArray;

        /**
         * Creates a new XAttrsChanges instance using the specified properties.
         * @function create
         * @memberof file.XAttrsChanges
         * @static
         * @param {file.IXAttrsChanges=} [properties] Properties to set
         * @returns {file.XAttrsChanges} XAttrsChanges instance
         */
        XAttrsChanges.create = function create(properties) {
            return new XAttrsChanges(properties);
        };

        /**
         * Encodes the specified XAttrsChanges message. Does not implicitly {@link file.XAttrsChanges.verify|verify} messages.
         * @function encode
         * @memberof file.XAttrsChanges
         * @static
         * @param {file.IXAttrsChanges} message XAttrsChanges message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        XAttrsChanges.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.set != null && message.set.length)
                for (var i = 0; i < message.set.length; ++i)
                    $root.file.NameAndXAttrValue.encode(message.set[i], writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.remove != null && message.remove.length)
                for (var i = 0; i < message.remove.length; ++i)
                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.remove[i]);
            return writer;
        };

        /**
         * Encodes the specified XAttrsChanges message, length delimited. Does not implicitly {@link file.XAttrsChanges.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.XAttrsChanges
         * @static
         * @param {file.IXAttrsChanges} message XAttrsChanges message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        XAttrsChanges.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a XAttrsChanges message from the specified reader or buffer.
         * @function decode
         * @memberof file.XAttrsChanges
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.XAttrsChanges} XAttrsChanges
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        XAttrsChanges.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.XAttrsChanges();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.set && message.set.length))
                            message.set = [];
                        message.set.push($root.file.NameAndXAttrValue.decode(reader, reader.uint32(), undefined, long + 1));
                        break;
                    }
                case 2: {
                        if (!(message.remove && message.remove.length))
                            message.remove = [];
                        message.remove.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a XAttrsChanges message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.XAttrsChanges
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.XAttrsChanges} XAttrsChanges
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        XAttrsChanges.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a XAttrsChanges message.
         * @function verify
         * @memberof file.XAttrsChanges
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        XAttrsChanges.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.set != null && Object.hasOwnProperty.call(message, "set")) {
                if (!Array.isArray(message.set))
                    return "set: array expected";
                for (var i = 0; i < message.set.length; ++i) {
                    var error = $root.file.NameAndXAttrValue.verify(message.set[i], long + 1);
                    if (error)
                        return "set." + error;
                }
            }
            if (message.remove != null && Object.hasOwnProperty.call(message, "remove")) {
                if (!Array.isArray(message.remove))
                    return "remove: array expected";
                for (var i = 0; i < message.remove.length; ++i)
                    if (!$util.isString(message.remove[i]))
                        return "remove: string[] expected";
            }
            return null;
        };

        /**
         * Creates a XAttrsChanges message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.XAttrsChanges
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.XAttrsChanges} XAttrsChanges
         */
        XAttrsChanges.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.XAttrsChanges)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.XAttrsChanges: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.XAttrsChanges();
            if (object.set) {
                if (!Array.isArray(object.set))
                    throw TypeError(".file.XAttrsChanges.set: array expected");
                message.set = [];
                for (var i = 0; i < object.set.length; ++i) {
                    if (!$util.isObject(object.set[i]))
                        throw TypeError(".file.XAttrsChanges.set: object expected");
                    message.set[i] = $root.file.NameAndXAttrValue.fromObject(object.set[i], long + 1);
                }
            }
            if (object.remove) {
                if (!Array.isArray(object.remove))
                    throw TypeError(".file.XAttrsChanges.remove: array expected");
                message.remove = [];
                for (var i = 0; i < object.remove.length; ++i)
                    message.remove[i] = String(object.remove[i]);
            }
            return message;
        };

        /**
         * Creates a plain object from a XAttrsChanges message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.XAttrsChanges
         * @static
         * @param {file.XAttrsChanges} message XAttrsChanges
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        XAttrsChanges.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults) {
                object.set = [];
                object.remove = [];
            }
            if (message.set && message.set.length) {
                object.set = [];
                for (var j = 0; j < message.set.length; ++j)
                    object.set[j] = $root.file.NameAndXAttrValue.toObject(message.set[j], options, q + 1);
            }
            if (message.remove && message.remove.length) {
                object.remove = [];
                for (var j = 0; j < message.remove.length; ++j)
                    object.remove[j] = message.remove[j];
            }
            return object;
        };

        /**
         * Converts this XAttrsChanges to JSON.
         * @function toJSON
         * @memberof file.XAttrsChanges
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        XAttrsChanges.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for XAttrsChanges
         * @function getTypeUrl
         * @memberof file.XAttrsChanges
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        XAttrsChanges.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.XAttrsChanges";
        };

        return XAttrsChanges;
    })();

    file.WriteBytesRequestBody = (function() {

        /**
         * Properties of a WriteBytesRequestBody.
         * @memberof file
         * @interface IWriteBytesRequestBody
         * @property {Uint8Array|null} [bytes] WriteBytesRequestBody bytes
         */

        /**
         * Constructs a new WriteBytesRequestBody.
         * @memberof file
         * @classdesc Represents a WriteBytesRequestBody.
         * @implements IWriteBytesRequestBody
         * @constructor
         * @param {file.IWriteBytesRequestBody=} [properties] Properties to set
         */
        function WriteBytesRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * WriteBytesRequestBody bytes.
         * @member {Uint8Array} bytes
         * @memberof file.WriteBytesRequestBody
         * @instance
         */
        WriteBytesRequestBody.prototype.bytes = $util.newBuffer([]);

        /**
         * Creates a new WriteBytesRequestBody instance using the specified properties.
         * @function create
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {file.IWriteBytesRequestBody=} [properties] Properties to set
         * @returns {file.WriteBytesRequestBody} WriteBytesRequestBody instance
         */
        WriteBytesRequestBody.create = function create(properties) {
            return new WriteBytesRequestBody(properties);
        };

        /**
         * Encodes the specified WriteBytesRequestBody message. Does not implicitly {@link file.WriteBytesRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {file.IWriteBytesRequestBody} message WriteBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteBytesRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.bytes);
            return writer;
        };

        /**
         * Encodes the specified WriteBytesRequestBody message, length delimited. Does not implicitly {@link file.WriteBytesRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {file.IWriteBytesRequestBody} message WriteBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteBytesRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a WriteBytesRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.WriteBytesRequestBody} WriteBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteBytesRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.WriteBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.bytes = reader.bytes();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a WriteBytesRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.WriteBytesRequestBody} WriteBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteBytesRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a WriteBytesRequestBody message.
         * @function verify
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        WriteBytesRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                if (!(message.bytes && typeof message.bytes.length === "number" || $util.isString(message.bytes)))
                    return "bytes: buffer expected";
            return null;
        };

        /**
         * Creates a WriteBytesRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.WriteBytesRequestBody} WriteBytesRequestBody
         */
        WriteBytesRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.WriteBytesRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.WriteBytesRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.WriteBytesRequestBody();
            if (object.bytes != null)
                if (typeof object.bytes === "string")
                    $util.base64.decode(object.bytes, message.bytes = $util.newBuffer($util.base64.length(object.bytes)), 0);
                else if (object.bytes.length >= 0)
                    message.bytes = object.bytes;
            return message;
        };

        /**
         * Creates a plain object from a WriteBytesRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {file.WriteBytesRequestBody} message WriteBytesRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        WriteBytesRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if (options.bytes === String)
                    object.bytes = "";
                else {
                    object.bytes = [];
                    if (options.bytes !== Array)
                        object.bytes = $util.newBuffer(object.bytes);
                }
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = options.bytes === String ? $util.base64.encode(message.bytes, 0, message.bytes.length) : options.bytes === Array ? Array.prototype.slice.call(message.bytes) : message.bytes;
            return object;
        };

        /**
         * Converts this WriteBytesRequestBody to JSON.
         * @function toJSON
         * @memberof file.WriteBytesRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        WriteBytesRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for WriteBytesRequestBody
         * @function getTypeUrl
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        WriteBytesRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.WriteBytesRequestBody";
        };

        return WriteBytesRequestBody;
    })();

    file.WriteTxtRequestBody = (function() {

        /**
         * Properties of a WriteTxtRequestBody.
         * @memberof file
         * @interface IWriteTxtRequestBody
         * @property {string|null} [txt] WriteTxtRequestBody txt
         */

        /**
         * Constructs a new WriteTxtRequestBody.
         * @memberof file
         * @classdesc Represents a WriteTxtRequestBody.
         * @implements IWriteTxtRequestBody
         * @constructor
         * @param {file.IWriteTxtRequestBody=} [properties] Properties to set
         */
        function WriteTxtRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * WriteTxtRequestBody txt.
         * @member {string} txt
         * @memberof file.WriteTxtRequestBody
         * @instance
         */
        WriteTxtRequestBody.prototype.txt = "";

        /**
         * Creates a new WriteTxtRequestBody instance using the specified properties.
         * @function create
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {file.IWriteTxtRequestBody=} [properties] Properties to set
         * @returns {file.WriteTxtRequestBody} WriteTxtRequestBody instance
         */
        WriteTxtRequestBody.create = function create(properties) {
            return new WriteTxtRequestBody(properties);
        };

        /**
         * Encodes the specified WriteTxtRequestBody message. Does not implicitly {@link file.WriteTxtRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {file.IWriteTxtRequestBody} message WriteTxtRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteTxtRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.txt);
            return writer;
        };

        /**
         * Encodes the specified WriteTxtRequestBody message, length delimited. Does not implicitly {@link file.WriteTxtRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {file.IWriteTxtRequestBody} message WriteTxtRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteTxtRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a WriteTxtRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.WriteTxtRequestBody} WriteTxtRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteTxtRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.WriteTxtRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.txt = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a WriteTxtRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.WriteTxtRequestBody} WriteTxtRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteTxtRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a WriteTxtRequestBody message.
         * @function verify
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        WriteTxtRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                if (!$util.isString(message.txt))
                    return "txt: string expected";
            return null;
        };

        /**
         * Creates a WriteTxtRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.WriteTxtRequestBody} WriteTxtRequestBody
         */
        WriteTxtRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.WriteTxtRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.WriteTxtRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.WriteTxtRequestBody();
            if (object.txt != null)
                message.txt = String(object.txt);
            return message;
        };

        /**
         * Creates a plain object from a WriteTxtRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {file.WriteTxtRequestBody} message WriteTxtRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        WriteTxtRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.txt = "";
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                object.txt = message.txt;
            return object;
        };

        /**
         * Converts this WriteTxtRequestBody to JSON.
         * @function toJSON
         * @memberof file.WriteTxtRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        WriteTxtRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for WriteTxtRequestBody
         * @function getTypeUrl
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        WriteTxtRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.WriteTxtRequestBody";
        };

        return WriteTxtRequestBody;
    })();

    file.WriteJsonRequestBody = (function() {

        /**
         * Properties of a WriteJsonRequestBody.
         * @memberof file
         * @interface IWriteJsonRequestBody
         * @property {string|null} [json] WriteJsonRequestBody json
         */

        /**
         * Constructs a new WriteJsonRequestBody.
         * @memberof file
         * @classdesc Represents a WriteJsonRequestBody.
         * @implements IWriteJsonRequestBody
         * @constructor
         * @param {file.IWriteJsonRequestBody=} [properties] Properties to set
         */
        function WriteJsonRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * WriteJsonRequestBody json.
         * @member {string} json
         * @memberof file.WriteJsonRequestBody
         * @instance
         */
        WriteJsonRequestBody.prototype.json = "";

        /**
         * Creates a new WriteJsonRequestBody instance using the specified properties.
         * @function create
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {file.IWriteJsonRequestBody=} [properties] Properties to set
         * @returns {file.WriteJsonRequestBody} WriteJsonRequestBody instance
         */
        WriteJsonRequestBody.create = function create(properties) {
            return new WriteJsonRequestBody(properties);
        };

        /**
         * Encodes the specified WriteJsonRequestBody message. Does not implicitly {@link file.WriteJsonRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {file.IWriteJsonRequestBody} message WriteJsonRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteJsonRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.json);
            return writer;
        };

        /**
         * Encodes the specified WriteJsonRequestBody message, length delimited. Does not implicitly {@link file.WriteJsonRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {file.IWriteJsonRequestBody} message WriteJsonRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteJsonRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a WriteJsonRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.WriteJsonRequestBody} WriteJsonRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteJsonRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.WriteJsonRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.json = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a WriteJsonRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.WriteJsonRequestBody} WriteJsonRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteJsonRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a WriteJsonRequestBody message.
         * @function verify
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        WriteJsonRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                if (!$util.isString(message.json))
                    return "json: string expected";
            return null;
        };

        /**
         * Creates a WriteJsonRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.WriteJsonRequestBody} WriteJsonRequestBody
         */
        WriteJsonRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.WriteJsonRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.WriteJsonRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.WriteJsonRequestBody();
            if (object.json != null)
                message.json = String(object.json);
            return message;
        };

        /**
         * Creates a plain object from a WriteJsonRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {file.WriteJsonRequestBody} message WriteJsonRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        WriteJsonRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.json = "";
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = message.json;
            return object;
        };

        /**
         * Converts this WriteJsonRequestBody to JSON.
         * @function toJSON
         * @memberof file.WriteJsonRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        WriteJsonRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for WriteJsonRequestBody
         * @function getTypeUrl
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        WriteJsonRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.WriteJsonRequestBody";
        };

        return WriteJsonRequestBody;
    })();

    file.GetByteSinkRequestBody = (function() {

        /**
         * Properties of a GetByteSinkRequestBody.
         * @memberof file
         * @interface IGetByteSinkRequestBody
         * @property {common.IBooleanValue|null} [truncateFile] GetByteSinkRequestBody truncateFile
         */

        /**
         * Constructs a new GetByteSinkRequestBody.
         * @memberof file
         * @classdesc Represents a GetByteSinkRequestBody.
         * @implements IGetByteSinkRequestBody
         * @constructor
         * @param {file.IGetByteSinkRequestBody=} [properties] Properties to set
         */
        function GetByteSinkRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * GetByteSinkRequestBody truncateFile.
         * @member {common.IBooleanValue|null|undefined} truncateFile
         * @memberof file.GetByteSinkRequestBody
         * @instance
         */
        GetByteSinkRequestBody.prototype.truncateFile = null;

        /**
         * Creates a new GetByteSinkRequestBody instance using the specified properties.
         * @function create
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {file.IGetByteSinkRequestBody=} [properties] Properties to set
         * @returns {file.GetByteSinkRequestBody} GetByteSinkRequestBody instance
         */
        GetByteSinkRequestBody.create = function create(properties) {
            return new GetByteSinkRequestBody(properties);
        };

        /**
         * Encodes the specified GetByteSinkRequestBody message. Does not implicitly {@link file.GetByteSinkRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {file.IGetByteSinkRequestBody} message GetByteSinkRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        GetByteSinkRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.truncateFile != null && Object.hasOwnProperty.call(message, "truncateFile"))
                $root.common.BooleanValue.encode(message.truncateFile, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified GetByteSinkRequestBody message, length delimited. Does not implicitly {@link file.GetByteSinkRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {file.IGetByteSinkRequestBody} message GetByteSinkRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        GetByteSinkRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a GetByteSinkRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.GetByteSinkRequestBody} GetByteSinkRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        GetByteSinkRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.GetByteSinkRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.truncateFile = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a GetByteSinkRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.GetByteSinkRequestBody} GetByteSinkRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        GetByteSinkRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a GetByteSinkRequestBody message.
         * @function verify
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        GetByteSinkRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.truncateFile != null && Object.hasOwnProperty.call(message, "truncateFile")) {
                var error = $root.common.BooleanValue.verify(message.truncateFile, long + 1);
                if (error)
                    return "truncateFile." + error;
            }
            return null;
        };

        /**
         * Creates a GetByteSinkRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.GetByteSinkRequestBody} GetByteSinkRequestBody
         */
        GetByteSinkRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.GetByteSinkRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.GetByteSinkRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.GetByteSinkRequestBody();
            if (object.truncateFile != null) {
                if (!$util.isObject(object.truncateFile))
                    throw TypeError(".file.GetByteSinkRequestBody.truncateFile: object expected");
                message.truncateFile = $root.common.BooleanValue.fromObject(object.truncateFile, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a GetByteSinkRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {file.GetByteSinkRequestBody} message GetByteSinkRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        GetByteSinkRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.truncateFile = null;
            if (message.truncateFile != null && Object.hasOwnProperty.call(message, "truncateFile"))
                object.truncateFile = $root.common.BooleanValue.toObject(message.truncateFile, options, q + 1);
            return object;
        };

        /**
         * Converts this GetByteSinkRequestBody to JSON.
         * @function toJSON
         * @memberof file.GetByteSinkRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        GetByteSinkRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for GetByteSinkRequestBody
         * @function getTypeUrl
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        GetByteSinkRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.GetByteSinkRequestBody";
        };

        return GetByteSinkRequestBody;
    })();

    file.CopyRequestBody = (function() {

        /**
         * Properties of a CopyRequestBody.
         * @memberof file
         * @interface ICopyRequestBody
         * @property {common.IObjectReference|null} [file] CopyRequestBody file
         */

        /**
         * Constructs a new CopyRequestBody.
         * @memberof file
         * @classdesc Represents a CopyRequestBody.
         * @implements ICopyRequestBody
         * @constructor
         * @param {file.ICopyRequestBody=} [properties] Properties to set
         */
        function CopyRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * CopyRequestBody file.
         * @member {common.IObjectReference|null|undefined} file
         * @memberof file.CopyRequestBody
         * @instance
         */
        CopyRequestBody.prototype.file = null;

        /**
         * Creates a new CopyRequestBody instance using the specified properties.
         * @function create
         * @memberof file.CopyRequestBody
         * @static
         * @param {file.ICopyRequestBody=} [properties] Properties to set
         * @returns {file.CopyRequestBody} CopyRequestBody instance
         */
        CopyRequestBody.create = function create(properties) {
            return new CopyRequestBody(properties);
        };

        /**
         * Encodes the specified CopyRequestBody message. Does not implicitly {@link file.CopyRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.CopyRequestBody
         * @static
         * @param {file.ICopyRequestBody} message CopyRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CopyRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                $root.common.ObjectReference.encode(message.file, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified CopyRequestBody message, length delimited. Does not implicitly {@link file.CopyRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.CopyRequestBody
         * @static
         * @param {file.ICopyRequestBody} message CopyRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CopyRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a CopyRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.CopyRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.CopyRequestBody} CopyRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CopyRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.CopyRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.file = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a CopyRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.CopyRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.CopyRequestBody} CopyRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CopyRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a CopyRequestBody message.
         * @function verify
         * @memberof file.CopyRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        CopyRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.file != null && Object.hasOwnProperty.call(message, "file")) {
                var error = $root.common.ObjectReference.verify(message.file, long + 1);
                if (error)
                    return "file." + error;
            }
            return null;
        };

        /**
         * Creates a CopyRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.CopyRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.CopyRequestBody} CopyRequestBody
         */
        CopyRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.CopyRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.CopyRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.CopyRequestBody();
            if (object.file != null) {
                if (!$util.isObject(object.file))
                    throw TypeError(".file.CopyRequestBody.file: object expected");
                message.file = $root.common.ObjectReference.fromObject(object.file, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a CopyRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.CopyRequestBody
         * @static
         * @param {file.CopyRequestBody} message CopyRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        CopyRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.file = null;
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                object.file = $root.common.ObjectReference.toObject(message.file, options, q + 1);
            return object;
        };

        /**
         * Converts this CopyRequestBody to JSON.
         * @function toJSON
         * @memberof file.CopyRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        CopyRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for CopyRequestBody
         * @function getTypeUrl
         * @memberof file.CopyRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        CopyRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.CopyRequestBody";
        };

        return CopyRequestBody;
    })();

    file.VersionedGetByteSinkRequestBody = (function() {

        /**
         * Properties of a VersionedGetByteSinkRequestBody.
         * @memberof file
         * @interface IVersionedGetByteSinkRequestBody
         * @property {common.IBooleanValue|null} [truncateFile] VersionedGetByteSinkRequestBody truncateFile
         * @property {common.IUInt64Value|null} [currentVersion] VersionedGetByteSinkRequestBody currentVersion
         */

        /**
         * Constructs a new VersionedGetByteSinkRequestBody.
         * @memberof file
         * @classdesc Represents a VersionedGetByteSinkRequestBody.
         * @implements IVersionedGetByteSinkRequestBody
         * @constructor
         * @param {file.IVersionedGetByteSinkRequestBody=} [properties] Properties to set
         */
        function VersionedGetByteSinkRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedGetByteSinkRequestBody truncateFile.
         * @member {common.IBooleanValue|null|undefined} truncateFile
         * @memberof file.VersionedGetByteSinkRequestBody
         * @instance
         */
        VersionedGetByteSinkRequestBody.prototype.truncateFile = null;

        /**
         * VersionedGetByteSinkRequestBody currentVersion.
         * @member {common.IUInt64Value|null|undefined} currentVersion
         * @memberof file.VersionedGetByteSinkRequestBody
         * @instance
         */
        VersionedGetByteSinkRequestBody.prototype.currentVersion = null;

        /**
         * Creates a new VersionedGetByteSinkRequestBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {file.IVersionedGetByteSinkRequestBody=} [properties] Properties to set
         * @returns {file.VersionedGetByteSinkRequestBody} VersionedGetByteSinkRequestBody instance
         */
        VersionedGetByteSinkRequestBody.create = function create(properties) {
            return new VersionedGetByteSinkRequestBody(properties);
        };

        /**
         * Encodes the specified VersionedGetByteSinkRequestBody message. Does not implicitly {@link file.VersionedGetByteSinkRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {file.IVersionedGetByteSinkRequestBody} message VersionedGetByteSinkRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetByteSinkRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.truncateFile != null && Object.hasOwnProperty.call(message, "truncateFile"))
                $root.common.BooleanValue.encode(message.truncateFile, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                $root.common.UInt64Value.encode(message.currentVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedGetByteSinkRequestBody message, length delimited. Does not implicitly {@link file.VersionedGetByteSinkRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {file.IVersionedGetByteSinkRequestBody} message VersionedGetByteSinkRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetByteSinkRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedGetByteSinkRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedGetByteSinkRequestBody} VersionedGetByteSinkRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetByteSinkRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetByteSinkRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.truncateFile = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.currentVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedGetByteSinkRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedGetByteSinkRequestBody} VersionedGetByteSinkRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetByteSinkRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedGetByteSinkRequestBody message.
         * @function verify
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedGetByteSinkRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.truncateFile != null && Object.hasOwnProperty.call(message, "truncateFile")) {
                var error = $root.common.BooleanValue.verify(message.truncateFile, long + 1);
                if (error)
                    return "truncateFile." + error;
            }
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion")) {
                var error = $root.common.UInt64Value.verify(message.currentVersion, long + 1);
                if (error)
                    return "currentVersion." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedGetByteSinkRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedGetByteSinkRequestBody} VersionedGetByteSinkRequestBody
         */
        VersionedGetByteSinkRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedGetByteSinkRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedGetByteSinkRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedGetByteSinkRequestBody();
            if (object.truncateFile != null) {
                if (!$util.isObject(object.truncateFile))
                    throw TypeError(".file.VersionedGetByteSinkRequestBody.truncateFile: object expected");
                message.truncateFile = $root.common.BooleanValue.fromObject(object.truncateFile, long + 1);
            }
            if (object.currentVersion != null) {
                if (!$util.isObject(object.currentVersion))
                    throw TypeError(".file.VersionedGetByteSinkRequestBody.currentVersion: object expected");
                message.currentVersion = $root.common.UInt64Value.fromObject(object.currentVersion, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedGetByteSinkRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {file.VersionedGetByteSinkRequestBody} message VersionedGetByteSinkRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedGetByteSinkRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.truncateFile = null;
                object.currentVersion = null;
            }
            if (message.truncateFile != null && Object.hasOwnProperty.call(message, "truncateFile"))
                object.truncateFile = $root.common.BooleanValue.toObject(message.truncateFile, options, q + 1);
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                object.currentVersion = $root.common.UInt64Value.toObject(message.currentVersion, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedGetByteSinkRequestBody to JSON.
         * @function toJSON
         * @memberof file.VersionedGetByteSinkRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedGetByteSinkRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedGetByteSinkRequestBody
         * @function getTypeUrl
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedGetByteSinkRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedGetByteSinkRequestBody";
        };

        return VersionedGetByteSinkRequestBody;
    })();

    file.VersionedGetByteSinkReplyBody = (function() {

        /**
         * Properties of a VersionedGetByteSinkReplyBody.
         * @memberof file
         * @interface IVersionedGetByteSinkReplyBody
         * @property {number|Long|null} [version] VersionedGetByteSinkReplyBody version
         * @property {common.IObjectReference|null} [sink] VersionedGetByteSinkReplyBody sink
         */

        /**
         * Constructs a new VersionedGetByteSinkReplyBody.
         * @memberof file
         * @classdesc Represents a VersionedGetByteSinkReplyBody.
         * @implements IVersionedGetByteSinkReplyBody
         * @constructor
         * @param {file.IVersionedGetByteSinkReplyBody=} [properties] Properties to set
         */
        function VersionedGetByteSinkReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedGetByteSinkReplyBody version.
         * @member {number|Long} version
         * @memberof file.VersionedGetByteSinkReplyBody
         * @instance
         */
        VersionedGetByteSinkReplyBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * VersionedGetByteSinkReplyBody sink.
         * @member {common.IObjectReference|null|undefined} sink
         * @memberof file.VersionedGetByteSinkReplyBody
         * @instance
         */
        VersionedGetByteSinkReplyBody.prototype.sink = null;

        /**
         * Creates a new VersionedGetByteSinkReplyBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {file.IVersionedGetByteSinkReplyBody=} [properties] Properties to set
         * @returns {file.VersionedGetByteSinkReplyBody} VersionedGetByteSinkReplyBody instance
         */
        VersionedGetByteSinkReplyBody.create = function create(properties) {
            return new VersionedGetByteSinkReplyBody(properties);
        };

        /**
         * Encodes the specified VersionedGetByteSinkReplyBody message. Does not implicitly {@link file.VersionedGetByteSinkReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {file.IVersionedGetByteSinkReplyBody} message VersionedGetByteSinkReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetByteSinkReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            if (message.sink != null && Object.hasOwnProperty.call(message, "sink"))
                $root.common.ObjectReference.encode(message.sink, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedGetByteSinkReplyBody message, length delimited. Does not implicitly {@link file.VersionedGetByteSinkReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {file.IVersionedGetByteSinkReplyBody} message VersionedGetByteSinkReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetByteSinkReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedGetByteSinkReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedGetByteSinkReplyBody} VersionedGetByteSinkReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetByteSinkReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetByteSinkReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.sink = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedGetByteSinkReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedGetByteSinkReplyBody} VersionedGetByteSinkReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetByteSinkReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedGetByteSinkReplyBody message.
         * @function verify
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedGetByteSinkReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            if (message.sink != null && Object.hasOwnProperty.call(message, "sink")) {
                var error = $root.common.ObjectReference.verify(message.sink, long + 1);
                if (error)
                    return "sink." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedGetByteSinkReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedGetByteSinkReplyBody} VersionedGetByteSinkReplyBody
         */
        VersionedGetByteSinkReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedGetByteSinkReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedGetByteSinkReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedGetByteSinkReplyBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            if (object.sink != null) {
                if (!$util.isObject(object.sink))
                    throw TypeError(".file.VersionedGetByteSinkReplyBody.sink: object expected");
                message.sink = $root.common.ObjectReference.fromObject(object.sink, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedGetByteSinkReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {file.VersionedGetByteSinkReplyBody} message VersionedGetByteSinkReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedGetByteSinkReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.sink = null;
            }
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            if (message.sink != null && Object.hasOwnProperty.call(message, "sink"))
                object.sink = $root.common.ObjectReference.toObject(message.sink, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedGetByteSinkReplyBody to JSON.
         * @function toJSON
         * @memberof file.VersionedGetByteSinkReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedGetByteSinkReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedGetByteSinkReplyBody
         * @function getTypeUrl
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedGetByteSinkReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedGetByteSinkReplyBody";
        };

        return VersionedGetByteSinkReplyBody;
    })();

    file.ArchiveCurrentRequestBody = (function() {

        /**
         * Properties of an ArchiveCurrentRequestBody.
         * @memberof file
         * @interface IArchiveCurrentRequestBody
         * @property {common.IUInt64Value|null} [version] ArchiveCurrentRequestBody version
         */

        /**
         * Constructs a new ArchiveCurrentRequestBody.
         * @memberof file
         * @classdesc Represents an ArchiveCurrentRequestBody.
         * @implements IArchiveCurrentRequestBody
         * @constructor
         * @param {file.IArchiveCurrentRequestBody=} [properties] Properties to set
         */
        function ArchiveCurrentRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ArchiveCurrentRequestBody version.
         * @member {common.IUInt64Value|null|undefined} version
         * @memberof file.ArchiveCurrentRequestBody
         * @instance
         */
        ArchiveCurrentRequestBody.prototype.version = null;

        /**
         * Creates a new ArchiveCurrentRequestBody instance using the specified properties.
         * @function create
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {file.IArchiveCurrentRequestBody=} [properties] Properties to set
         * @returns {file.ArchiveCurrentRequestBody} ArchiveCurrentRequestBody instance
         */
        ArchiveCurrentRequestBody.create = function create(properties) {
            return new ArchiveCurrentRequestBody(properties);
        };

        /**
         * Encodes the specified ArchiveCurrentRequestBody message. Does not implicitly {@link file.ArchiveCurrentRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {file.IArchiveCurrentRequestBody} message ArchiveCurrentRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ArchiveCurrentRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                $root.common.UInt64Value.encode(message.version, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified ArchiveCurrentRequestBody message, length delimited. Does not implicitly {@link file.ArchiveCurrentRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {file.IArchiveCurrentRequestBody} message ArchiveCurrentRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ArchiveCurrentRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an ArchiveCurrentRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.ArchiveCurrentRequestBody} ArchiveCurrentRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ArchiveCurrentRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ArchiveCurrentRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an ArchiveCurrentRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.ArchiveCurrentRequestBody} ArchiveCurrentRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ArchiveCurrentRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an ArchiveCurrentRequestBody message.
         * @function verify
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ArchiveCurrentRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version")) {
                var error = $root.common.UInt64Value.verify(message.version, long + 1);
                if (error)
                    return "version." + error;
            }
            return null;
        };

        /**
         * Creates an ArchiveCurrentRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.ArchiveCurrentRequestBody} ArchiveCurrentRequestBody
         */
        ArchiveCurrentRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.ArchiveCurrentRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.ArchiveCurrentRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.ArchiveCurrentRequestBody();
            if (object.version != null) {
                if (!$util.isObject(object.version))
                    throw TypeError(".file.ArchiveCurrentRequestBody.version: object expected");
                message.version = $root.common.UInt64Value.fromObject(object.version, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an ArchiveCurrentRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {file.ArchiveCurrentRequestBody} message ArchiveCurrentRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ArchiveCurrentRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.version = null;
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                object.version = $root.common.UInt64Value.toObject(message.version, options, q + 1);
            return object;
        };

        /**
         * Converts this ArchiveCurrentRequestBody to JSON.
         * @function toJSON
         * @memberof file.ArchiveCurrentRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ArchiveCurrentRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ArchiveCurrentRequestBody
         * @function getTypeUrl
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ArchiveCurrentRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.ArchiveCurrentRequestBody";
        };

        return ArchiveCurrentRequestBody;
    })();

    file.FileSyncIsOnDiskRequestBody = (function() {

        /**
         * Properties of a FileSyncIsOnDiskRequestBody.
         * @memberof file
         * @interface IFileSyncIsOnDiskRequestBody
         * @property {number|Long|null} [version] FileSyncIsOnDiskRequestBody version
         */

        /**
         * Constructs a new FileSyncIsOnDiskRequestBody.
         * @memberof file
         * @classdesc Represents a FileSyncIsOnDiskRequestBody.
         * @implements IFileSyncIsOnDiskRequestBody
         * @constructor
         * @param {file.IFileSyncIsOnDiskRequestBody=} [properties] Properties to set
         */
        function FileSyncIsOnDiskRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileSyncIsOnDiskRequestBody version.
         * @member {number|Long} version
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @instance
         */
        FileSyncIsOnDiskRequestBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new FileSyncIsOnDiskRequestBody instance using the specified properties.
         * @function create
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {file.IFileSyncIsOnDiskRequestBody=} [properties] Properties to set
         * @returns {file.FileSyncIsOnDiskRequestBody} FileSyncIsOnDiskRequestBody instance
         */
        FileSyncIsOnDiskRequestBody.create = function create(properties) {
            return new FileSyncIsOnDiskRequestBody(properties);
        };

        /**
         * Encodes the specified FileSyncIsOnDiskRequestBody message. Does not implicitly {@link file.FileSyncIsOnDiskRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {file.IFileSyncIsOnDiskRequestBody} message FileSyncIsOnDiskRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncIsOnDiskRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            return writer;
        };

        /**
         * Encodes the specified FileSyncIsOnDiskRequestBody message, length delimited. Does not implicitly {@link file.FileSyncIsOnDiskRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {file.IFileSyncIsOnDiskRequestBody} message FileSyncIsOnDiskRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncIsOnDiskRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileSyncIsOnDiskRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileSyncIsOnDiskRequestBody} FileSyncIsOnDiskRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncIsOnDiskRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncIsOnDiskRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileSyncIsOnDiskRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.FileSyncIsOnDiskRequestBody} FileSyncIsOnDiskRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncIsOnDiskRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileSyncIsOnDiskRequestBody message.
         * @function verify
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileSyncIsOnDiskRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            return null;
        };

        /**
         * Creates a FileSyncIsOnDiskRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileSyncIsOnDiskRequestBody} FileSyncIsOnDiskRequestBody
         */
        FileSyncIsOnDiskRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.FileSyncIsOnDiskRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.FileSyncIsOnDiskRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.FileSyncIsOnDiskRequestBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from a FileSyncIsOnDiskRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {file.FileSyncIsOnDiskRequestBody} message FileSyncIsOnDiskRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileSyncIsOnDiskRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            return object;
        };

        /**
         * Converts this FileSyncIsOnDiskRequestBody to JSON.
         * @function toJSON
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileSyncIsOnDiskRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileSyncIsOnDiskRequestBody
         * @function getTypeUrl
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileSyncIsOnDiskRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.FileSyncIsOnDiskRequestBody";
        };

        return FileSyncIsOnDiskRequestBody;
    })();

    file.FileSyncIsOnDiskReplyBody = (function() {

        /**
         * Properties of a FileSyncIsOnDiskReplyBody.
         * @memberof file
         * @interface IFileSyncIsOnDiskReplyBody
         * @property {string|null} [status] FileSyncIsOnDiskReplyBody status
         */

        /**
         * Constructs a new FileSyncIsOnDiskReplyBody.
         * @memberof file
         * @classdesc Represents a FileSyncIsOnDiskReplyBody.
         * @implements IFileSyncIsOnDiskReplyBody
         * @constructor
         * @param {file.IFileSyncIsOnDiskReplyBody=} [properties] Properties to set
         */
        function FileSyncIsOnDiskReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileSyncIsOnDiskReplyBody status.
         * @member {string} status
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @instance
         */
        FileSyncIsOnDiskReplyBody.prototype.status = "";

        /**
         * Creates a new FileSyncIsOnDiskReplyBody instance using the specified properties.
         * @function create
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {file.IFileSyncIsOnDiskReplyBody=} [properties] Properties to set
         * @returns {file.FileSyncIsOnDiskReplyBody} FileSyncIsOnDiskReplyBody instance
         */
        FileSyncIsOnDiskReplyBody.create = function create(properties) {
            return new FileSyncIsOnDiskReplyBody(properties);
        };

        /**
         * Encodes the specified FileSyncIsOnDiskReplyBody message. Does not implicitly {@link file.FileSyncIsOnDiskReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {file.IFileSyncIsOnDiskReplyBody} message FileSyncIsOnDiskReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncIsOnDiskReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.status != null && Object.hasOwnProperty.call(message, "status"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.status);
            return writer;
        };

        /**
         * Encodes the specified FileSyncIsOnDiskReplyBody message, length delimited. Does not implicitly {@link file.FileSyncIsOnDiskReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {file.IFileSyncIsOnDiskReplyBody} message FileSyncIsOnDiskReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncIsOnDiskReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileSyncIsOnDiskReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileSyncIsOnDiskReplyBody} FileSyncIsOnDiskReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncIsOnDiskReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncIsOnDiskReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.status = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileSyncIsOnDiskReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.FileSyncIsOnDiskReplyBody} FileSyncIsOnDiskReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncIsOnDiskReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileSyncIsOnDiskReplyBody message.
         * @function verify
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileSyncIsOnDiskReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.status != null && Object.hasOwnProperty.call(message, "status"))
                if (!$util.isString(message.status))
                    return "status: string expected";
            return null;
        };

        /**
         * Creates a FileSyncIsOnDiskReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileSyncIsOnDiskReplyBody} FileSyncIsOnDiskReplyBody
         */
        FileSyncIsOnDiskReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.FileSyncIsOnDiskReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.FileSyncIsOnDiskReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.FileSyncIsOnDiskReplyBody();
            if (object.status != null)
                message.status = String(object.status);
            return message;
        };

        /**
         * Creates a plain object from a FileSyncIsOnDiskReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {file.FileSyncIsOnDiskReplyBody} message FileSyncIsOnDiskReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileSyncIsOnDiskReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.status = "";
            if (message.status != null && Object.hasOwnProperty.call(message, "status"))
                object.status = message.status;
            return object;
        };

        /**
         * Converts this FileSyncIsOnDiskReplyBody to JSON.
         * @function toJSON
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileSyncIsOnDiskReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileSyncIsOnDiskReplyBody
         * @function getTypeUrl
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileSyncIsOnDiskReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.FileSyncIsOnDiskReplyBody";
        };

        return FileSyncIsOnDiskReplyBody;
    })();

    file.FileSyncStartDownloadRequestBody = (function() {

        /**
         * Properties of a FileSyncStartDownloadRequestBody.
         * @memberof file
         * @interface IFileSyncStartDownloadRequestBody
         * @property {number|Long|null} [version] FileSyncStartDownloadRequestBody version
         */

        /**
         * Constructs a new FileSyncStartDownloadRequestBody.
         * @memberof file
         * @classdesc Represents a FileSyncStartDownloadRequestBody.
         * @implements IFileSyncStartDownloadRequestBody
         * @constructor
         * @param {file.IFileSyncStartDownloadRequestBody=} [properties] Properties to set
         */
        function FileSyncStartDownloadRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileSyncStartDownloadRequestBody version.
         * @member {number|Long} version
         * @memberof file.FileSyncStartDownloadRequestBody
         * @instance
         */
        FileSyncStartDownloadRequestBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new FileSyncStartDownloadRequestBody instance using the specified properties.
         * @function create
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {file.IFileSyncStartDownloadRequestBody=} [properties] Properties to set
         * @returns {file.FileSyncStartDownloadRequestBody} FileSyncStartDownloadRequestBody instance
         */
        FileSyncStartDownloadRequestBody.create = function create(properties) {
            return new FileSyncStartDownloadRequestBody(properties);
        };

        /**
         * Encodes the specified FileSyncStartDownloadRequestBody message. Does not implicitly {@link file.FileSyncStartDownloadRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {file.IFileSyncStartDownloadRequestBody} message FileSyncStartDownloadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncStartDownloadRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            return writer;
        };

        /**
         * Encodes the specified FileSyncStartDownloadRequestBody message, length delimited. Does not implicitly {@link file.FileSyncStartDownloadRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {file.IFileSyncStartDownloadRequestBody} message FileSyncStartDownloadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncStartDownloadRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileSyncStartDownloadRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileSyncStartDownloadRequestBody} FileSyncStartDownloadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncStartDownloadRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncStartDownloadRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileSyncStartDownloadRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.FileSyncStartDownloadRequestBody} FileSyncStartDownloadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncStartDownloadRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileSyncStartDownloadRequestBody message.
         * @function verify
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileSyncStartDownloadRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            return null;
        };

        /**
         * Creates a FileSyncStartDownloadRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileSyncStartDownloadRequestBody} FileSyncStartDownloadRequestBody
         */
        FileSyncStartDownloadRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.FileSyncStartDownloadRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.FileSyncStartDownloadRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.FileSyncStartDownloadRequestBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from a FileSyncStartDownloadRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {file.FileSyncStartDownloadRequestBody} message FileSyncStartDownloadRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileSyncStartDownloadRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            return object;
        };

        /**
         * Converts this FileSyncStartDownloadRequestBody to JSON.
         * @function toJSON
         * @memberof file.FileSyncStartDownloadRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileSyncStartDownloadRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileSyncStartDownloadRequestBody
         * @function getTypeUrl
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileSyncStartDownloadRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.FileSyncStartDownloadRequestBody";
        };

        return FileSyncStartDownloadRequestBody;
    })();

    file.FileSyncStartDownloadReplyBody = (function() {

        /**
         * Properties of a FileSyncStartDownloadReplyBody.
         * @memberof file
         * @interface IFileSyncStartDownloadReplyBody
         * @property {file.FileSyncStartDownloadReplyBody.IDownloadInfo|null} [startedDownload] FileSyncStartDownloadReplyBody startedDownload
         */

        /**
         * Constructs a new FileSyncStartDownloadReplyBody.
         * @memberof file
         * @classdesc Represents a FileSyncStartDownloadReplyBody.
         * @implements IFileSyncStartDownloadReplyBody
         * @constructor
         * @param {file.IFileSyncStartDownloadReplyBody=} [properties] Properties to set
         */
        function FileSyncStartDownloadReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileSyncStartDownloadReplyBody startedDownload.
         * @member {file.FileSyncStartDownloadReplyBody.IDownloadInfo|null|undefined} startedDownload
         * @memberof file.FileSyncStartDownloadReplyBody
         * @instance
         */
        FileSyncStartDownloadReplyBody.prototype.startedDownload = null;

        /**
         * Creates a new FileSyncStartDownloadReplyBody instance using the specified properties.
         * @function create
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {file.IFileSyncStartDownloadReplyBody=} [properties] Properties to set
         * @returns {file.FileSyncStartDownloadReplyBody} FileSyncStartDownloadReplyBody instance
         */
        FileSyncStartDownloadReplyBody.create = function create(properties) {
            return new FileSyncStartDownloadReplyBody(properties);
        };

        /**
         * Encodes the specified FileSyncStartDownloadReplyBody message. Does not implicitly {@link file.FileSyncStartDownloadReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {file.IFileSyncStartDownloadReplyBody} message FileSyncStartDownloadReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncStartDownloadReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.startedDownload != null && Object.hasOwnProperty.call(message, "startedDownload"))
                $root.file.FileSyncStartDownloadReplyBody.DownloadInfo.encode(message.startedDownload, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FileSyncStartDownloadReplyBody message, length delimited. Does not implicitly {@link file.FileSyncStartDownloadReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {file.IFileSyncStartDownloadReplyBody} message FileSyncStartDownloadReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncStartDownloadReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileSyncStartDownloadReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileSyncStartDownloadReplyBody} FileSyncStartDownloadReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncStartDownloadReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncStartDownloadReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.startedDownload = $root.file.FileSyncStartDownloadReplyBody.DownloadInfo.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileSyncStartDownloadReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.FileSyncStartDownloadReplyBody} FileSyncStartDownloadReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncStartDownloadReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileSyncStartDownloadReplyBody message.
         * @function verify
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileSyncStartDownloadReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.startedDownload != null && Object.hasOwnProperty.call(message, "startedDownload")) {
                var error = $root.file.FileSyncStartDownloadReplyBody.DownloadInfo.verify(message.startedDownload, long + 1);
                if (error)
                    return "startedDownload." + error;
            }
            return null;
        };

        /**
         * Creates a FileSyncStartDownloadReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileSyncStartDownloadReplyBody} FileSyncStartDownloadReplyBody
         */
        FileSyncStartDownloadReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.FileSyncStartDownloadReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.FileSyncStartDownloadReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.FileSyncStartDownloadReplyBody();
            if (object.startedDownload != null) {
                if (!$util.isObject(object.startedDownload))
                    throw TypeError(".file.FileSyncStartDownloadReplyBody.startedDownload: object expected");
                message.startedDownload = $root.file.FileSyncStartDownloadReplyBody.DownloadInfo.fromObject(object.startedDownload, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a FileSyncStartDownloadReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {file.FileSyncStartDownloadReplyBody} message FileSyncStartDownloadReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileSyncStartDownloadReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.startedDownload = null;
            if (message.startedDownload != null && Object.hasOwnProperty.call(message, "startedDownload"))
                object.startedDownload = $root.file.FileSyncStartDownloadReplyBody.DownloadInfo.toObject(message.startedDownload, options, q + 1);
            return object;
        };

        /**
         * Converts this FileSyncStartDownloadReplyBody to JSON.
         * @function toJSON
         * @memberof file.FileSyncStartDownloadReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileSyncStartDownloadReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileSyncStartDownloadReplyBody
         * @function getTypeUrl
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileSyncStartDownloadReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.FileSyncStartDownloadReplyBody";
        };

        FileSyncStartDownloadReplyBody.DownloadInfo = (function() {

            /**
             * Properties of a DownloadInfo.
             * @memberof file.FileSyncStartDownloadReplyBody
             * @interface IDownloadInfo
             * @property {number|Long|null} [downloadTaskId] DownloadInfo downloadTaskId
             */

            /**
             * Constructs a new DownloadInfo.
             * @memberof file.FileSyncStartDownloadReplyBody
             * @classdesc Represents a DownloadInfo.
             * @implements IDownloadInfo
             * @constructor
             * @param {file.FileSyncStartDownloadReplyBody.IDownloadInfo=} [properties] Properties to set
             */
            function DownloadInfo(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * DownloadInfo downloadTaskId.
             * @member {number|Long} downloadTaskId
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @instance
             */
            DownloadInfo.prototype.downloadTaskId = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

            /**
             * Creates a new DownloadInfo instance using the specified properties.
             * @function create
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {file.FileSyncStartDownloadReplyBody.IDownloadInfo=} [properties] Properties to set
             * @returns {file.FileSyncStartDownloadReplyBody.DownloadInfo} DownloadInfo instance
             */
            DownloadInfo.create = function create(properties) {
                return new DownloadInfo(properties);
            };

            /**
             * Encodes the specified DownloadInfo message. Does not implicitly {@link file.FileSyncStartDownloadReplyBody.DownloadInfo.verify|verify} messages.
             * @function encode
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {file.FileSyncStartDownloadReplyBody.IDownloadInfo} message DownloadInfo message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            DownloadInfo.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.downloadTaskId != null && Object.hasOwnProperty.call(message, "downloadTaskId"))
                    writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.downloadTaskId);
                return writer;
            };

            /**
             * Encodes the specified DownloadInfo message, length delimited. Does not implicitly {@link file.FileSyncStartDownloadReplyBody.DownloadInfo.verify|verify} messages.
             * @function encodeDelimited
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {file.FileSyncStartDownloadReplyBody.IDownloadInfo} message DownloadInfo message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            DownloadInfo.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes a DownloadInfo message from the specified reader or buffer.
             * @function decode
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {file.FileSyncStartDownloadReplyBody.DownloadInfo} DownloadInfo
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            DownloadInfo.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncStartDownloadReplyBody.DownloadInfo();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 2: {
                            message.downloadTaskId = reader.uint64();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a DownloadInfo message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {file.FileSyncStartDownloadReplyBody.DownloadInfo} DownloadInfo
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            DownloadInfo.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a DownloadInfo message.
             * @function verify
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            DownloadInfo.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.downloadTaskId != null && Object.hasOwnProperty.call(message, "downloadTaskId"))
                    if (!$util.isInteger(message.downloadTaskId) && !(message.downloadTaskId && $util.isInteger(message.downloadTaskId.low) && $util.isInteger(message.downloadTaskId.high)))
                        return "downloadTaskId: integer|Long expected";
                return null;
            };

            /**
             * Creates a DownloadInfo message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {file.FileSyncStartDownloadReplyBody.DownloadInfo} DownloadInfo
             */
            DownloadInfo.fromObject = function fromObject(object, long) {
                if (object instanceof $root.file.FileSyncStartDownloadReplyBody.DownloadInfo)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".file.FileSyncStartDownloadReplyBody.DownloadInfo: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.file.FileSyncStartDownloadReplyBody.DownloadInfo();
                if (object.downloadTaskId != null)
                    if ($util.Long)
                        message.downloadTaskId = $util.Long.fromValue(object.downloadTaskId, true);
                    else if (typeof object.downloadTaskId === "string")
                        message.downloadTaskId = parseInt(object.downloadTaskId, 10);
                    else if (typeof object.downloadTaskId === "number")
                        message.downloadTaskId = object.downloadTaskId;
                    else if (typeof object.downloadTaskId === "object")
                        message.downloadTaskId = new $util.LongBits(object.downloadTaskId.low >>> 0, object.downloadTaskId.high >>> 0).toNumber(true);
                return message;
            };

            /**
             * Creates a plain object from a DownloadInfo message. Also converts values to other types if specified.
             * @function toObject
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {file.FileSyncStartDownloadReplyBody.DownloadInfo} message DownloadInfo
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            DownloadInfo.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults)
                    if ($util.Long) {
                        var long = new $util.Long(0, 0, true);
                        object.downloadTaskId = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                    } else
                        object.downloadTaskId = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                if (message.downloadTaskId != null && Object.hasOwnProperty.call(message, "downloadTaskId"))
                    if (typeof BigInt !== "undefined" && options.longs === BigInt)
                        object.downloadTaskId = typeof message.downloadTaskId === "number" ? BigInt(message.downloadTaskId) : $util.Long.fromBits(message.downloadTaskId.low >>> 0, message.downloadTaskId.high >>> 0, true).toBigInt();
                    else if (typeof message.downloadTaskId === "number")
                        object.downloadTaskId = options.longs === String ? String(message.downloadTaskId) : message.downloadTaskId;
                    else
                        object.downloadTaskId = options.longs === String ? $util.Long.prototype.toString.call(message.downloadTaskId) : options.longs === Number ? new $util.LongBits(message.downloadTaskId.low >>> 0, message.downloadTaskId.high >>> 0).toNumber(true) : message.downloadTaskId;
                return object;
            };

            /**
             * Converts this DownloadInfo to JSON.
             * @function toJSON
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            DownloadInfo.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for DownloadInfo
             * @function getTypeUrl
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            DownloadInfo.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/file.FileSyncStartDownloadReplyBody.DownloadInfo";
            };

            return DownloadInfo;
        })();

        return FileSyncStartDownloadReplyBody;
    })();

    file.AdoptRemoteRequestBody = (function() {

        /**
         * Properties of an AdoptRemoteRequestBody.
         * @memberof file
         * @interface IAdoptRemoteRequestBody
         * @property {file.IOptionsToAdopteRemote|null} [opts] AdoptRemoteRequestBody opts
         */

        /**
         * Constructs a new AdoptRemoteRequestBody.
         * @memberof file
         * @classdesc Represents an AdoptRemoteRequestBody.
         * @implements IAdoptRemoteRequestBody
         * @constructor
         * @param {file.IAdoptRemoteRequestBody=} [properties] Properties to set
         */
        function AdoptRemoteRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * AdoptRemoteRequestBody opts.
         * @member {file.IOptionsToAdopteRemote|null|undefined} opts
         * @memberof file.AdoptRemoteRequestBody
         * @instance
         */
        AdoptRemoteRequestBody.prototype.opts = null;

        /**
         * Creates a new AdoptRemoteRequestBody instance using the specified properties.
         * @function create
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {file.IAdoptRemoteRequestBody=} [properties] Properties to set
         * @returns {file.AdoptRemoteRequestBody} AdoptRemoteRequestBody instance
         */
        AdoptRemoteRequestBody.create = function create(properties) {
            return new AdoptRemoteRequestBody(properties);
        };

        /**
         * Encodes the specified AdoptRemoteRequestBody message. Does not implicitly {@link file.AdoptRemoteRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {file.IAdoptRemoteRequestBody} message AdoptRemoteRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AdoptRemoteRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.file.OptionsToAdopteRemote.encode(message.opts, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified AdoptRemoteRequestBody message, length delimited. Does not implicitly {@link file.AdoptRemoteRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {file.IAdoptRemoteRequestBody} message AdoptRemoteRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AdoptRemoteRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an AdoptRemoteRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.AdoptRemoteRequestBody} AdoptRemoteRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AdoptRemoteRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.AdoptRemoteRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.opts = $root.file.OptionsToAdopteRemote.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an AdoptRemoteRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.AdoptRemoteRequestBody} AdoptRemoteRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AdoptRemoteRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an AdoptRemoteRequestBody message.
         * @function verify
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        AdoptRemoteRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts")) {
                var error = $root.file.OptionsToAdopteRemote.verify(message.opts, long + 1);
                if (error)
                    return "opts." + error;
            }
            return null;
        };

        /**
         * Creates an AdoptRemoteRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.AdoptRemoteRequestBody} AdoptRemoteRequestBody
         */
        AdoptRemoteRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.AdoptRemoteRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.AdoptRemoteRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.AdoptRemoteRequestBody();
            if (object.opts != null) {
                if (!$util.isObject(object.opts))
                    throw TypeError(".file.AdoptRemoteRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToAdopteRemote.fromObject(object.opts, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an AdoptRemoteRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {file.AdoptRemoteRequestBody} message AdoptRemoteRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        AdoptRemoteRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.opts = null;
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                object.opts = $root.file.OptionsToAdopteRemote.toObject(message.opts, options, q + 1);
            return object;
        };

        /**
         * Converts this AdoptRemoteRequestBody to JSON.
         * @function toJSON
         * @memberof file.AdoptRemoteRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        AdoptRemoteRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for AdoptRemoteRequestBody
         * @function getTypeUrl
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        AdoptRemoteRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.AdoptRemoteRequestBody";
        };

        return AdoptRemoteRequestBody;
    })();

    file.OptionsToAdopteRemote = (function() {

        /**
         * Properties of an OptionsToAdopteRemote.
         * @memberof file
         * @interface IOptionsToAdopteRemote
         * @property {common.IBooleanValue|null} [dropLocalVer] OptionsToAdopteRemote dropLocalVer
         * @property {common.IUInt64Value|null} [remoteVersion] OptionsToAdopteRemote remoteVersion
         */

        /**
         * Constructs a new OptionsToAdopteRemote.
         * @memberof file
         * @classdesc Represents an OptionsToAdopteRemote.
         * @implements IOptionsToAdopteRemote
         * @constructor
         * @param {file.IOptionsToAdopteRemote=} [properties] Properties to set
         */
        function OptionsToAdopteRemote(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * OptionsToAdopteRemote dropLocalVer.
         * @member {common.IBooleanValue|null|undefined} dropLocalVer
         * @memberof file.OptionsToAdopteRemote
         * @instance
         */
        OptionsToAdopteRemote.prototype.dropLocalVer = null;

        /**
         * OptionsToAdopteRemote remoteVersion.
         * @member {common.IUInt64Value|null|undefined} remoteVersion
         * @memberof file.OptionsToAdopteRemote
         * @instance
         */
        OptionsToAdopteRemote.prototype.remoteVersion = null;

        /**
         * Creates a new OptionsToAdopteRemote instance using the specified properties.
         * @function create
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {file.IOptionsToAdopteRemote=} [properties] Properties to set
         * @returns {file.OptionsToAdopteRemote} OptionsToAdopteRemote instance
         */
        OptionsToAdopteRemote.create = function create(properties) {
            return new OptionsToAdopteRemote(properties);
        };

        /**
         * Encodes the specified OptionsToAdopteRemote message. Does not implicitly {@link file.OptionsToAdopteRemote.verify|verify} messages.
         * @function encode
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {file.IOptionsToAdopteRemote} message OptionsToAdopteRemote message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        OptionsToAdopteRemote.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.dropLocalVer != null && Object.hasOwnProperty.call(message, "dropLocalVer"))
                $root.common.BooleanValue.encode(message.dropLocalVer, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified OptionsToAdopteRemote message, length delimited. Does not implicitly {@link file.OptionsToAdopteRemote.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {file.IOptionsToAdopteRemote} message OptionsToAdopteRemote message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        OptionsToAdopteRemote.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an OptionsToAdopteRemote message from the specified reader or buffer.
         * @function decode
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.OptionsToAdopteRemote} OptionsToAdopteRemote
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        OptionsToAdopteRemote.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.OptionsToAdopteRemote();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.dropLocalVer = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an OptionsToAdopteRemote message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.OptionsToAdopteRemote} OptionsToAdopteRemote
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        OptionsToAdopteRemote.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an OptionsToAdopteRemote message.
         * @function verify
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        OptionsToAdopteRemote.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.dropLocalVer != null && Object.hasOwnProperty.call(message, "dropLocalVer")) {
                var error = $root.common.BooleanValue.verify(message.dropLocalVer, long + 1);
                if (error)
                    return "dropLocalVer." + error;
            }
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion, long + 1);
                if (error)
                    return "remoteVersion." + error;
            }
            return null;
        };

        /**
         * Creates an OptionsToAdopteRemote message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.OptionsToAdopteRemote} OptionsToAdopteRemote
         */
        OptionsToAdopteRemote.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.OptionsToAdopteRemote)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.OptionsToAdopteRemote: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.OptionsToAdopteRemote();
            if (object.dropLocalVer != null) {
                if (!$util.isObject(object.dropLocalVer))
                    throw TypeError(".file.OptionsToAdopteRemote.dropLocalVer: object expected");
                message.dropLocalVer = $root.common.BooleanValue.fromObject(object.dropLocalVer, long + 1);
            }
            if (object.remoteVersion != null) {
                if (!$util.isObject(object.remoteVersion))
                    throw TypeError(".file.OptionsToAdopteRemote.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an OptionsToAdopteRemote message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {file.OptionsToAdopteRemote} message OptionsToAdopteRemote
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        OptionsToAdopteRemote.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.dropLocalVer = null;
                object.remoteVersion = null;
            }
            if (message.dropLocalVer != null && Object.hasOwnProperty.call(message, "dropLocalVer"))
                object.dropLocalVer = $root.common.BooleanValue.toObject(message.dropLocalVer, options, q + 1);
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options, q + 1);
            return object;
        };

        /**
         * Converts this OptionsToAdopteRemote to JSON.
         * @function toJSON
         * @memberof file.OptionsToAdopteRemote
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        OptionsToAdopteRemote.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for OptionsToAdopteRemote
         * @function getTypeUrl
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        OptionsToAdopteRemote.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.OptionsToAdopteRemote";
        };

        return OptionsToAdopteRemote;
    })();

    file.DiffCurrentAndRemoteRequestBody = (function() {

        /**
         * Properties of a DiffCurrentAndRemoteRequestBody.
         * @memberof file
         * @interface IDiffCurrentAndRemoteRequestBody
         * @property {file.IOptionsToDiffFileVersions|null} [opts] DiffCurrentAndRemoteRequestBody opts
         */

        /**
         * Constructs a new DiffCurrentAndRemoteRequestBody.
         * @memberof file
         * @classdesc Represents a DiffCurrentAndRemoteRequestBody.
         * @implements IDiffCurrentAndRemoteRequestBody
         * @constructor
         * @param {file.IDiffCurrentAndRemoteRequestBody=} [properties] Properties to set
         */
        function DiffCurrentAndRemoteRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * DiffCurrentAndRemoteRequestBody opts.
         * @member {file.IOptionsToDiffFileVersions|null|undefined} opts
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @instance
         */
        DiffCurrentAndRemoteRequestBody.prototype.opts = null;

        /**
         * Creates a new DiffCurrentAndRemoteRequestBody instance using the specified properties.
         * @function create
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {file.IDiffCurrentAndRemoteRequestBody=} [properties] Properties to set
         * @returns {file.DiffCurrentAndRemoteRequestBody} DiffCurrentAndRemoteRequestBody instance
         */
        DiffCurrentAndRemoteRequestBody.create = function create(properties) {
            return new DiffCurrentAndRemoteRequestBody(properties);
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteRequestBody message. Does not implicitly {@link file.DiffCurrentAndRemoteRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {file.IDiffCurrentAndRemoteRequestBody} message DiffCurrentAndRemoteRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.file.OptionsToDiffFileVersions.encode(message.opts, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteRequestBody message, length delimited. Does not implicitly {@link file.DiffCurrentAndRemoteRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {file.IDiffCurrentAndRemoteRequestBody} message DiffCurrentAndRemoteRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a DiffCurrentAndRemoteRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.DiffCurrentAndRemoteRequestBody} DiffCurrentAndRemoteRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.DiffCurrentAndRemoteRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.opts = $root.file.OptionsToDiffFileVersions.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a DiffCurrentAndRemoteRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.DiffCurrentAndRemoteRequestBody} DiffCurrentAndRemoteRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a DiffCurrentAndRemoteRequestBody message.
         * @function verify
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        DiffCurrentAndRemoteRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts")) {
                var error = $root.file.OptionsToDiffFileVersions.verify(message.opts, long + 1);
                if (error)
                    return "opts." + error;
            }
            return null;
        };

        /**
         * Creates a DiffCurrentAndRemoteRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.DiffCurrentAndRemoteRequestBody} DiffCurrentAndRemoteRequestBody
         */
        DiffCurrentAndRemoteRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.DiffCurrentAndRemoteRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.DiffCurrentAndRemoteRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.DiffCurrentAndRemoteRequestBody();
            if (object.opts != null) {
                if (!$util.isObject(object.opts))
                    throw TypeError(".file.DiffCurrentAndRemoteRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToDiffFileVersions.fromObject(object.opts, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a DiffCurrentAndRemoteRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {file.DiffCurrentAndRemoteRequestBody} message DiffCurrentAndRemoteRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        DiffCurrentAndRemoteRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.opts = null;
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                object.opts = $root.file.OptionsToDiffFileVersions.toObject(message.opts, options, q + 1);
            return object;
        };

        /**
         * Converts this DiffCurrentAndRemoteRequestBody to JSON.
         * @function toJSON
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        DiffCurrentAndRemoteRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for DiffCurrentAndRemoteRequestBody
         * @function getTypeUrl
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        DiffCurrentAndRemoteRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.DiffCurrentAndRemoteRequestBody";
        };

        return DiffCurrentAndRemoteRequestBody;
    })();

    file.DiffCurrentAndRemoteReplyBody = (function() {

        /**
         * Properties of a DiffCurrentAndRemoteReplyBody.
         * @memberof file
         * @interface IDiffCurrentAndRemoteReplyBody
         * @property {file.IFileDiff|null} [diff] DiffCurrentAndRemoteReplyBody diff
         */

        /**
         * Constructs a new DiffCurrentAndRemoteReplyBody.
         * @memberof file
         * @classdesc Represents a DiffCurrentAndRemoteReplyBody.
         * @implements IDiffCurrentAndRemoteReplyBody
         * @constructor
         * @param {file.IDiffCurrentAndRemoteReplyBody=} [properties] Properties to set
         */
        function DiffCurrentAndRemoteReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * DiffCurrentAndRemoteReplyBody diff.
         * @member {file.IFileDiff|null|undefined} diff
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @instance
         */
        DiffCurrentAndRemoteReplyBody.prototype.diff = null;

        /**
         * Creates a new DiffCurrentAndRemoteReplyBody instance using the specified properties.
         * @function create
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {file.IDiffCurrentAndRemoteReplyBody=} [properties] Properties to set
         * @returns {file.DiffCurrentAndRemoteReplyBody} DiffCurrentAndRemoteReplyBody instance
         */
        DiffCurrentAndRemoteReplyBody.create = function create(properties) {
            return new DiffCurrentAndRemoteReplyBody(properties);
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteReplyBody message. Does not implicitly {@link file.DiffCurrentAndRemoteReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {file.IDiffCurrentAndRemoteReplyBody} message DiffCurrentAndRemoteReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.diff != null && Object.hasOwnProperty.call(message, "diff"))
                $root.file.FileDiff.encode(message.diff, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteReplyBody message, length delimited. Does not implicitly {@link file.DiffCurrentAndRemoteReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {file.IDiffCurrentAndRemoteReplyBody} message DiffCurrentAndRemoteReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a DiffCurrentAndRemoteReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.DiffCurrentAndRemoteReplyBody} DiffCurrentAndRemoteReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.DiffCurrentAndRemoteReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.diff = $root.file.FileDiff.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a DiffCurrentAndRemoteReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.DiffCurrentAndRemoteReplyBody} DiffCurrentAndRemoteReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a DiffCurrentAndRemoteReplyBody message.
         * @function verify
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        DiffCurrentAndRemoteReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.diff != null && Object.hasOwnProperty.call(message, "diff")) {
                var error = $root.file.FileDiff.verify(message.diff, long + 1);
                if (error)
                    return "diff." + error;
            }
            return null;
        };

        /**
         * Creates a DiffCurrentAndRemoteReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.DiffCurrentAndRemoteReplyBody} DiffCurrentAndRemoteReplyBody
         */
        DiffCurrentAndRemoteReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.DiffCurrentAndRemoteReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.DiffCurrentAndRemoteReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.DiffCurrentAndRemoteReplyBody();
            if (object.diff != null) {
                if (!$util.isObject(object.diff))
                    throw TypeError(".file.DiffCurrentAndRemoteReplyBody.diff: object expected");
                message.diff = $root.file.FileDiff.fromObject(object.diff, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a DiffCurrentAndRemoteReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {file.DiffCurrentAndRemoteReplyBody} message DiffCurrentAndRemoteReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        DiffCurrentAndRemoteReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.diff = null;
            if (message.diff != null && Object.hasOwnProperty.call(message, "diff"))
                object.diff = $root.file.FileDiff.toObject(message.diff, options, q + 1);
            return object;
        };

        /**
         * Converts this DiffCurrentAndRemoteReplyBody to JSON.
         * @function toJSON
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        DiffCurrentAndRemoteReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for DiffCurrentAndRemoteReplyBody
         * @function getTypeUrl
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        DiffCurrentAndRemoteReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.DiffCurrentAndRemoteReplyBody";
        };

        return DiffCurrentAndRemoteReplyBody;
    })();

    file.OptionsToDiffFileVersions = (function() {

        /**
         * Properties of an OptionsToDiffFileVersions.
         * @memberof file
         * @interface IOptionsToDiffFileVersions
         * @property {common.IUInt64Value|null} [remoteVersion] OptionsToDiffFileVersions remoteVersion
         * @property {common.IBooleanValue|null} [compareContentIfSameMTime] OptionsToDiffFileVersions compareContentIfSameMTime
         */

        /**
         * Constructs a new OptionsToDiffFileVersions.
         * @memberof file
         * @classdesc Represents an OptionsToDiffFileVersions.
         * @implements IOptionsToDiffFileVersions
         * @constructor
         * @param {file.IOptionsToDiffFileVersions=} [properties] Properties to set
         */
        function OptionsToDiffFileVersions(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * OptionsToDiffFileVersions remoteVersion.
         * @member {common.IUInt64Value|null|undefined} remoteVersion
         * @memberof file.OptionsToDiffFileVersions
         * @instance
         */
        OptionsToDiffFileVersions.prototype.remoteVersion = null;

        /**
         * OptionsToDiffFileVersions compareContentIfSameMTime.
         * @member {common.IBooleanValue|null|undefined} compareContentIfSameMTime
         * @memberof file.OptionsToDiffFileVersions
         * @instance
         */
        OptionsToDiffFileVersions.prototype.compareContentIfSameMTime = null;

        /**
         * Creates a new OptionsToDiffFileVersions instance using the specified properties.
         * @function create
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {file.IOptionsToDiffFileVersions=} [properties] Properties to set
         * @returns {file.OptionsToDiffFileVersions} OptionsToDiffFileVersions instance
         */
        OptionsToDiffFileVersions.create = function create(properties) {
            return new OptionsToDiffFileVersions(properties);
        };

        /**
         * Encodes the specified OptionsToDiffFileVersions message. Does not implicitly {@link file.OptionsToDiffFileVersions.verify|verify} messages.
         * @function encode
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {file.IOptionsToDiffFileVersions} message OptionsToDiffFileVersions message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        OptionsToDiffFileVersions.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.compareContentIfSameMTime != null && Object.hasOwnProperty.call(message, "compareContentIfSameMTime"))
                $root.common.BooleanValue.encode(message.compareContentIfSameMTime, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified OptionsToDiffFileVersions message, length delimited. Does not implicitly {@link file.OptionsToDiffFileVersions.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {file.IOptionsToDiffFileVersions} message OptionsToDiffFileVersions message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        OptionsToDiffFileVersions.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an OptionsToDiffFileVersions message from the specified reader or buffer.
         * @function decode
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.OptionsToDiffFileVersions} OptionsToDiffFileVersions
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        OptionsToDiffFileVersions.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.OptionsToDiffFileVersions();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.compareContentIfSameMTime = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an OptionsToDiffFileVersions message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.OptionsToDiffFileVersions} OptionsToDiffFileVersions
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        OptionsToDiffFileVersions.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an OptionsToDiffFileVersions message.
         * @function verify
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        OptionsToDiffFileVersions.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion, long + 1);
                if (error)
                    return "remoteVersion." + error;
            }
            if (message.compareContentIfSameMTime != null && Object.hasOwnProperty.call(message, "compareContentIfSameMTime")) {
                var error = $root.common.BooleanValue.verify(message.compareContentIfSameMTime, long + 1);
                if (error)
                    return "compareContentIfSameMTime." + error;
            }
            return null;
        };

        /**
         * Creates an OptionsToDiffFileVersions message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.OptionsToDiffFileVersions} OptionsToDiffFileVersions
         */
        OptionsToDiffFileVersions.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.OptionsToDiffFileVersions)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.OptionsToDiffFileVersions: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.OptionsToDiffFileVersions();
            if (object.remoteVersion != null) {
                if (!$util.isObject(object.remoteVersion))
                    throw TypeError(".file.OptionsToDiffFileVersions.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion, long + 1);
            }
            if (object.compareContentIfSameMTime != null) {
                if (!$util.isObject(object.compareContentIfSameMTime))
                    throw TypeError(".file.OptionsToDiffFileVersions.compareContentIfSameMTime: object expected");
                message.compareContentIfSameMTime = $root.common.BooleanValue.fromObject(object.compareContentIfSameMTime, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an OptionsToDiffFileVersions message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {file.OptionsToDiffFileVersions} message OptionsToDiffFileVersions
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        OptionsToDiffFileVersions.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.remoteVersion = null;
                object.compareContentIfSameMTime = null;
            }
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options, q + 1);
            if (message.compareContentIfSameMTime != null && Object.hasOwnProperty.call(message, "compareContentIfSameMTime"))
                object.compareContentIfSameMTime = $root.common.BooleanValue.toObject(message.compareContentIfSameMTime, options, q + 1);
            return object;
        };

        /**
         * Converts this OptionsToDiffFileVersions to JSON.
         * @function toJSON
         * @memberof file.OptionsToDiffFileVersions
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        OptionsToDiffFileVersions.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for OptionsToDiffFileVersions
         * @function getTypeUrl
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        OptionsToDiffFileVersions.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.OptionsToDiffFileVersions";
        };

        return OptionsToDiffFileVersions;
    })();

    file.TimeStampsDiff = (function() {

        /**
         * Properties of a TimeStampsDiff.
         * @memberof file
         * @interface ITimeStampsDiff
         * @property {number|Long|null} [current] TimeStampsDiff current
         * @property {number|Long|null} [remote] TimeStampsDiff remote
         * @property {number|Long|null} [synced] TimeStampsDiff synced
         */

        /**
         * Constructs a new TimeStampsDiff.
         * @memberof file
         * @classdesc Represents a TimeStampsDiff.
         * @implements ITimeStampsDiff
         * @constructor
         * @param {file.ITimeStampsDiff=} [properties] Properties to set
         */
        function TimeStampsDiff(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * TimeStampsDiff current.
         * @member {number|Long} current
         * @memberof file.TimeStampsDiff
         * @instance
         */
        TimeStampsDiff.prototype.current = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * TimeStampsDiff remote.
         * @member {number|Long} remote
         * @memberof file.TimeStampsDiff
         * @instance
         */
        TimeStampsDiff.prototype.remote = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * TimeStampsDiff synced.
         * @member {number|Long} synced
         * @memberof file.TimeStampsDiff
         * @instance
         */
        TimeStampsDiff.prototype.synced = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new TimeStampsDiff instance using the specified properties.
         * @function create
         * @memberof file.TimeStampsDiff
         * @static
         * @param {file.ITimeStampsDiff=} [properties] Properties to set
         * @returns {file.TimeStampsDiff} TimeStampsDiff instance
         */
        TimeStampsDiff.create = function create(properties) {
            return new TimeStampsDiff(properties);
        };

        /**
         * Encodes the specified TimeStampsDiff message. Does not implicitly {@link file.TimeStampsDiff.verify|verify} messages.
         * @function encode
         * @memberof file.TimeStampsDiff
         * @static
         * @param {file.ITimeStampsDiff} message TimeStampsDiff message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        TimeStampsDiff.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.current);
            if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.remote);
            if (message.synced != null && Object.hasOwnProperty.call(message, "synced"))
                writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.synced);
            return writer;
        };

        /**
         * Encodes the specified TimeStampsDiff message, length delimited. Does not implicitly {@link file.TimeStampsDiff.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.TimeStampsDiff
         * @static
         * @param {file.ITimeStampsDiff} message TimeStampsDiff message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        TimeStampsDiff.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a TimeStampsDiff message from the specified reader or buffer.
         * @function decode
         * @memberof file.TimeStampsDiff
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.TimeStampsDiff} TimeStampsDiff
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        TimeStampsDiff.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.TimeStampsDiff();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.current = reader.uint64();
                        break;
                    }
                case 2: {
                        message.remote = reader.uint64();
                        break;
                    }
                case 3: {
                        message.synced = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a TimeStampsDiff message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.TimeStampsDiff
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.TimeStampsDiff} TimeStampsDiff
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        TimeStampsDiff.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a TimeStampsDiff message.
         * @function verify
         * @memberof file.TimeStampsDiff
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        TimeStampsDiff.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                if (!$util.isInteger(message.current) && !(message.current && $util.isInteger(message.current.low) && $util.isInteger(message.current.high)))
                    return "current: integer|Long expected";
            if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                if (!$util.isInteger(message.remote) && !(message.remote && $util.isInteger(message.remote.low) && $util.isInteger(message.remote.high)))
                    return "remote: integer|Long expected";
            if (message.synced != null && Object.hasOwnProperty.call(message, "synced"))
                if (!$util.isInteger(message.synced) && !(message.synced && $util.isInteger(message.synced.low) && $util.isInteger(message.synced.high)))
                    return "synced: integer|Long expected";
            return null;
        };

        /**
         * Creates a TimeStampsDiff message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.TimeStampsDiff
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.TimeStampsDiff} TimeStampsDiff
         */
        TimeStampsDiff.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.TimeStampsDiff)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.TimeStampsDiff: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.TimeStampsDiff();
            if (object.current != null)
                if ($util.Long)
                    message.current = $util.Long.fromValue(object.current, true);
                else if (typeof object.current === "string")
                    message.current = parseInt(object.current, 10);
                else if (typeof object.current === "number")
                    message.current = object.current;
                else if (typeof object.current === "object")
                    message.current = new $util.LongBits(object.current.low >>> 0, object.current.high >>> 0).toNumber(true);
            if (object.remote != null)
                if ($util.Long)
                    message.remote = $util.Long.fromValue(object.remote, true);
                else if (typeof object.remote === "string")
                    message.remote = parseInt(object.remote, 10);
                else if (typeof object.remote === "number")
                    message.remote = object.remote;
                else if (typeof object.remote === "object")
                    message.remote = new $util.LongBits(object.remote.low >>> 0, object.remote.high >>> 0).toNumber(true);
            if (object.synced != null)
                if ($util.Long)
                    message.synced = $util.Long.fromValue(object.synced, true);
                else if (typeof object.synced === "string")
                    message.synced = parseInt(object.synced, 10);
                else if (typeof object.synced === "number")
                    message.synced = object.synced;
                else if (typeof object.synced === "object")
                    message.synced = new $util.LongBits(object.synced.low >>> 0, object.synced.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from a TimeStampsDiff message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.TimeStampsDiff
         * @static
         * @param {file.TimeStampsDiff} message TimeStampsDiff
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        TimeStampsDiff.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.current = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.current = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.remote = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.remote = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.synced = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.synced = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            }
            if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.current = typeof message.current === "number" ? BigInt(message.current) : $util.Long.fromBits(message.current.low >>> 0, message.current.high >>> 0, true).toBigInt();
                else if (typeof message.current === "number")
                    object.current = options.longs === String ? String(message.current) : message.current;
                else
                    object.current = options.longs === String ? $util.Long.prototype.toString.call(message.current) : options.longs === Number ? new $util.LongBits(message.current.low >>> 0, message.current.high >>> 0).toNumber(true) : message.current;
            if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.remote = typeof message.remote === "number" ? BigInt(message.remote) : $util.Long.fromBits(message.remote.low >>> 0, message.remote.high >>> 0, true).toBigInt();
                else if (typeof message.remote === "number")
                    object.remote = options.longs === String ? String(message.remote) : message.remote;
                else
                    object.remote = options.longs === String ? $util.Long.prototype.toString.call(message.remote) : options.longs === Number ? new $util.LongBits(message.remote.low >>> 0, message.remote.high >>> 0).toNumber(true) : message.remote;
            if (message.synced != null && Object.hasOwnProperty.call(message, "synced"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.synced = typeof message.synced === "number" ? BigInt(message.synced) : $util.Long.fromBits(message.synced.low >>> 0, message.synced.high >>> 0, true).toBigInt();
                else if (typeof message.synced === "number")
                    object.synced = options.longs === String ? String(message.synced) : message.synced;
                else
                    object.synced = options.longs === String ? $util.Long.prototype.toString.call(message.synced) : options.longs === Number ? new $util.LongBits(message.synced.low >>> 0, message.synced.high >>> 0).toNumber(true) : message.synced;
            return object;
        };

        /**
         * Converts this TimeStampsDiff to JSON.
         * @function toJSON
         * @memberof file.TimeStampsDiff
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        TimeStampsDiff.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for TimeStampsDiff
         * @function getTypeUrl
         * @memberof file.TimeStampsDiff
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        TimeStampsDiff.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.TimeStampsDiff";
        };

        return TimeStampsDiff;
    })();

    file.XAttrDiff = (function() {

        /**
         * Properties of a XAttrDiff.
         * @memberof file
         * @interface IXAttrDiff
         * @property {string|null} [name] XAttrDiff name
         * @property {common.IStringValue|null} [addedIn] XAttrDiff addedIn
         * @property {common.IStringValue|null} [removedIn] XAttrDiff removedIn
         * @property {common.IStringValue|null} [changedIn] XAttrDiff changedIn
         */

        /**
         * Constructs a new XAttrDiff.
         * @memberof file
         * @classdesc Represents a XAttrDiff.
         * @implements IXAttrDiff
         * @constructor
         * @param {file.IXAttrDiff=} [properties] Properties to set
         */
        function XAttrDiff(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * XAttrDiff name.
         * @member {string} name
         * @memberof file.XAttrDiff
         * @instance
         */
        XAttrDiff.prototype.name = "";

        /**
         * XAttrDiff addedIn.
         * @member {common.IStringValue|null|undefined} addedIn
         * @memberof file.XAttrDiff
         * @instance
         */
        XAttrDiff.prototype.addedIn = null;

        /**
         * XAttrDiff removedIn.
         * @member {common.IStringValue|null|undefined} removedIn
         * @memberof file.XAttrDiff
         * @instance
         */
        XAttrDiff.prototype.removedIn = null;

        /**
         * XAttrDiff changedIn.
         * @member {common.IStringValue|null|undefined} changedIn
         * @memberof file.XAttrDiff
         * @instance
         */
        XAttrDiff.prototype.changedIn = null;

        /**
         * Creates a new XAttrDiff instance using the specified properties.
         * @function create
         * @memberof file.XAttrDiff
         * @static
         * @param {file.IXAttrDiff=} [properties] Properties to set
         * @returns {file.XAttrDiff} XAttrDiff instance
         */
        XAttrDiff.create = function create(properties) {
            return new XAttrDiff(properties);
        };

        /**
         * Encodes the specified XAttrDiff message. Does not implicitly {@link file.XAttrDiff.verify|verify} messages.
         * @function encode
         * @memberof file.XAttrDiff
         * @static
         * @param {file.IXAttrDiff} message XAttrDiff message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        XAttrDiff.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
            if (message.addedIn != null && Object.hasOwnProperty.call(message, "addedIn"))
                $root.common.StringValue.encode(message.addedIn, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.removedIn != null && Object.hasOwnProperty.call(message, "removedIn"))
                $root.common.StringValue.encode(message.removedIn, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.changedIn != null && Object.hasOwnProperty.call(message, "changedIn"))
                $root.common.StringValue.encode(message.changedIn, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified XAttrDiff message, length delimited. Does not implicitly {@link file.XAttrDiff.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.XAttrDiff
         * @static
         * @param {file.IXAttrDiff} message XAttrDiff message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        XAttrDiff.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a XAttrDiff message from the specified reader or buffer.
         * @function decode
         * @memberof file.XAttrDiff
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.XAttrDiff} XAttrDiff
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        XAttrDiff.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.XAttrDiff();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.name = reader.string();
                        break;
                    }
                case 2: {
                        message.addedIn = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.removedIn = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.changedIn = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a XAttrDiff message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.XAttrDiff
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.XAttrDiff} XAttrDiff
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        XAttrDiff.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a XAttrDiff message.
         * @function verify
         * @memberof file.XAttrDiff
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        XAttrDiff.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.addedIn != null && Object.hasOwnProperty.call(message, "addedIn")) {
                var error = $root.common.StringValue.verify(message.addedIn, long + 1);
                if (error)
                    return "addedIn." + error;
            }
            if (message.removedIn != null && Object.hasOwnProperty.call(message, "removedIn")) {
                var error = $root.common.StringValue.verify(message.removedIn, long + 1);
                if (error)
                    return "removedIn." + error;
            }
            if (message.changedIn != null && Object.hasOwnProperty.call(message, "changedIn")) {
                var error = $root.common.StringValue.verify(message.changedIn, long + 1);
                if (error)
                    return "changedIn." + error;
            }
            return null;
        };

        /**
         * Creates a XAttrDiff message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.XAttrDiff
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.XAttrDiff} XAttrDiff
         */
        XAttrDiff.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.XAttrDiff)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.XAttrDiff: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.XAttrDiff();
            if (object.name != null)
                message.name = String(object.name);
            if (object.addedIn != null) {
                if (!$util.isObject(object.addedIn))
                    throw TypeError(".file.XAttrDiff.addedIn: object expected");
                message.addedIn = $root.common.StringValue.fromObject(object.addedIn, long + 1);
            }
            if (object.removedIn != null) {
                if (!$util.isObject(object.removedIn))
                    throw TypeError(".file.XAttrDiff.removedIn: object expected");
                message.removedIn = $root.common.StringValue.fromObject(object.removedIn, long + 1);
            }
            if (object.changedIn != null) {
                if (!$util.isObject(object.changedIn))
                    throw TypeError(".file.XAttrDiff.changedIn: object expected");
                message.changedIn = $root.common.StringValue.fromObject(object.changedIn, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a XAttrDiff message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.XAttrDiff
         * @static
         * @param {file.XAttrDiff} message XAttrDiff
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        XAttrDiff.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.name = "";
                object.addedIn = null;
                object.removedIn = null;
                object.changedIn = null;
            }
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                object.name = message.name;
            if (message.addedIn != null && Object.hasOwnProperty.call(message, "addedIn"))
                object.addedIn = $root.common.StringValue.toObject(message.addedIn, options, q + 1);
            if (message.removedIn != null && Object.hasOwnProperty.call(message, "removedIn"))
                object.removedIn = $root.common.StringValue.toObject(message.removedIn, options, q + 1);
            if (message.changedIn != null && Object.hasOwnProperty.call(message, "changedIn"))
                object.changedIn = $root.common.StringValue.toObject(message.changedIn, options, q + 1);
            return object;
        };

        /**
         * Converts this XAttrDiff to JSON.
         * @function toJSON
         * @memberof file.XAttrDiff
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        XAttrDiff.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for XAttrDiff
         * @function getTypeUrl
         * @memberof file.XAttrDiff
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        XAttrDiff.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.XAttrDiff";
        };

        return XAttrDiff;
    })();

    file.FileDiff = (function() {

        /**
         * Properties of a FileDiff.
         * @memberof file
         * @interface IFileDiff
         * @property {number|Long|null} [currentVersion] FileDiff currentVersion
         * @property {boolean|null} [isCurrentLocal] FileDiff isCurrentLocal
         * @property {common.IUInt64Value|null} [remoteVersion] FileDiff remoteVersion
         * @property {common.IUInt64Value|null} [syncedVersion] FileDiff syncedVersion
         * @property {boolean|null} [isRemoteRemoved] FileDiff isRemoteRemoved
         * @property {file.ITimeStampsDiff|null} [ctime] FileDiff ctime
         * @property {file.ITimeStampsDiff|null} [mtime] FileDiff mtime
         * @property {Array.<file.IXAttrDiff>|null} [xattrs] FileDiff xattrs
         * @property {boolean|null} [areContentsSame] FileDiff areContentsSame
         * @property {file.FileDiff.ISize|null} [size] FileDiff size
         */

        /**
         * Constructs a new FileDiff.
         * @memberof file
         * @classdesc Represents a FileDiff.
         * @implements IFileDiff
         * @constructor
         * @param {file.IFileDiff=} [properties] Properties to set
         */
        function FileDiff(properties) {
            this.xattrs = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileDiff currentVersion.
         * @member {number|Long} currentVersion
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.currentVersion = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * FileDiff isCurrentLocal.
         * @member {boolean} isCurrentLocal
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.isCurrentLocal = false;

        /**
         * FileDiff remoteVersion.
         * @member {common.IUInt64Value|null|undefined} remoteVersion
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.remoteVersion = null;

        /**
         * FileDiff syncedVersion.
         * @member {common.IUInt64Value|null|undefined} syncedVersion
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.syncedVersion = null;

        /**
         * FileDiff isRemoteRemoved.
         * @member {boolean} isRemoteRemoved
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.isRemoteRemoved = false;

        /**
         * FileDiff ctime.
         * @member {file.ITimeStampsDiff|null|undefined} ctime
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.ctime = null;

        /**
         * FileDiff mtime.
         * @member {file.ITimeStampsDiff|null|undefined} mtime
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.mtime = null;

        /**
         * FileDiff xattrs.
         * @member {Array.<file.IXAttrDiff>} xattrs
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.xattrs = $util.emptyArray;

        /**
         * FileDiff areContentsSame.
         * @member {boolean} areContentsSame
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.areContentsSame = false;

        /**
         * FileDiff size.
         * @member {file.FileDiff.ISize|null|undefined} size
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.size = null;

        /**
         * Creates a new FileDiff instance using the specified properties.
         * @function create
         * @memberof file.FileDiff
         * @static
         * @param {file.IFileDiff=} [properties] Properties to set
         * @returns {file.FileDiff} FileDiff instance
         */
        FileDiff.create = function create(properties) {
            return new FileDiff(properties);
        };

        /**
         * Encodes the specified FileDiff message. Does not implicitly {@link file.FileDiff.verify|verify} messages.
         * @function encode
         * @memberof file.FileDiff
         * @static
         * @param {file.IFileDiff} message FileDiff message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileDiff.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.currentVersion);
            if (message.isCurrentLocal != null && Object.hasOwnProperty.call(message, "isCurrentLocal"))
                writer.uint32(/* id 2, wireType 0 =*/16).bool(message.isCurrentLocal);
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.syncedVersion != null && Object.hasOwnProperty.call(message, "syncedVersion"))
                $root.common.UInt64Value.encode(message.syncedVersion, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            if (message.isRemoteRemoved != null && Object.hasOwnProperty.call(message, "isRemoteRemoved"))
                writer.uint32(/* id 5, wireType 0 =*/40).bool(message.isRemoteRemoved);
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime"))
                $root.file.TimeStampsDiff.encode(message.ctime, writer.uint32(/* id 6, wireType 2 =*/50).fork(), q + 1).ldelim();
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime"))
                $root.file.TimeStampsDiff.encode(message.mtime, writer.uint32(/* id 7, wireType 2 =*/58).fork(), q + 1).ldelim();
            if (message.xattrs != null && message.xattrs.length)
                for (var i = 0; i < message.xattrs.length; ++i)
                    $root.file.XAttrDiff.encode(message.xattrs[i], writer.uint32(/* id 8, wireType 2 =*/66).fork(), q + 1).ldelim();
            if (message.areContentsSame != null && Object.hasOwnProperty.call(message, "areContentsSame"))
                writer.uint32(/* id 11, wireType 0 =*/88).bool(message.areContentsSame);
            if (message.size != null && Object.hasOwnProperty.call(message, "size"))
                $root.file.FileDiff.Size.encode(message.size, writer.uint32(/* id 12, wireType 2 =*/98).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FileDiff message, length delimited. Does not implicitly {@link file.FileDiff.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.FileDiff
         * @static
         * @param {file.IFileDiff} message FileDiff message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileDiff.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileDiff message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileDiff
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileDiff} FileDiff
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileDiff.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileDiff();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.currentVersion = reader.uint64();
                        break;
                    }
                case 2: {
                        message.isCurrentLocal = reader.bool();
                        break;
                    }
                case 3: {
                        message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.syncedVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 5: {
                        message.isRemoteRemoved = reader.bool();
                        break;
                    }
                case 6: {
                        message.ctime = $root.file.TimeStampsDiff.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 7: {
                        message.mtime = $root.file.TimeStampsDiff.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 8: {
                        if (!(message.xattrs && message.xattrs.length))
                            message.xattrs = [];
                        message.xattrs.push($root.file.XAttrDiff.decode(reader, reader.uint32(), undefined, long + 1));
                        break;
                    }
                case 11: {
                        message.areContentsSame = reader.bool();
                        break;
                    }
                case 12: {
                        message.size = $root.file.FileDiff.Size.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileDiff message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.FileDiff
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.FileDiff} FileDiff
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileDiff.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileDiff message.
         * @function verify
         * @memberof file.FileDiff
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileDiff.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                if (!$util.isInteger(message.currentVersion) && !(message.currentVersion && $util.isInteger(message.currentVersion.low) && $util.isInteger(message.currentVersion.high)))
                    return "currentVersion: integer|Long expected";
            if (message.isCurrentLocal != null && Object.hasOwnProperty.call(message, "isCurrentLocal"))
                if (typeof message.isCurrentLocal !== "boolean")
                    return "isCurrentLocal: boolean expected";
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion, long + 1);
                if (error)
                    return "remoteVersion." + error;
            }
            if (message.syncedVersion != null && Object.hasOwnProperty.call(message, "syncedVersion")) {
                var error = $root.common.UInt64Value.verify(message.syncedVersion, long + 1);
                if (error)
                    return "syncedVersion." + error;
            }
            if (message.isRemoteRemoved != null && Object.hasOwnProperty.call(message, "isRemoteRemoved"))
                if (typeof message.isRemoteRemoved !== "boolean")
                    return "isRemoteRemoved: boolean expected";
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime")) {
                var error = $root.file.TimeStampsDiff.verify(message.ctime, long + 1);
                if (error)
                    return "ctime." + error;
            }
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime")) {
                var error = $root.file.TimeStampsDiff.verify(message.mtime, long + 1);
                if (error)
                    return "mtime." + error;
            }
            if (message.xattrs != null && Object.hasOwnProperty.call(message, "xattrs")) {
                if (!Array.isArray(message.xattrs))
                    return "xattrs: array expected";
                for (var i = 0; i < message.xattrs.length; ++i) {
                    var error = $root.file.XAttrDiff.verify(message.xattrs[i], long + 1);
                    if (error)
                        return "xattrs." + error;
                }
            }
            if (message.areContentsSame != null && Object.hasOwnProperty.call(message, "areContentsSame"))
                if (typeof message.areContentsSame !== "boolean")
                    return "areContentsSame: boolean expected";
            if (message.size != null && Object.hasOwnProperty.call(message, "size")) {
                var error = $root.file.FileDiff.Size.verify(message.size, long + 1);
                if (error)
                    return "size." + error;
            }
            return null;
        };

        /**
         * Creates a FileDiff message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileDiff
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileDiff} FileDiff
         */
        FileDiff.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.FileDiff)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.FileDiff: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.FileDiff();
            if (object.currentVersion != null)
                if ($util.Long)
                    message.currentVersion = $util.Long.fromValue(object.currentVersion, true);
                else if (typeof object.currentVersion === "string")
                    message.currentVersion = parseInt(object.currentVersion, 10);
                else if (typeof object.currentVersion === "number")
                    message.currentVersion = object.currentVersion;
                else if (typeof object.currentVersion === "object")
                    message.currentVersion = new $util.LongBits(object.currentVersion.low >>> 0, object.currentVersion.high >>> 0).toNumber(true);
            if (object.isCurrentLocal != null)
                message.isCurrentLocal = Boolean(object.isCurrentLocal);
            if (object.remoteVersion != null) {
                if (!$util.isObject(object.remoteVersion))
                    throw TypeError(".file.FileDiff.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion, long + 1);
            }
            if (object.syncedVersion != null) {
                if (!$util.isObject(object.syncedVersion))
                    throw TypeError(".file.FileDiff.syncedVersion: object expected");
                message.syncedVersion = $root.common.UInt64Value.fromObject(object.syncedVersion, long + 1);
            }
            if (object.isRemoteRemoved != null)
                message.isRemoteRemoved = Boolean(object.isRemoteRemoved);
            if (object.ctime != null) {
                if (!$util.isObject(object.ctime))
                    throw TypeError(".file.FileDiff.ctime: object expected");
                message.ctime = $root.file.TimeStampsDiff.fromObject(object.ctime, long + 1);
            }
            if (object.mtime != null) {
                if (!$util.isObject(object.mtime))
                    throw TypeError(".file.FileDiff.mtime: object expected");
                message.mtime = $root.file.TimeStampsDiff.fromObject(object.mtime, long + 1);
            }
            if (object.xattrs) {
                if (!Array.isArray(object.xattrs))
                    throw TypeError(".file.FileDiff.xattrs: array expected");
                message.xattrs = [];
                for (var i = 0; i < object.xattrs.length; ++i) {
                    if (!$util.isObject(object.xattrs[i]))
                        throw TypeError(".file.FileDiff.xattrs: object expected");
                    message.xattrs[i] = $root.file.XAttrDiff.fromObject(object.xattrs[i], long + 1);
                }
            }
            if (object.areContentsSame != null)
                message.areContentsSame = Boolean(object.areContentsSame);
            if (object.size != null) {
                if (!$util.isObject(object.size))
                    throw TypeError(".file.FileDiff.size: object expected");
                message.size = $root.file.FileDiff.Size.fromObject(object.size, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a FileDiff message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileDiff
         * @static
         * @param {file.FileDiff} message FileDiff
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileDiff.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.xattrs = [];
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.currentVersion = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.currentVersion = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.isCurrentLocal = false;
                object.remoteVersion = null;
                object.syncedVersion = null;
                object.isRemoteRemoved = false;
                object.ctime = null;
                object.mtime = null;
                object.areContentsSame = false;
                object.size = null;
            }
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.currentVersion = typeof message.currentVersion === "number" ? BigInt(message.currentVersion) : $util.Long.fromBits(message.currentVersion.low >>> 0, message.currentVersion.high >>> 0, true).toBigInt();
                else if (typeof message.currentVersion === "number")
                    object.currentVersion = options.longs === String ? String(message.currentVersion) : message.currentVersion;
                else
                    object.currentVersion = options.longs === String ? $util.Long.prototype.toString.call(message.currentVersion) : options.longs === Number ? new $util.LongBits(message.currentVersion.low >>> 0, message.currentVersion.high >>> 0).toNumber(true) : message.currentVersion;
            if (message.isCurrentLocal != null && Object.hasOwnProperty.call(message, "isCurrentLocal"))
                object.isCurrentLocal = message.isCurrentLocal;
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options, q + 1);
            if (message.syncedVersion != null && Object.hasOwnProperty.call(message, "syncedVersion"))
                object.syncedVersion = $root.common.UInt64Value.toObject(message.syncedVersion, options, q + 1);
            if (message.isRemoteRemoved != null && Object.hasOwnProperty.call(message, "isRemoteRemoved"))
                object.isRemoteRemoved = message.isRemoteRemoved;
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime"))
                object.ctime = $root.file.TimeStampsDiff.toObject(message.ctime, options, q + 1);
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime"))
                object.mtime = $root.file.TimeStampsDiff.toObject(message.mtime, options, q + 1);
            if (message.xattrs && message.xattrs.length) {
                object.xattrs = [];
                for (var j = 0; j < message.xattrs.length; ++j)
                    object.xattrs[j] = $root.file.XAttrDiff.toObject(message.xattrs[j], options, q + 1);
            }
            if (message.areContentsSame != null && Object.hasOwnProperty.call(message, "areContentsSame"))
                object.areContentsSame = message.areContentsSame;
            if (message.size != null && Object.hasOwnProperty.call(message, "size"))
                object.size = $root.file.FileDiff.Size.toObject(message.size, options, q + 1);
            return object;
        };

        /**
         * Converts this FileDiff to JSON.
         * @function toJSON
         * @memberof file.FileDiff
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileDiff.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileDiff
         * @function getTypeUrl
         * @memberof file.FileDiff
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileDiff.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.FileDiff";
        };

        FileDiff.Size = (function() {

            /**
             * Properties of a Size.
             * @memberof file.FileDiff
             * @interface ISize
             * @property {number|Long|null} [current] Size current
             * @property {number|Long|null} [remote] Size remote
             */

            /**
             * Constructs a new Size.
             * @memberof file.FileDiff
             * @classdesc Represents a Size.
             * @implements ISize
             * @constructor
             * @param {file.FileDiff.ISize=} [properties] Properties to set
             */
            function Size(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * Size current.
             * @member {number|Long} current
             * @memberof file.FileDiff.Size
             * @instance
             */
            Size.prototype.current = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

            /**
             * Size remote.
             * @member {number|Long} remote
             * @memberof file.FileDiff.Size
             * @instance
             */
            Size.prototype.remote = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

            /**
             * Creates a new Size instance using the specified properties.
             * @function create
             * @memberof file.FileDiff.Size
             * @static
             * @param {file.FileDiff.ISize=} [properties] Properties to set
             * @returns {file.FileDiff.Size} Size instance
             */
            Size.create = function create(properties) {
                return new Size(properties);
            };

            /**
             * Encodes the specified Size message. Does not implicitly {@link file.FileDiff.Size.verify|verify} messages.
             * @function encode
             * @memberof file.FileDiff.Size
             * @static
             * @param {file.FileDiff.ISize} message Size message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Size.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                    writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.current);
                if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                    writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.remote);
                return writer;
            };

            /**
             * Encodes the specified Size message, length delimited. Does not implicitly {@link file.FileDiff.Size.verify|verify} messages.
             * @function encodeDelimited
             * @memberof file.FileDiff.Size
             * @static
             * @param {file.FileDiff.ISize} message Size message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Size.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes a Size message from the specified reader or buffer.
             * @function decode
             * @memberof file.FileDiff.Size
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {file.FileDiff.Size} Size
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Size.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileDiff.Size();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.current = reader.uint64();
                            break;
                        }
                    case 2: {
                            message.remote = reader.uint64();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a Size message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof file.FileDiff.Size
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {file.FileDiff.Size} Size
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Size.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a Size message.
             * @function verify
             * @memberof file.FileDiff.Size
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            Size.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                    if (!$util.isInteger(message.current) && !(message.current && $util.isInteger(message.current.low) && $util.isInteger(message.current.high)))
                        return "current: integer|Long expected";
                if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                    if (!$util.isInteger(message.remote) && !(message.remote && $util.isInteger(message.remote.low) && $util.isInteger(message.remote.high)))
                        return "remote: integer|Long expected";
                return null;
            };

            /**
             * Creates a Size message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof file.FileDiff.Size
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {file.FileDiff.Size} Size
             */
            Size.fromObject = function fromObject(object, long) {
                if (object instanceof $root.file.FileDiff.Size)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".file.FileDiff.Size: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.file.FileDiff.Size();
                if (object.current != null)
                    if ($util.Long)
                        message.current = $util.Long.fromValue(object.current, true);
                    else if (typeof object.current === "string")
                        message.current = parseInt(object.current, 10);
                    else if (typeof object.current === "number")
                        message.current = object.current;
                    else if (typeof object.current === "object")
                        message.current = new $util.LongBits(object.current.low >>> 0, object.current.high >>> 0).toNumber(true);
                if (object.remote != null)
                    if ($util.Long)
                        message.remote = $util.Long.fromValue(object.remote, true);
                    else if (typeof object.remote === "string")
                        message.remote = parseInt(object.remote, 10);
                    else if (typeof object.remote === "number")
                        message.remote = object.remote;
                    else if (typeof object.remote === "object")
                        message.remote = new $util.LongBits(object.remote.low >>> 0, object.remote.high >>> 0).toNumber(true);
                return message;
            };

            /**
             * Creates a plain object from a Size message. Also converts values to other types if specified.
             * @function toObject
             * @memberof file.FileDiff.Size
             * @static
             * @param {file.FileDiff.Size} message Size
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            Size.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults) {
                    if ($util.Long) {
                        var long = new $util.Long(0, 0, true);
                        object.current = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                    } else
                        object.current = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                    if ($util.Long) {
                        var long = new $util.Long(0, 0, true);
                        object.remote = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                    } else
                        object.remote = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                }
                if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                    if (typeof BigInt !== "undefined" && options.longs === BigInt)
                        object.current = typeof message.current === "number" ? BigInt(message.current) : $util.Long.fromBits(message.current.low >>> 0, message.current.high >>> 0, true).toBigInt();
                    else if (typeof message.current === "number")
                        object.current = options.longs === String ? String(message.current) : message.current;
                    else
                        object.current = options.longs === String ? $util.Long.prototype.toString.call(message.current) : options.longs === Number ? new $util.LongBits(message.current.low >>> 0, message.current.high >>> 0).toNumber(true) : message.current;
                if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                    if (typeof BigInt !== "undefined" && options.longs === BigInt)
                        object.remote = typeof message.remote === "number" ? BigInt(message.remote) : $util.Long.fromBits(message.remote.low >>> 0, message.remote.high >>> 0, true).toBigInt();
                    else if (typeof message.remote === "number")
                        object.remote = options.longs === String ? String(message.remote) : message.remote;
                    else
                        object.remote = options.longs === String ? $util.Long.prototype.toString.call(message.remote) : options.longs === Number ? new $util.LongBits(message.remote.low >>> 0, message.remote.high >>> 0).toNumber(true) : message.remote;
                return object;
            };

            /**
             * Converts this Size to JSON.
             * @function toJSON
             * @memberof file.FileDiff.Size
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            Size.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for Size
             * @function getTypeUrl
             * @memberof file.FileDiff.Size
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            Size.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/file.FileDiff.Size";
            };

            return Size;
        })();

        return FileDiff;
    })();

    file.FileSyncUploadRequestBody = (function() {

        /**
         * Properties of a FileSyncUploadRequestBody.
         * @memberof file
         * @interface IFileSyncUploadRequestBody
         * @property {file.IOptionsToUploadLocal|null} [opts] FileSyncUploadRequestBody opts
         */

        /**
         * Constructs a new FileSyncUploadRequestBody.
         * @memberof file
         * @classdesc Represents a FileSyncUploadRequestBody.
         * @implements IFileSyncUploadRequestBody
         * @constructor
         * @param {file.IFileSyncUploadRequestBody=} [properties] Properties to set
         */
        function FileSyncUploadRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileSyncUploadRequestBody opts.
         * @member {file.IOptionsToUploadLocal|null|undefined} opts
         * @memberof file.FileSyncUploadRequestBody
         * @instance
         */
        FileSyncUploadRequestBody.prototype.opts = null;

        /**
         * Creates a new FileSyncUploadRequestBody instance using the specified properties.
         * @function create
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {file.IFileSyncUploadRequestBody=} [properties] Properties to set
         * @returns {file.FileSyncUploadRequestBody} FileSyncUploadRequestBody instance
         */
        FileSyncUploadRequestBody.create = function create(properties) {
            return new FileSyncUploadRequestBody(properties);
        };

        /**
         * Encodes the specified FileSyncUploadRequestBody message. Does not implicitly {@link file.FileSyncUploadRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {file.IFileSyncUploadRequestBody} message FileSyncUploadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncUploadRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.file.OptionsToUploadLocal.encode(message.opts, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FileSyncUploadRequestBody message, length delimited. Does not implicitly {@link file.FileSyncUploadRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {file.IFileSyncUploadRequestBody} message FileSyncUploadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncUploadRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileSyncUploadRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileSyncUploadRequestBody} FileSyncUploadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncUploadRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncUploadRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.opts = $root.file.OptionsToUploadLocal.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileSyncUploadRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.FileSyncUploadRequestBody} FileSyncUploadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncUploadRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileSyncUploadRequestBody message.
         * @function verify
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileSyncUploadRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts")) {
                var error = $root.file.OptionsToUploadLocal.verify(message.opts, long + 1);
                if (error)
                    return "opts." + error;
            }
            return null;
        };

        /**
         * Creates a FileSyncUploadRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileSyncUploadRequestBody} FileSyncUploadRequestBody
         */
        FileSyncUploadRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.FileSyncUploadRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.FileSyncUploadRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.FileSyncUploadRequestBody();
            if (object.opts != null) {
                if (!$util.isObject(object.opts))
                    throw TypeError(".file.FileSyncUploadRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToUploadLocal.fromObject(object.opts, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a FileSyncUploadRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {file.FileSyncUploadRequestBody} message FileSyncUploadRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileSyncUploadRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.opts = null;
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                object.opts = $root.file.OptionsToUploadLocal.toObject(message.opts, options, q + 1);
            return object;
        };

        /**
         * Converts this FileSyncUploadRequestBody to JSON.
         * @function toJSON
         * @memberof file.FileSyncUploadRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileSyncUploadRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileSyncUploadRequestBody
         * @function getTypeUrl
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileSyncUploadRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.FileSyncUploadRequestBody";
        };

        return FileSyncUploadRequestBody;
    })();

    file.FileSyncUploadReplyBody = (function() {

        /**
         * Properties of a FileSyncUploadReplyBody.
         * @memberof file
         * @interface IFileSyncUploadReplyBody
         * @property {common.IUInt64Value|null} [uploadedVersion] FileSyncUploadReplyBody uploadedVersion
         */

        /**
         * Constructs a new FileSyncUploadReplyBody.
         * @memberof file
         * @classdesc Represents a FileSyncUploadReplyBody.
         * @implements IFileSyncUploadReplyBody
         * @constructor
         * @param {file.IFileSyncUploadReplyBody=} [properties] Properties to set
         */
        function FileSyncUploadReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileSyncUploadReplyBody uploadedVersion.
         * @member {common.IUInt64Value|null|undefined} uploadedVersion
         * @memberof file.FileSyncUploadReplyBody
         * @instance
         */
        FileSyncUploadReplyBody.prototype.uploadedVersion = null;

        /**
         * Creates a new FileSyncUploadReplyBody instance using the specified properties.
         * @function create
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {file.IFileSyncUploadReplyBody=} [properties] Properties to set
         * @returns {file.FileSyncUploadReplyBody} FileSyncUploadReplyBody instance
         */
        FileSyncUploadReplyBody.create = function create(properties) {
            return new FileSyncUploadReplyBody(properties);
        };

        /**
         * Encodes the specified FileSyncUploadReplyBody message. Does not implicitly {@link file.FileSyncUploadReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {file.IFileSyncUploadReplyBody} message FileSyncUploadReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncUploadReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.uploadedVersion != null && Object.hasOwnProperty.call(message, "uploadedVersion"))
                $root.common.UInt64Value.encode(message.uploadedVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FileSyncUploadReplyBody message, length delimited. Does not implicitly {@link file.FileSyncUploadReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {file.IFileSyncUploadReplyBody} message FileSyncUploadReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncUploadReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileSyncUploadReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileSyncUploadReplyBody} FileSyncUploadReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncUploadReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncUploadReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.uploadedVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileSyncUploadReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.FileSyncUploadReplyBody} FileSyncUploadReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncUploadReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileSyncUploadReplyBody message.
         * @function verify
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileSyncUploadReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.uploadedVersion != null && Object.hasOwnProperty.call(message, "uploadedVersion")) {
                var error = $root.common.UInt64Value.verify(message.uploadedVersion, long + 1);
                if (error)
                    return "uploadedVersion." + error;
            }
            return null;
        };

        /**
         * Creates a FileSyncUploadReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileSyncUploadReplyBody} FileSyncUploadReplyBody
         */
        FileSyncUploadReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.FileSyncUploadReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.FileSyncUploadReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.FileSyncUploadReplyBody();
            if (object.uploadedVersion != null) {
                if (!$util.isObject(object.uploadedVersion))
                    throw TypeError(".file.FileSyncUploadReplyBody.uploadedVersion: object expected");
                message.uploadedVersion = $root.common.UInt64Value.fromObject(object.uploadedVersion, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a FileSyncUploadReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {file.FileSyncUploadReplyBody} message FileSyncUploadReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileSyncUploadReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.uploadedVersion = null;
            if (message.uploadedVersion != null && Object.hasOwnProperty.call(message, "uploadedVersion"))
                object.uploadedVersion = $root.common.UInt64Value.toObject(message.uploadedVersion, options, q + 1);
            return object;
        };

        /**
         * Converts this FileSyncUploadReplyBody to JSON.
         * @function toJSON
         * @memberof file.FileSyncUploadReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileSyncUploadReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileSyncUploadReplyBody
         * @function getTypeUrl
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileSyncUploadReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.FileSyncUploadReplyBody";
        };

        return FileSyncUploadReplyBody;
    })();

    file.FileSyncStartUploadReplyBody = (function() {

        /**
         * Properties of a FileSyncStartUploadReplyBody.
         * @memberof file
         * @interface IFileSyncStartUploadReplyBody
         * @property {file.FileSyncStartUploadReplyBody.IUploadInfo|null} [startedUpload] FileSyncStartUploadReplyBody startedUpload
         */

        /**
         * Constructs a new FileSyncStartUploadReplyBody.
         * @memberof file
         * @classdesc Represents a FileSyncStartUploadReplyBody.
         * @implements IFileSyncStartUploadReplyBody
         * @constructor
         * @param {file.IFileSyncStartUploadReplyBody=} [properties] Properties to set
         */
        function FileSyncStartUploadReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileSyncStartUploadReplyBody startedUpload.
         * @member {file.FileSyncStartUploadReplyBody.IUploadInfo|null|undefined} startedUpload
         * @memberof file.FileSyncStartUploadReplyBody
         * @instance
         */
        FileSyncStartUploadReplyBody.prototype.startedUpload = null;

        /**
         * Creates a new FileSyncStartUploadReplyBody instance using the specified properties.
         * @function create
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {file.IFileSyncStartUploadReplyBody=} [properties] Properties to set
         * @returns {file.FileSyncStartUploadReplyBody} FileSyncStartUploadReplyBody instance
         */
        FileSyncStartUploadReplyBody.create = function create(properties) {
            return new FileSyncStartUploadReplyBody(properties);
        };

        /**
         * Encodes the specified FileSyncStartUploadReplyBody message. Does not implicitly {@link file.FileSyncStartUploadReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {file.IFileSyncStartUploadReplyBody} message FileSyncStartUploadReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncStartUploadReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.startedUpload != null && Object.hasOwnProperty.call(message, "startedUpload"))
                $root.file.FileSyncStartUploadReplyBody.UploadInfo.encode(message.startedUpload, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FileSyncStartUploadReplyBody message, length delimited. Does not implicitly {@link file.FileSyncStartUploadReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {file.IFileSyncStartUploadReplyBody} message FileSyncStartUploadReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncStartUploadReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileSyncStartUploadReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileSyncStartUploadReplyBody} FileSyncStartUploadReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncStartUploadReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncStartUploadReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.startedUpload = $root.file.FileSyncStartUploadReplyBody.UploadInfo.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileSyncStartUploadReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.FileSyncStartUploadReplyBody} FileSyncStartUploadReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncStartUploadReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileSyncStartUploadReplyBody message.
         * @function verify
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileSyncStartUploadReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.startedUpload != null && Object.hasOwnProperty.call(message, "startedUpload")) {
                var error = $root.file.FileSyncStartUploadReplyBody.UploadInfo.verify(message.startedUpload, long + 1);
                if (error)
                    return "startedUpload." + error;
            }
            return null;
        };

        /**
         * Creates a FileSyncStartUploadReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileSyncStartUploadReplyBody} FileSyncStartUploadReplyBody
         */
        FileSyncStartUploadReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.FileSyncStartUploadReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.FileSyncStartUploadReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.FileSyncStartUploadReplyBody();
            if (object.startedUpload != null) {
                if (!$util.isObject(object.startedUpload))
                    throw TypeError(".file.FileSyncStartUploadReplyBody.startedUpload: object expected");
                message.startedUpload = $root.file.FileSyncStartUploadReplyBody.UploadInfo.fromObject(object.startedUpload, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a FileSyncStartUploadReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {file.FileSyncStartUploadReplyBody} message FileSyncStartUploadReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileSyncStartUploadReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.startedUpload = null;
            if (message.startedUpload != null && Object.hasOwnProperty.call(message, "startedUpload"))
                object.startedUpload = $root.file.FileSyncStartUploadReplyBody.UploadInfo.toObject(message.startedUpload, options, q + 1);
            return object;
        };

        /**
         * Converts this FileSyncStartUploadReplyBody to JSON.
         * @function toJSON
         * @memberof file.FileSyncStartUploadReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileSyncStartUploadReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileSyncStartUploadReplyBody
         * @function getTypeUrl
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileSyncStartUploadReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.FileSyncStartUploadReplyBody";
        };

        FileSyncStartUploadReplyBody.UploadInfo = (function() {

            /**
             * Properties of an UploadInfo.
             * @memberof file.FileSyncStartUploadReplyBody
             * @interface IUploadInfo
             * @property {number|Long|null} [uploadVersion] UploadInfo uploadVersion
             * @property {number|Long|null} [uploadTaskId] UploadInfo uploadTaskId
             */

            /**
             * Constructs a new UploadInfo.
             * @memberof file.FileSyncStartUploadReplyBody
             * @classdesc Represents an UploadInfo.
             * @implements IUploadInfo
             * @constructor
             * @param {file.FileSyncStartUploadReplyBody.IUploadInfo=} [properties] Properties to set
             */
            function UploadInfo(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * UploadInfo uploadVersion.
             * @member {number|Long} uploadVersion
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @instance
             */
            UploadInfo.prototype.uploadVersion = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

            /**
             * UploadInfo uploadTaskId.
             * @member {number|Long} uploadTaskId
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @instance
             */
            UploadInfo.prototype.uploadTaskId = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

            /**
             * Creates a new UploadInfo instance using the specified properties.
             * @function create
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {file.FileSyncStartUploadReplyBody.IUploadInfo=} [properties] Properties to set
             * @returns {file.FileSyncStartUploadReplyBody.UploadInfo} UploadInfo instance
             */
            UploadInfo.create = function create(properties) {
                return new UploadInfo(properties);
            };

            /**
             * Encodes the specified UploadInfo message. Does not implicitly {@link file.FileSyncStartUploadReplyBody.UploadInfo.verify|verify} messages.
             * @function encode
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {file.FileSyncStartUploadReplyBody.IUploadInfo} message UploadInfo message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            UploadInfo.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                    writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.uploadVersion);
                if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                    writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.uploadTaskId);
                return writer;
            };

            /**
             * Encodes the specified UploadInfo message, length delimited. Does not implicitly {@link file.FileSyncStartUploadReplyBody.UploadInfo.verify|verify} messages.
             * @function encodeDelimited
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {file.FileSyncStartUploadReplyBody.IUploadInfo} message UploadInfo message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            UploadInfo.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes an UploadInfo message from the specified reader or buffer.
             * @function decode
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {file.FileSyncStartUploadReplyBody.UploadInfo} UploadInfo
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            UploadInfo.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncStartUploadReplyBody.UploadInfo();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.uploadVersion = reader.uint64();
                            break;
                        }
                    case 2: {
                            message.uploadTaskId = reader.uint64();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes an UploadInfo message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {file.FileSyncStartUploadReplyBody.UploadInfo} UploadInfo
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            UploadInfo.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies an UploadInfo message.
             * @function verify
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            UploadInfo.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                    if (!$util.isInteger(message.uploadVersion) && !(message.uploadVersion && $util.isInteger(message.uploadVersion.low) && $util.isInteger(message.uploadVersion.high)))
                        return "uploadVersion: integer|Long expected";
                if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                    if (!$util.isInteger(message.uploadTaskId) && !(message.uploadTaskId && $util.isInteger(message.uploadTaskId.low) && $util.isInteger(message.uploadTaskId.high)))
                        return "uploadTaskId: integer|Long expected";
                return null;
            };

            /**
             * Creates an UploadInfo message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {file.FileSyncStartUploadReplyBody.UploadInfo} UploadInfo
             */
            UploadInfo.fromObject = function fromObject(object, long) {
                if (object instanceof $root.file.FileSyncStartUploadReplyBody.UploadInfo)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".file.FileSyncStartUploadReplyBody.UploadInfo: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.file.FileSyncStartUploadReplyBody.UploadInfo();
                if (object.uploadVersion != null)
                    if ($util.Long)
                        message.uploadVersion = $util.Long.fromValue(object.uploadVersion, true);
                    else if (typeof object.uploadVersion === "string")
                        message.uploadVersion = parseInt(object.uploadVersion, 10);
                    else if (typeof object.uploadVersion === "number")
                        message.uploadVersion = object.uploadVersion;
                    else if (typeof object.uploadVersion === "object")
                        message.uploadVersion = new $util.LongBits(object.uploadVersion.low >>> 0, object.uploadVersion.high >>> 0).toNumber(true);
                if (object.uploadTaskId != null)
                    if ($util.Long)
                        message.uploadTaskId = $util.Long.fromValue(object.uploadTaskId, true);
                    else if (typeof object.uploadTaskId === "string")
                        message.uploadTaskId = parseInt(object.uploadTaskId, 10);
                    else if (typeof object.uploadTaskId === "number")
                        message.uploadTaskId = object.uploadTaskId;
                    else if (typeof object.uploadTaskId === "object")
                        message.uploadTaskId = new $util.LongBits(object.uploadTaskId.low >>> 0, object.uploadTaskId.high >>> 0).toNumber(true);
                return message;
            };

            /**
             * Creates a plain object from an UploadInfo message. Also converts values to other types if specified.
             * @function toObject
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {file.FileSyncStartUploadReplyBody.UploadInfo} message UploadInfo
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            UploadInfo.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults) {
                    if ($util.Long) {
                        var long = new $util.Long(0, 0, true);
                        object.uploadVersion = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                    } else
                        object.uploadVersion = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                    if ($util.Long) {
                        var long = new $util.Long(0, 0, true);
                        object.uploadTaskId = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                    } else
                        object.uploadTaskId = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                }
                if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                    if (typeof BigInt !== "undefined" && options.longs === BigInt)
                        object.uploadVersion = typeof message.uploadVersion === "number" ? BigInt(message.uploadVersion) : $util.Long.fromBits(message.uploadVersion.low >>> 0, message.uploadVersion.high >>> 0, true).toBigInt();
                    else if (typeof message.uploadVersion === "number")
                        object.uploadVersion = options.longs === String ? String(message.uploadVersion) : message.uploadVersion;
                    else
                        object.uploadVersion = options.longs === String ? $util.Long.prototype.toString.call(message.uploadVersion) : options.longs === Number ? new $util.LongBits(message.uploadVersion.low >>> 0, message.uploadVersion.high >>> 0).toNumber(true) : message.uploadVersion;
                if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                    if (typeof BigInt !== "undefined" && options.longs === BigInt)
                        object.uploadTaskId = typeof message.uploadTaskId === "number" ? BigInt(message.uploadTaskId) : $util.Long.fromBits(message.uploadTaskId.low >>> 0, message.uploadTaskId.high >>> 0, true).toBigInt();
                    else if (typeof message.uploadTaskId === "number")
                        object.uploadTaskId = options.longs === String ? String(message.uploadTaskId) : message.uploadTaskId;
                    else
                        object.uploadTaskId = options.longs === String ? $util.Long.prototype.toString.call(message.uploadTaskId) : options.longs === Number ? new $util.LongBits(message.uploadTaskId.low >>> 0, message.uploadTaskId.high >>> 0).toNumber(true) : message.uploadTaskId;
                return object;
            };

            /**
             * Converts this UploadInfo to JSON.
             * @function toJSON
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            UploadInfo.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for UploadInfo
             * @function getTypeUrl
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            UploadInfo.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/file.FileSyncStartUploadReplyBody.UploadInfo";
            };

            return UploadInfo;
        })();

        return FileSyncStartUploadReplyBody;
    })();

    file.OptionsToUploadLocal = (function() {

        /**
         * Properties of an OptionsToUploadLocal.
         * @memberof file
         * @interface IOptionsToUploadLocal
         * @property {common.IUInt64Value|null} [localVersion] OptionsToUploadLocal localVersion
         * @property {common.IUInt64Value|null} [uploadVersion] OptionsToUploadLocal uploadVersion
         */

        /**
         * Constructs a new OptionsToUploadLocal.
         * @memberof file
         * @classdesc Represents an OptionsToUploadLocal.
         * @implements IOptionsToUploadLocal
         * @constructor
         * @param {file.IOptionsToUploadLocal=} [properties] Properties to set
         */
        function OptionsToUploadLocal(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * OptionsToUploadLocal localVersion.
         * @member {common.IUInt64Value|null|undefined} localVersion
         * @memberof file.OptionsToUploadLocal
         * @instance
         */
        OptionsToUploadLocal.prototype.localVersion = null;

        /**
         * OptionsToUploadLocal uploadVersion.
         * @member {common.IUInt64Value|null|undefined} uploadVersion
         * @memberof file.OptionsToUploadLocal
         * @instance
         */
        OptionsToUploadLocal.prototype.uploadVersion = null;

        /**
         * Creates a new OptionsToUploadLocal instance using the specified properties.
         * @function create
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {file.IOptionsToUploadLocal=} [properties] Properties to set
         * @returns {file.OptionsToUploadLocal} OptionsToUploadLocal instance
         */
        OptionsToUploadLocal.create = function create(properties) {
            return new OptionsToUploadLocal(properties);
        };

        /**
         * Encodes the specified OptionsToUploadLocal message. Does not implicitly {@link file.OptionsToUploadLocal.verify|verify} messages.
         * @function encode
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {file.IOptionsToUploadLocal} message OptionsToUploadLocal message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        OptionsToUploadLocal.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                $root.common.UInt64Value.encode(message.localVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                $root.common.UInt64Value.encode(message.uploadVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified OptionsToUploadLocal message, length delimited. Does not implicitly {@link file.OptionsToUploadLocal.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {file.IOptionsToUploadLocal} message OptionsToUploadLocal message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        OptionsToUploadLocal.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an OptionsToUploadLocal message from the specified reader or buffer.
         * @function decode
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.OptionsToUploadLocal} OptionsToUploadLocal
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        OptionsToUploadLocal.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.OptionsToUploadLocal();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.localVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.uploadVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an OptionsToUploadLocal message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.OptionsToUploadLocal} OptionsToUploadLocal
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        OptionsToUploadLocal.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an OptionsToUploadLocal message.
         * @function verify
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        OptionsToUploadLocal.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion")) {
                var error = $root.common.UInt64Value.verify(message.localVersion, long + 1);
                if (error)
                    return "localVersion." + error;
            }
            if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion")) {
                var error = $root.common.UInt64Value.verify(message.uploadVersion, long + 1);
                if (error)
                    return "uploadVersion." + error;
            }
            return null;
        };

        /**
         * Creates an OptionsToUploadLocal message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.OptionsToUploadLocal} OptionsToUploadLocal
         */
        OptionsToUploadLocal.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.OptionsToUploadLocal)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.OptionsToUploadLocal: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.OptionsToUploadLocal();
            if (object.localVersion != null) {
                if (!$util.isObject(object.localVersion))
                    throw TypeError(".file.OptionsToUploadLocal.localVersion: object expected");
                message.localVersion = $root.common.UInt64Value.fromObject(object.localVersion, long + 1);
            }
            if (object.uploadVersion != null) {
                if (!$util.isObject(object.uploadVersion))
                    throw TypeError(".file.OptionsToUploadLocal.uploadVersion: object expected");
                message.uploadVersion = $root.common.UInt64Value.fromObject(object.uploadVersion, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an OptionsToUploadLocal message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {file.OptionsToUploadLocal} message OptionsToUploadLocal
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        OptionsToUploadLocal.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.localVersion = null;
                object.uploadVersion = null;
            }
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                object.localVersion = $root.common.UInt64Value.toObject(message.localVersion, options, q + 1);
            if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                object.uploadVersion = $root.common.UInt64Value.toObject(message.uploadVersion, options, q + 1);
            return object;
        };

        /**
         * Converts this OptionsToUploadLocal to JSON.
         * @function toJSON
         * @memberof file.OptionsToUploadLocal
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        OptionsToUploadLocal.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for OptionsToUploadLocal
         * @function getTypeUrl
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        OptionsToUploadLocal.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.OptionsToUploadLocal";
        };

        return OptionsToUploadLocal;
    })();

    file.WatchUploadRequestBody = (function() {

        /**
         * Properties of a WatchUploadRequestBody.
         * @memberof file
         * @interface IWatchUploadRequestBody
         * @property {number|Long|null} [uploadTaskId] WatchUploadRequestBody uploadTaskId
         */

        /**
         * Constructs a new WatchUploadRequestBody.
         * @memberof file
         * @classdesc Represents a WatchUploadRequestBody.
         * @implements IWatchUploadRequestBody
         * @constructor
         * @param {file.IWatchUploadRequestBody=} [properties] Properties to set
         */
        function WatchUploadRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * WatchUploadRequestBody uploadTaskId.
         * @member {number|Long} uploadTaskId
         * @memberof file.WatchUploadRequestBody
         * @instance
         */
        WatchUploadRequestBody.prototype.uploadTaskId = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new WatchUploadRequestBody instance using the specified properties.
         * @function create
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {file.IWatchUploadRequestBody=} [properties] Properties to set
         * @returns {file.WatchUploadRequestBody} WatchUploadRequestBody instance
         */
        WatchUploadRequestBody.create = function create(properties) {
            return new WatchUploadRequestBody(properties);
        };

        /**
         * Encodes the specified WatchUploadRequestBody message. Does not implicitly {@link file.WatchUploadRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {file.IWatchUploadRequestBody} message WatchUploadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WatchUploadRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.uploadTaskId);
            return writer;
        };

        /**
         * Encodes the specified WatchUploadRequestBody message, length delimited. Does not implicitly {@link file.WatchUploadRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {file.IWatchUploadRequestBody} message WatchUploadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WatchUploadRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a WatchUploadRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.WatchUploadRequestBody} WatchUploadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WatchUploadRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.WatchUploadRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.uploadTaskId = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a WatchUploadRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.WatchUploadRequestBody} WatchUploadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WatchUploadRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a WatchUploadRequestBody message.
         * @function verify
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        WatchUploadRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                if (!$util.isInteger(message.uploadTaskId) && !(message.uploadTaskId && $util.isInteger(message.uploadTaskId.low) && $util.isInteger(message.uploadTaskId.high)))
                    return "uploadTaskId: integer|Long expected";
            return null;
        };

        /**
         * Creates a WatchUploadRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.WatchUploadRequestBody} WatchUploadRequestBody
         */
        WatchUploadRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.WatchUploadRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.WatchUploadRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.WatchUploadRequestBody();
            if (object.uploadTaskId != null)
                if ($util.Long)
                    message.uploadTaskId = $util.Long.fromValue(object.uploadTaskId, true);
                else if (typeof object.uploadTaskId === "string")
                    message.uploadTaskId = parseInt(object.uploadTaskId, 10);
                else if (typeof object.uploadTaskId === "number")
                    message.uploadTaskId = object.uploadTaskId;
                else if (typeof object.uploadTaskId === "object")
                    message.uploadTaskId = new $util.LongBits(object.uploadTaskId.low >>> 0, object.uploadTaskId.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from a WatchUploadRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {file.WatchUploadRequestBody} message WatchUploadRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        WatchUploadRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.uploadTaskId = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.uploadTaskId = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.uploadTaskId = typeof message.uploadTaskId === "number" ? BigInt(message.uploadTaskId) : $util.Long.fromBits(message.uploadTaskId.low >>> 0, message.uploadTaskId.high >>> 0, true).toBigInt();
                else if (typeof message.uploadTaskId === "number")
                    object.uploadTaskId = options.longs === String ? String(message.uploadTaskId) : message.uploadTaskId;
                else
                    object.uploadTaskId = options.longs === String ? $util.Long.prototype.toString.call(message.uploadTaskId) : options.longs === Number ? new $util.LongBits(message.uploadTaskId.low >>> 0, message.uploadTaskId.high >>> 0).toNumber(true) : message.uploadTaskId;
            return object;
        };

        /**
         * Converts this WatchUploadRequestBody to JSON.
         * @function toJSON
         * @memberof file.WatchUploadRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        WatchUploadRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for WatchUploadRequestBody
         * @function getTypeUrl
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        WatchUploadRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.WatchUploadRequestBody";
        };

        return WatchUploadRequestBody;
    })();

    file.UploadEventMsg = (function() {

        /**
         * Properties of an UploadEventMsg.
         * @memberof file
         * @interface IUploadEventMsg
         * @property {string|null} [type] UploadEventMsg type
         * @property {number|Long|null} [uploadTaskId] UploadEventMsg uploadTaskId
         * @property {number|Long|null} [localVersion] UploadEventMsg localVersion
         * @property {number|Long|null} [uploadVersion] UploadEventMsg uploadVersion
         */

        /**
         * Constructs a new UploadEventMsg.
         * @memberof file
         * @classdesc Represents an UploadEventMsg.
         * @implements IUploadEventMsg
         * @constructor
         * @param {file.IUploadEventMsg=} [properties] Properties to set
         */
        function UploadEventMsg(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * UploadEventMsg type.
         * @member {string} type
         * @memberof file.UploadEventMsg
         * @instance
         */
        UploadEventMsg.prototype.type = "";

        /**
         * UploadEventMsg uploadTaskId.
         * @member {number|Long} uploadTaskId
         * @memberof file.UploadEventMsg
         * @instance
         */
        UploadEventMsg.prototype.uploadTaskId = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * UploadEventMsg localVersion.
         * @member {number|Long} localVersion
         * @memberof file.UploadEventMsg
         * @instance
         */
        UploadEventMsg.prototype.localVersion = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * UploadEventMsg uploadVersion.
         * @member {number|Long} uploadVersion
         * @memberof file.UploadEventMsg
         * @instance
         */
        UploadEventMsg.prototype.uploadVersion = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new UploadEventMsg instance using the specified properties.
         * @function create
         * @memberof file.UploadEventMsg
         * @static
         * @param {file.IUploadEventMsg=} [properties] Properties to set
         * @returns {file.UploadEventMsg} UploadEventMsg instance
         */
        UploadEventMsg.create = function create(properties) {
            return new UploadEventMsg(properties);
        };

        /**
         * Encodes the specified UploadEventMsg message. Does not implicitly {@link file.UploadEventMsg.verify|verify} messages.
         * @function encode
         * @memberof file.UploadEventMsg
         * @static
         * @param {file.IUploadEventMsg} message UploadEventMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UploadEventMsg.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.type);
            if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.uploadTaskId);
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.localVersion);
            if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                writer.uint32(/* id 4, wireType 0 =*/32).uint64(message.uploadVersion);
            return writer;
        };

        /**
         * Encodes the specified UploadEventMsg message, length delimited. Does not implicitly {@link file.UploadEventMsg.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.UploadEventMsg
         * @static
         * @param {file.IUploadEventMsg} message UploadEventMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UploadEventMsg.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an UploadEventMsg message from the specified reader or buffer.
         * @function decode
         * @memberof file.UploadEventMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.UploadEventMsg} UploadEventMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UploadEventMsg.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.UploadEventMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.type = reader.string();
                        break;
                    }
                case 2: {
                        message.uploadTaskId = reader.uint64();
                        break;
                    }
                case 3: {
                        message.localVersion = reader.uint64();
                        break;
                    }
                case 4: {
                        message.uploadVersion = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an UploadEventMsg message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.UploadEventMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.UploadEventMsg} UploadEventMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UploadEventMsg.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an UploadEventMsg message.
         * @function verify
         * @memberof file.UploadEventMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        UploadEventMsg.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                if (!$util.isInteger(message.uploadTaskId) && !(message.uploadTaskId && $util.isInteger(message.uploadTaskId.low) && $util.isInteger(message.uploadTaskId.high)))
                    return "uploadTaskId: integer|Long expected";
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                if (!$util.isInteger(message.localVersion) && !(message.localVersion && $util.isInteger(message.localVersion.low) && $util.isInteger(message.localVersion.high)))
                    return "localVersion: integer|Long expected";
            if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                if (!$util.isInteger(message.uploadVersion) && !(message.uploadVersion && $util.isInteger(message.uploadVersion.low) && $util.isInteger(message.uploadVersion.high)))
                    return "uploadVersion: integer|Long expected";
            return null;
        };

        /**
         * Creates an UploadEventMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.UploadEventMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.UploadEventMsg} UploadEventMsg
         */
        UploadEventMsg.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.UploadEventMsg)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.UploadEventMsg: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.UploadEventMsg();
            if (object.type != null)
                message.type = String(object.type);
            if (object.uploadTaskId != null)
                if ($util.Long)
                    message.uploadTaskId = $util.Long.fromValue(object.uploadTaskId, true);
                else if (typeof object.uploadTaskId === "string")
                    message.uploadTaskId = parseInt(object.uploadTaskId, 10);
                else if (typeof object.uploadTaskId === "number")
                    message.uploadTaskId = object.uploadTaskId;
                else if (typeof object.uploadTaskId === "object")
                    message.uploadTaskId = new $util.LongBits(object.uploadTaskId.low >>> 0, object.uploadTaskId.high >>> 0).toNumber(true);
            if (object.localVersion != null)
                if ($util.Long)
                    message.localVersion = $util.Long.fromValue(object.localVersion, true);
                else if (typeof object.localVersion === "string")
                    message.localVersion = parseInt(object.localVersion, 10);
                else if (typeof object.localVersion === "number")
                    message.localVersion = object.localVersion;
                else if (typeof object.localVersion === "object")
                    message.localVersion = new $util.LongBits(object.localVersion.low >>> 0, object.localVersion.high >>> 0).toNumber(true);
            if (object.uploadVersion != null)
                if ($util.Long)
                    message.uploadVersion = $util.Long.fromValue(object.uploadVersion, true);
                else if (typeof object.uploadVersion === "string")
                    message.uploadVersion = parseInt(object.uploadVersion, 10);
                else if (typeof object.uploadVersion === "number")
                    message.uploadVersion = object.uploadVersion;
                else if (typeof object.uploadVersion === "object")
                    message.uploadVersion = new $util.LongBits(object.uploadVersion.low >>> 0, object.uploadVersion.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from an UploadEventMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.UploadEventMsg
         * @static
         * @param {file.UploadEventMsg} message UploadEventMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        UploadEventMsg.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.type = "";
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.uploadTaskId = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.uploadTaskId = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.localVersion = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.localVersion = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.uploadVersion = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.uploadVersion = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            }
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                object.type = message.type;
            if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.uploadTaskId = typeof message.uploadTaskId === "number" ? BigInt(message.uploadTaskId) : $util.Long.fromBits(message.uploadTaskId.low >>> 0, message.uploadTaskId.high >>> 0, true).toBigInt();
                else if (typeof message.uploadTaskId === "number")
                    object.uploadTaskId = options.longs === String ? String(message.uploadTaskId) : message.uploadTaskId;
                else
                    object.uploadTaskId = options.longs === String ? $util.Long.prototype.toString.call(message.uploadTaskId) : options.longs === Number ? new $util.LongBits(message.uploadTaskId.low >>> 0, message.uploadTaskId.high >>> 0).toNumber(true) : message.uploadTaskId;
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.localVersion = typeof message.localVersion === "number" ? BigInt(message.localVersion) : $util.Long.fromBits(message.localVersion.low >>> 0, message.localVersion.high >>> 0, true).toBigInt();
                else if (typeof message.localVersion === "number")
                    object.localVersion = options.longs === String ? String(message.localVersion) : message.localVersion;
                else
                    object.localVersion = options.longs === String ? $util.Long.prototype.toString.call(message.localVersion) : options.longs === Number ? new $util.LongBits(message.localVersion.low >>> 0, message.localVersion.high >>> 0).toNumber(true) : message.localVersion;
            if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.uploadVersion = typeof message.uploadVersion === "number" ? BigInt(message.uploadVersion) : $util.Long.fromBits(message.uploadVersion.low >>> 0, message.uploadVersion.high >>> 0, true).toBigInt();
                else if (typeof message.uploadVersion === "number")
                    object.uploadVersion = options.longs === String ? String(message.uploadVersion) : message.uploadVersion;
                else
                    object.uploadVersion = options.longs === String ? $util.Long.prototype.toString.call(message.uploadVersion) : options.longs === Number ? new $util.LongBits(message.uploadVersion.low >>> 0, message.uploadVersion.high >>> 0).toNumber(true) : message.uploadVersion;
            return object;
        };

        /**
         * Converts this UploadEventMsg to JSON.
         * @function toJSON
         * @memberof file.UploadEventMsg
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        UploadEventMsg.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for UploadEventMsg
         * @function getTypeUrl
         * @memberof file.UploadEventMsg
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        UploadEventMsg.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.UploadEventMsg";
        };

        return UploadEventMsg;
    })();

    return file;
})();

$root.fs = (function() {

    /**
     * Namespace fs.
     * @exports fs
     * @namespace
     */
    var fs = {};

    fs.FS = (function() {

        /**
         * Properties of a FS.
         * @memberof fs
         * @interface IFS
         * @property {string|null} [type] FS type
         * @property {boolean|null} [isVersioned] FS isVersioned
         * @property {boolean|null} [writable] FS writable
         * @property {string|null} [name] FS name
         * @property {common.IObjectReference|null} [impl] FS impl
         * @property {boolean|null} [isSynced] FS isSynced
         */

        /**
         * Constructs a new FS.
         * @memberof fs
         * @classdesc Represents a FS.
         * @implements IFS
         * @constructor
         * @param {fs.IFS=} [properties] Properties to set
         */
        function FS(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FS type.
         * @member {string} type
         * @memberof fs.FS
         * @instance
         */
        FS.prototype.type = "";

        /**
         * FS isVersioned.
         * @member {boolean} isVersioned
         * @memberof fs.FS
         * @instance
         */
        FS.prototype.isVersioned = false;

        /**
         * FS writable.
         * @member {boolean} writable
         * @memberof fs.FS
         * @instance
         */
        FS.prototype.writable = false;

        /**
         * FS name.
         * @member {string} name
         * @memberof fs.FS
         * @instance
         */
        FS.prototype.name = "";

        /**
         * FS impl.
         * @member {common.IObjectReference|null|undefined} impl
         * @memberof fs.FS
         * @instance
         */
        FS.prototype.impl = null;

        /**
         * FS isSynced.
         * @member {boolean} isSynced
         * @memberof fs.FS
         * @instance
         */
        FS.prototype.isSynced = false;

        /**
         * Creates a new FS instance using the specified properties.
         * @function create
         * @memberof fs.FS
         * @static
         * @param {fs.IFS=} [properties] Properties to set
         * @returns {fs.FS} FS instance
         */
        FS.create = function create(properties) {
            return new FS(properties);
        };

        /**
         * Encodes the specified FS message. Does not implicitly {@link fs.FS.verify|verify} messages.
         * @function encode
         * @memberof fs.FS
         * @static
         * @param {fs.IFS} message FS message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FS.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.type);
            if (message.isVersioned != null && Object.hasOwnProperty.call(message, "isVersioned"))
                writer.uint32(/* id 2, wireType 0 =*/16).bool(message.isVersioned);
            if (message.writable != null && Object.hasOwnProperty.call(message, "writable"))
                writer.uint32(/* id 3, wireType 0 =*/24).bool(message.writable);
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                writer.uint32(/* id 4, wireType 2 =*/34).string(message.name);
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl"))
                $root.common.ObjectReference.encode(message.impl, writer.uint32(/* id 5, wireType 2 =*/42).fork(), q + 1).ldelim();
            if (message.isSynced != null && Object.hasOwnProperty.call(message, "isSynced"))
                writer.uint32(/* id 6, wireType 0 =*/48).bool(message.isSynced);
            return writer;
        };

        /**
         * Encodes the specified FS message, length delimited. Does not implicitly {@link fs.FS.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FS
         * @static
         * @param {fs.IFS} message FS message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FS.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FS message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FS
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FS} FS
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FS.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FS();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.type = reader.string();
                        break;
                    }
                case 2: {
                        message.isVersioned = reader.bool();
                        break;
                    }
                case 3: {
                        message.writable = reader.bool();
                        break;
                    }
                case 4: {
                        message.name = reader.string();
                        break;
                    }
                case 5: {
                        message.impl = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 6: {
                        message.isSynced = reader.bool();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FS message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FS
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FS} FS
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FS.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FS message.
         * @function verify
         * @memberof fs.FS
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FS.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.isVersioned != null && Object.hasOwnProperty.call(message, "isVersioned"))
                if (typeof message.isVersioned !== "boolean")
                    return "isVersioned: boolean expected";
            if (message.writable != null && Object.hasOwnProperty.call(message, "writable"))
                if (typeof message.writable !== "boolean")
                    return "writable: boolean expected";
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl")) {
                var error = $root.common.ObjectReference.verify(message.impl, long + 1);
                if (error)
                    return "impl." + error;
            }
            if (message.isSynced != null && Object.hasOwnProperty.call(message, "isSynced"))
                if (typeof message.isSynced !== "boolean")
                    return "isSynced: boolean expected";
            return null;
        };

        /**
         * Creates a FS message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FS
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FS} FS
         */
        FS.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FS)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FS: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FS();
            if (object.type != null)
                message.type = String(object.type);
            if (object.isVersioned != null)
                message.isVersioned = Boolean(object.isVersioned);
            if (object.writable != null)
                message.writable = Boolean(object.writable);
            if (object.name != null)
                message.name = String(object.name);
            if (object.impl != null) {
                if (!$util.isObject(object.impl))
                    throw TypeError(".fs.FS.impl: object expected");
                message.impl = $root.common.ObjectReference.fromObject(object.impl, long + 1);
            }
            if (object.isSynced != null)
                message.isSynced = Boolean(object.isSynced);
            return message;
        };

        /**
         * Creates a plain object from a FS message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FS
         * @static
         * @param {fs.FS} message FS
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FS.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.isVersioned = false;
                object.writable = false;
                object.name = "";
                object.impl = null;
                object.isSynced = false;
            }
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                object.type = message.type;
            if (message.isVersioned != null && Object.hasOwnProperty.call(message, "isVersioned"))
                object.isVersioned = message.isVersioned;
            if (message.writable != null && Object.hasOwnProperty.call(message, "writable"))
                object.writable = message.writable;
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                object.name = message.name;
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl"))
                object.impl = $root.common.ObjectReference.toObject(message.impl, options, q + 1);
            if (message.isSynced != null && Object.hasOwnProperty.call(message, "isSynced"))
                object.isSynced = message.isSynced;
            return object;
        };

        /**
         * Converts this FS to JSON.
         * @function toJSON
         * @memberof fs.FS
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FS.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FS
         * @function getTypeUrl
         * @memberof fs.FS
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FS.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FS";
        };

        return FS;
    })();

    fs.CheckPresenceRequestBody = (function() {

        /**
         * Properties of a CheckPresenceRequestBody.
         * @memberof fs
         * @interface ICheckPresenceRequestBody
         * @property {string|null} [path] CheckPresenceRequestBody path
         * @property {common.IBooleanValue|null} [throwIfMissing] CheckPresenceRequestBody throwIfMissing
         */

        /**
         * Constructs a new CheckPresenceRequestBody.
         * @memberof fs
         * @classdesc Represents a CheckPresenceRequestBody.
         * @implements ICheckPresenceRequestBody
         * @constructor
         * @param {fs.ICheckPresenceRequestBody=} [properties] Properties to set
         */
        function CheckPresenceRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * CheckPresenceRequestBody path.
         * @member {string} path
         * @memberof fs.CheckPresenceRequestBody
         * @instance
         */
        CheckPresenceRequestBody.prototype.path = "";

        /**
         * CheckPresenceRequestBody throwIfMissing.
         * @member {common.IBooleanValue|null|undefined} throwIfMissing
         * @memberof fs.CheckPresenceRequestBody
         * @instance
         */
        CheckPresenceRequestBody.prototype.throwIfMissing = null;

        /**
         * Creates a new CheckPresenceRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.CheckPresenceRequestBody
         * @static
         * @param {fs.ICheckPresenceRequestBody=} [properties] Properties to set
         * @returns {fs.CheckPresenceRequestBody} CheckPresenceRequestBody instance
         */
        CheckPresenceRequestBody.create = function create(properties) {
            return new CheckPresenceRequestBody(properties);
        };

        /**
         * Encodes the specified CheckPresenceRequestBody message. Does not implicitly {@link fs.CheckPresenceRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.CheckPresenceRequestBody
         * @static
         * @param {fs.ICheckPresenceRequestBody} message CheckPresenceRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CheckPresenceRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.throwIfMissing != null && Object.hasOwnProperty.call(message, "throwIfMissing"))
                $root.common.BooleanValue.encode(message.throwIfMissing, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified CheckPresenceRequestBody message, length delimited. Does not implicitly {@link fs.CheckPresenceRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.CheckPresenceRequestBody
         * @static
         * @param {fs.ICheckPresenceRequestBody} message CheckPresenceRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CheckPresenceRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a CheckPresenceRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.CheckPresenceRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.CheckPresenceRequestBody} CheckPresenceRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CheckPresenceRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.CheckPresenceRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.throwIfMissing = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a CheckPresenceRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.CheckPresenceRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.CheckPresenceRequestBody} CheckPresenceRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CheckPresenceRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a CheckPresenceRequestBody message.
         * @function verify
         * @memberof fs.CheckPresenceRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        CheckPresenceRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.throwIfMissing != null && Object.hasOwnProperty.call(message, "throwIfMissing")) {
                var error = $root.common.BooleanValue.verify(message.throwIfMissing, long + 1);
                if (error)
                    return "throwIfMissing." + error;
            }
            return null;
        };

        /**
         * Creates a CheckPresenceRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.CheckPresenceRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.CheckPresenceRequestBody} CheckPresenceRequestBody
         */
        CheckPresenceRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.CheckPresenceRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.CheckPresenceRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.CheckPresenceRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.throwIfMissing != null) {
                if (!$util.isObject(object.throwIfMissing))
                    throw TypeError(".fs.CheckPresenceRequestBody.throwIfMissing: object expected");
                message.throwIfMissing = $root.common.BooleanValue.fromObject(object.throwIfMissing, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a CheckPresenceRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.CheckPresenceRequestBody
         * @static
         * @param {fs.CheckPresenceRequestBody} message CheckPresenceRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        CheckPresenceRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.throwIfMissing = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.throwIfMissing != null && Object.hasOwnProperty.call(message, "throwIfMissing"))
                object.throwIfMissing = $root.common.BooleanValue.toObject(message.throwIfMissing, options, q + 1);
            return object;
        };

        /**
         * Converts this CheckPresenceRequestBody to JSON.
         * @function toJSON
         * @memberof fs.CheckPresenceRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        CheckPresenceRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for CheckPresenceRequestBody
         * @function getTypeUrl
         * @memberof fs.CheckPresenceRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        CheckPresenceRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.CheckPresenceRequestBody";
        };

        return CheckPresenceRequestBody;
    })();

    fs.PathOnlyRequestBody = (function() {

        /**
         * Properties of a PathOnlyRequestBody.
         * @memberof fs
         * @interface IPathOnlyRequestBody
         * @property {string|null} [path] PathOnlyRequestBody path
         */

        /**
         * Constructs a new PathOnlyRequestBody.
         * @memberof fs
         * @classdesc Represents a PathOnlyRequestBody.
         * @implements IPathOnlyRequestBody
         * @constructor
         * @param {fs.IPathOnlyRequestBody=} [properties] Properties to set
         */
        function PathOnlyRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * PathOnlyRequestBody path.
         * @member {string} path
         * @memberof fs.PathOnlyRequestBody
         * @instance
         */
        PathOnlyRequestBody.prototype.path = "";

        /**
         * Creates a new PathOnlyRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.PathOnlyRequestBody
         * @static
         * @param {fs.IPathOnlyRequestBody=} [properties] Properties to set
         * @returns {fs.PathOnlyRequestBody} PathOnlyRequestBody instance
         */
        PathOnlyRequestBody.create = function create(properties) {
            return new PathOnlyRequestBody(properties);
        };

        /**
         * Encodes the specified PathOnlyRequestBody message. Does not implicitly {@link fs.PathOnlyRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.PathOnlyRequestBody
         * @static
         * @param {fs.IPathOnlyRequestBody} message PathOnlyRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        PathOnlyRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            return writer;
        };

        /**
         * Encodes the specified PathOnlyRequestBody message, length delimited. Does not implicitly {@link fs.PathOnlyRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.PathOnlyRequestBody
         * @static
         * @param {fs.IPathOnlyRequestBody} message PathOnlyRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        PathOnlyRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a PathOnlyRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.PathOnlyRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.PathOnlyRequestBody} PathOnlyRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        PathOnlyRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.PathOnlyRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a PathOnlyRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.PathOnlyRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.PathOnlyRequestBody} PathOnlyRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        PathOnlyRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a PathOnlyRequestBody message.
         * @function verify
         * @memberof fs.PathOnlyRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        PathOnlyRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            return null;
        };

        /**
         * Creates a PathOnlyRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.PathOnlyRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.PathOnlyRequestBody} PathOnlyRequestBody
         */
        PathOnlyRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.PathOnlyRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.PathOnlyRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.PathOnlyRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            return message;
        };

        /**
         * Creates a plain object from a PathOnlyRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.PathOnlyRequestBody
         * @static
         * @param {fs.PathOnlyRequestBody} message PathOnlyRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        PathOnlyRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.path = "";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            return object;
        };

        /**
         * Converts this PathOnlyRequestBody to JSON.
         * @function toJSON
         * @memberof fs.PathOnlyRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        PathOnlyRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for PathOnlyRequestBody
         * @function getTypeUrl
         * @memberof fs.PathOnlyRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        PathOnlyRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.PathOnlyRequestBody";
        };

        return PathOnlyRequestBody;
    })();

    fs.GetXAttrRequestBody = (function() {

        /**
         * Properties of a GetXAttrRequestBody.
         * @memberof fs
         * @interface IGetXAttrRequestBody
         * @property {string|null} [path] GetXAttrRequestBody path
         * @property {string|null} [xaName] GetXAttrRequestBody xaName
         */

        /**
         * Constructs a new GetXAttrRequestBody.
         * @memberof fs
         * @classdesc Represents a GetXAttrRequestBody.
         * @implements IGetXAttrRequestBody
         * @constructor
         * @param {fs.IGetXAttrRequestBody=} [properties] Properties to set
         */
        function GetXAttrRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * GetXAttrRequestBody path.
         * @member {string} path
         * @memberof fs.GetXAttrRequestBody
         * @instance
         */
        GetXAttrRequestBody.prototype.path = "";

        /**
         * GetXAttrRequestBody xaName.
         * @member {string} xaName
         * @memberof fs.GetXAttrRequestBody
         * @instance
         */
        GetXAttrRequestBody.prototype.xaName = "";

        /**
         * Creates a new GetXAttrRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.GetXAttrRequestBody
         * @static
         * @param {fs.IGetXAttrRequestBody=} [properties] Properties to set
         * @returns {fs.GetXAttrRequestBody} GetXAttrRequestBody instance
         */
        GetXAttrRequestBody.create = function create(properties) {
            return new GetXAttrRequestBody(properties);
        };

        /**
         * Encodes the specified GetXAttrRequestBody message. Does not implicitly {@link fs.GetXAttrRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.GetXAttrRequestBody
         * @static
         * @param {fs.IGetXAttrRequestBody} message GetXAttrRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        GetXAttrRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.xaName);
            return writer;
        };

        /**
         * Encodes the specified GetXAttrRequestBody message, length delimited. Does not implicitly {@link fs.GetXAttrRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.GetXAttrRequestBody
         * @static
         * @param {fs.IGetXAttrRequestBody} message GetXAttrRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        GetXAttrRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a GetXAttrRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.GetXAttrRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.GetXAttrRequestBody} GetXAttrRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        GetXAttrRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.GetXAttrRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.xaName = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a GetXAttrRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.GetXAttrRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.GetXAttrRequestBody} GetXAttrRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        GetXAttrRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a GetXAttrRequestBody message.
         * @function verify
         * @memberof fs.GetXAttrRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        GetXAttrRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                if (!$util.isString(message.xaName))
                    return "xaName: string expected";
            return null;
        };

        /**
         * Creates a GetXAttrRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.GetXAttrRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.GetXAttrRequestBody} GetXAttrRequestBody
         */
        GetXAttrRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.GetXAttrRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.GetXAttrRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.GetXAttrRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.xaName != null)
                message.xaName = String(object.xaName);
            return message;
        };

        /**
         * Creates a plain object from a GetXAttrRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.GetXAttrRequestBody
         * @static
         * @param {fs.GetXAttrRequestBody} message GetXAttrRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        GetXAttrRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.xaName = "";
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                object.xaName = message.xaName;
            return object;
        };

        /**
         * Converts this GetXAttrRequestBody to JSON.
         * @function toJSON
         * @memberof fs.GetXAttrRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        GetXAttrRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for GetXAttrRequestBody
         * @function getTypeUrl
         * @memberof fs.GetXAttrRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        GetXAttrRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.GetXAttrRequestBody";
        };

        return GetXAttrRequestBody;
    })();

    fs.SymLink = (function() {

        /**
         * Properties of a SymLink.
         * @memberof fs
         * @interface ISymLink
         * @property {boolean|null} [readonly] SymLink readonly
         * @property {common.IBooleanValue|null} [isFile] SymLink isFile
         * @property {common.IBooleanValue|null} [isFolder] SymLink isFolder
         * @property {common.IObjectReference|null} [impl] SymLink impl
         */

        /**
         * Constructs a new SymLink.
         * @memberof fs
         * @classdesc Represents a SymLink.
         * @implements ISymLink
         * @constructor
         * @param {fs.ISymLink=} [properties] Properties to set
         */
        function SymLink(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * SymLink readonly.
         * @member {boolean} readonly
         * @memberof fs.SymLink
         * @instance
         */
        SymLink.prototype.readonly = false;

        /**
         * SymLink isFile.
         * @member {common.IBooleanValue|null|undefined} isFile
         * @memberof fs.SymLink
         * @instance
         */
        SymLink.prototype.isFile = null;

        /**
         * SymLink isFolder.
         * @member {common.IBooleanValue|null|undefined} isFolder
         * @memberof fs.SymLink
         * @instance
         */
        SymLink.prototype.isFolder = null;

        /**
         * SymLink impl.
         * @member {common.IObjectReference|null|undefined} impl
         * @memberof fs.SymLink
         * @instance
         */
        SymLink.prototype.impl = null;

        /**
         * Creates a new SymLink instance using the specified properties.
         * @function create
         * @memberof fs.SymLink
         * @static
         * @param {fs.ISymLink=} [properties] Properties to set
         * @returns {fs.SymLink} SymLink instance
         */
        SymLink.create = function create(properties) {
            return new SymLink(properties);
        };

        /**
         * Encodes the specified SymLink message. Does not implicitly {@link fs.SymLink.verify|verify} messages.
         * @function encode
         * @memberof fs.SymLink
         * @static
         * @param {fs.ISymLink} message SymLink message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SymLink.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.readonly != null && Object.hasOwnProperty.call(message, "readonly"))
                writer.uint32(/* id 1, wireType 0 =*/8).bool(message.readonly);
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                $root.common.BooleanValue.encode(message.isFile, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                $root.common.BooleanValue.encode(message.isFolder, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl"))
                $root.common.ObjectReference.encode(message.impl, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified SymLink message, length delimited. Does not implicitly {@link fs.SymLink.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.SymLink
         * @static
         * @param {fs.ISymLink} message SymLink message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SymLink.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a SymLink message from the specified reader or buffer.
         * @function decode
         * @memberof fs.SymLink
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.SymLink} SymLink
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SymLink.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SymLink();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.readonly = reader.bool();
                        break;
                    }
                case 2: {
                        message.isFile = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.isFolder = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.impl = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a SymLink message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.SymLink
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.SymLink} SymLink
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SymLink.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a SymLink message.
         * @function verify
         * @memberof fs.SymLink
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        SymLink.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.readonly != null && Object.hasOwnProperty.call(message, "readonly"))
                if (typeof message.readonly !== "boolean")
                    return "readonly: boolean expected";
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile")) {
                var error = $root.common.BooleanValue.verify(message.isFile, long + 1);
                if (error)
                    return "isFile." + error;
            }
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder")) {
                var error = $root.common.BooleanValue.verify(message.isFolder, long + 1);
                if (error)
                    return "isFolder." + error;
            }
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl")) {
                var error = $root.common.ObjectReference.verify(message.impl, long + 1);
                if (error)
                    return "impl." + error;
            }
            return null;
        };

        /**
         * Creates a SymLink message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.SymLink
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.SymLink} SymLink
         */
        SymLink.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.SymLink)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.SymLink: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.SymLink();
            if (object.readonly != null)
                message.readonly = Boolean(object.readonly);
            if (object.isFile != null) {
                if (!$util.isObject(object.isFile))
                    throw TypeError(".fs.SymLink.isFile: object expected");
                message.isFile = $root.common.BooleanValue.fromObject(object.isFile, long + 1);
            }
            if (object.isFolder != null) {
                if (!$util.isObject(object.isFolder))
                    throw TypeError(".fs.SymLink.isFolder: object expected");
                message.isFolder = $root.common.BooleanValue.fromObject(object.isFolder, long + 1);
            }
            if (object.impl != null) {
                if (!$util.isObject(object.impl))
                    throw TypeError(".fs.SymLink.impl: object expected");
                message.impl = $root.common.ObjectReference.fromObject(object.impl, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a SymLink message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.SymLink
         * @static
         * @param {fs.SymLink} message SymLink
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        SymLink.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.readonly = false;
                object.isFile = null;
                object.isFolder = null;
                object.impl = null;
            }
            if (message.readonly != null && Object.hasOwnProperty.call(message, "readonly"))
                object.readonly = message.readonly;
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                object.isFile = $root.common.BooleanValue.toObject(message.isFile, options, q + 1);
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                object.isFolder = $root.common.BooleanValue.toObject(message.isFolder, options, q + 1);
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl"))
                object.impl = $root.common.ObjectReference.toObject(message.impl, options, q + 1);
            return object;
        };

        /**
         * Converts this SymLink to JSON.
         * @function toJSON
         * @memberof fs.SymLink
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        SymLink.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for SymLink
         * @function getTypeUrl
         * @memberof fs.SymLink
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        SymLink.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.SymLink";
        };

        return SymLink;
    })();

    fs.SymLinkTargetReplyBody = (function() {

        /**
         * Properties of a SymLinkTargetReplyBody.
         * @memberof fs
         * @interface ISymLinkTargetReplyBody
         * @property {fs.IFS|null} [fs] SymLinkTargetReplyBody fs
         * @property {file.IFile|null} [file] SymLinkTargetReplyBody file
         */

        /**
         * Constructs a new SymLinkTargetReplyBody.
         * @memberof fs
         * @classdesc Represents a SymLinkTargetReplyBody.
         * @implements ISymLinkTargetReplyBody
         * @constructor
         * @param {fs.ISymLinkTargetReplyBody=} [properties] Properties to set
         */
        function SymLinkTargetReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * SymLinkTargetReplyBody fs.
         * @member {fs.IFS|null|undefined} fs
         * @memberof fs.SymLinkTargetReplyBody
         * @instance
         */
        SymLinkTargetReplyBody.prototype.fs = null;

        /**
         * SymLinkTargetReplyBody file.
         * @member {file.IFile|null|undefined} file
         * @memberof fs.SymLinkTargetReplyBody
         * @instance
         */
        SymLinkTargetReplyBody.prototype.file = null;

        /**
         * Creates a new SymLinkTargetReplyBody instance using the specified properties.
         * @function create
         * @memberof fs.SymLinkTargetReplyBody
         * @static
         * @param {fs.ISymLinkTargetReplyBody=} [properties] Properties to set
         * @returns {fs.SymLinkTargetReplyBody} SymLinkTargetReplyBody instance
         */
        SymLinkTargetReplyBody.create = function create(properties) {
            return new SymLinkTargetReplyBody(properties);
        };

        /**
         * Encodes the specified SymLinkTargetReplyBody message. Does not implicitly {@link fs.SymLinkTargetReplyBody.verify|verify} messages.
         * @function encode
         * @memberof fs.SymLinkTargetReplyBody
         * @static
         * @param {fs.ISymLinkTargetReplyBody} message SymLinkTargetReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SymLinkTargetReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.fs != null && Object.hasOwnProperty.call(message, "fs"))
                $root.fs.FS.encode(message.fs, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                $root.file.File.encode(message.file, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified SymLinkTargetReplyBody message, length delimited. Does not implicitly {@link fs.SymLinkTargetReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.SymLinkTargetReplyBody
         * @static
         * @param {fs.ISymLinkTargetReplyBody} message SymLinkTargetReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SymLinkTargetReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a SymLinkTargetReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.SymLinkTargetReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.SymLinkTargetReplyBody} SymLinkTargetReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SymLinkTargetReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SymLinkTargetReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.fs = $root.fs.FS.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.file = $root.file.File.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a SymLinkTargetReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.SymLinkTargetReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.SymLinkTargetReplyBody} SymLinkTargetReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SymLinkTargetReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a SymLinkTargetReplyBody message.
         * @function verify
         * @memberof fs.SymLinkTargetReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        SymLinkTargetReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.fs != null && Object.hasOwnProperty.call(message, "fs")) {
                var error = $root.fs.FS.verify(message.fs, long + 1);
                if (error)
                    return "fs." + error;
            }
            if (message.file != null && Object.hasOwnProperty.call(message, "file")) {
                var error = $root.file.File.verify(message.file, long + 1);
                if (error)
                    return "file." + error;
            }
            return null;
        };

        /**
         * Creates a SymLinkTargetReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.SymLinkTargetReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.SymLinkTargetReplyBody} SymLinkTargetReplyBody
         */
        SymLinkTargetReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.SymLinkTargetReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.SymLinkTargetReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.SymLinkTargetReplyBody();
            if (object.fs != null) {
                if (!$util.isObject(object.fs))
                    throw TypeError(".fs.SymLinkTargetReplyBody.fs: object expected");
                message.fs = $root.fs.FS.fromObject(object.fs, long + 1);
            }
            if (object.file != null) {
                if (!$util.isObject(object.file))
                    throw TypeError(".fs.SymLinkTargetReplyBody.file: object expected");
                message.file = $root.file.File.fromObject(object.file, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a SymLinkTargetReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.SymLinkTargetReplyBody
         * @static
         * @param {fs.SymLinkTargetReplyBody} message SymLinkTargetReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        SymLinkTargetReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.fs = null;
                object.file = null;
            }
            if (message.fs != null && Object.hasOwnProperty.call(message, "fs"))
                object.fs = $root.fs.FS.toObject(message.fs, options, q + 1);
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                object.file = $root.file.File.toObject(message.file, options, q + 1);
            return object;
        };

        /**
         * Converts this SymLinkTargetReplyBody to JSON.
         * @function toJSON
         * @memberof fs.SymLinkTargetReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        SymLinkTargetReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for SymLinkTargetReplyBody
         * @function getTypeUrl
         * @memberof fs.SymLinkTargetReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        SymLinkTargetReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.SymLinkTargetReplyBody";
        };

        return SymLinkTargetReplyBody;
    })();

    fs.WatchTreeRequestBody = (function() {

        /**
         * Properties of a WatchTreeRequestBody.
         * @memberof fs
         * @interface IWatchTreeRequestBody
         * @property {string|null} [path] WatchTreeRequestBody path
         * @property {common.IUInt32Value|null} [depth] WatchTreeRequestBody depth
         */

        /**
         * Constructs a new WatchTreeRequestBody.
         * @memberof fs
         * @classdesc Represents a WatchTreeRequestBody.
         * @implements IWatchTreeRequestBody
         * @constructor
         * @param {fs.IWatchTreeRequestBody=} [properties] Properties to set
         */
        function WatchTreeRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * WatchTreeRequestBody path.
         * @member {string} path
         * @memberof fs.WatchTreeRequestBody
         * @instance
         */
        WatchTreeRequestBody.prototype.path = "";

        /**
         * WatchTreeRequestBody depth.
         * @member {common.IUInt32Value|null|undefined} depth
         * @memberof fs.WatchTreeRequestBody
         * @instance
         */
        WatchTreeRequestBody.prototype.depth = null;

        /**
         * Creates a new WatchTreeRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.WatchTreeRequestBody
         * @static
         * @param {fs.IWatchTreeRequestBody=} [properties] Properties to set
         * @returns {fs.WatchTreeRequestBody} WatchTreeRequestBody instance
         */
        WatchTreeRequestBody.create = function create(properties) {
            return new WatchTreeRequestBody(properties);
        };

        /**
         * Encodes the specified WatchTreeRequestBody message. Does not implicitly {@link fs.WatchTreeRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.WatchTreeRequestBody
         * @static
         * @param {fs.IWatchTreeRequestBody} message WatchTreeRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WatchTreeRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.depth != null && Object.hasOwnProperty.call(message, "depth"))
                $root.common.UInt32Value.encode(message.depth, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified WatchTreeRequestBody message, length delimited. Does not implicitly {@link fs.WatchTreeRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.WatchTreeRequestBody
         * @static
         * @param {fs.IWatchTreeRequestBody} message WatchTreeRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WatchTreeRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a WatchTreeRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.WatchTreeRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.WatchTreeRequestBody} WatchTreeRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WatchTreeRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.WatchTreeRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.depth = $root.common.UInt32Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a WatchTreeRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.WatchTreeRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.WatchTreeRequestBody} WatchTreeRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WatchTreeRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a WatchTreeRequestBody message.
         * @function verify
         * @memberof fs.WatchTreeRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        WatchTreeRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.depth != null && Object.hasOwnProperty.call(message, "depth")) {
                var error = $root.common.UInt32Value.verify(message.depth, long + 1);
                if (error)
                    return "depth." + error;
            }
            return null;
        };

        /**
         * Creates a WatchTreeRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.WatchTreeRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.WatchTreeRequestBody} WatchTreeRequestBody
         */
        WatchTreeRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.WatchTreeRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.WatchTreeRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.WatchTreeRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.depth != null) {
                if (!$util.isObject(object.depth))
                    throw TypeError(".fs.WatchTreeRequestBody.depth: object expected");
                message.depth = $root.common.UInt32Value.fromObject(object.depth, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a WatchTreeRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.WatchTreeRequestBody
         * @static
         * @param {fs.WatchTreeRequestBody} message WatchTreeRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        WatchTreeRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.depth = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.depth != null && Object.hasOwnProperty.call(message, "depth"))
                object.depth = $root.common.UInt32Value.toObject(message.depth, options, q + 1);
            return object;
        };

        /**
         * Converts this WatchTreeRequestBody to JSON.
         * @function toJSON
         * @memberof fs.WatchTreeRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        WatchTreeRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for WatchTreeRequestBody
         * @function getTypeUrl
         * @memberof fs.WatchTreeRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        WatchTreeRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.WatchTreeRequestBody";
        };

        return WatchTreeRequestBody;
    })();

    fs.ListFolderReplyBody = (function() {

        /**
         * Properties of a ListFolderReplyBody.
         * @memberof fs
         * @interface IListFolderReplyBody
         * @property {Array.<fs.IListingEntryMsg>|null} [entries] ListFolderReplyBody entries
         */

        /**
         * Constructs a new ListFolderReplyBody.
         * @memberof fs
         * @classdesc Represents a ListFolderReplyBody.
         * @implements IListFolderReplyBody
         * @constructor
         * @param {fs.IListFolderReplyBody=} [properties] Properties to set
         */
        function ListFolderReplyBody(properties) {
            this.entries = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ListFolderReplyBody entries.
         * @member {Array.<fs.IListingEntryMsg>} entries
         * @memberof fs.ListFolderReplyBody
         * @instance
         */
        ListFolderReplyBody.prototype.entries = $util.emptyArray;

        /**
         * Creates a new ListFolderReplyBody instance using the specified properties.
         * @function create
         * @memberof fs.ListFolderReplyBody
         * @static
         * @param {fs.IListFolderReplyBody=} [properties] Properties to set
         * @returns {fs.ListFolderReplyBody} ListFolderReplyBody instance
         */
        ListFolderReplyBody.create = function create(properties) {
            return new ListFolderReplyBody(properties);
        };

        /**
         * Encodes the specified ListFolderReplyBody message. Does not implicitly {@link fs.ListFolderReplyBody.verify|verify} messages.
         * @function encode
         * @memberof fs.ListFolderReplyBody
         * @static
         * @param {fs.IListFolderReplyBody} message ListFolderReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ListFolderReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.entries != null && message.entries.length)
                for (var i = 0; i < message.entries.length; ++i)
                    $root.fs.ListingEntryMsg.encode(message.entries[i], writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified ListFolderReplyBody message, length delimited. Does not implicitly {@link fs.ListFolderReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.ListFolderReplyBody
         * @static
         * @param {fs.IListFolderReplyBody} message ListFolderReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ListFolderReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a ListFolderReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.ListFolderReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.ListFolderReplyBody} ListFolderReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ListFolderReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.ListFolderReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.entries && message.entries.length))
                            message.entries = [];
                        message.entries.push($root.fs.ListingEntryMsg.decode(reader, reader.uint32(), undefined, long + 1));
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a ListFolderReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.ListFolderReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.ListFolderReplyBody} ListFolderReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ListFolderReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a ListFolderReplyBody message.
         * @function verify
         * @memberof fs.ListFolderReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ListFolderReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.entries != null && Object.hasOwnProperty.call(message, "entries")) {
                if (!Array.isArray(message.entries))
                    return "entries: array expected";
                for (var i = 0; i < message.entries.length; ++i) {
                    var error = $root.fs.ListingEntryMsg.verify(message.entries[i], long + 1);
                    if (error)
                        return "entries." + error;
                }
            }
            return null;
        };

        /**
         * Creates a ListFolderReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.ListFolderReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.ListFolderReplyBody} ListFolderReplyBody
         */
        ListFolderReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.ListFolderReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.ListFolderReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.ListFolderReplyBody();
            if (object.entries) {
                if (!Array.isArray(object.entries))
                    throw TypeError(".fs.ListFolderReplyBody.entries: array expected");
                message.entries = [];
                for (var i = 0; i < object.entries.length; ++i) {
                    if (!$util.isObject(object.entries[i]))
                        throw TypeError(".fs.ListFolderReplyBody.entries: object expected");
                    message.entries[i] = $root.fs.ListingEntryMsg.fromObject(object.entries[i], long + 1);
                }
            }
            return message;
        };

        /**
         * Creates a plain object from a ListFolderReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.ListFolderReplyBody
         * @static
         * @param {fs.ListFolderReplyBody} message ListFolderReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ListFolderReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.entries = [];
            if (message.entries && message.entries.length) {
                object.entries = [];
                for (var j = 0; j < message.entries.length; ++j)
                    object.entries[j] = $root.fs.ListingEntryMsg.toObject(message.entries[j], options, q + 1);
            }
            return object;
        };

        /**
         * Converts this ListFolderReplyBody to JSON.
         * @function toJSON
         * @memberof fs.ListFolderReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ListFolderReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ListFolderReplyBody
         * @function getTypeUrl
         * @memberof fs.ListFolderReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ListFolderReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.ListFolderReplyBody";
        };

        return ListFolderReplyBody;
    })();

    fs.ListingEntryMsg = (function() {

        /**
         * Properties of a ListingEntryMsg.
         * @memberof fs
         * @interface IListingEntryMsg
         * @property {string|null} [name] ListingEntryMsg name
         * @property {common.IBooleanValue|null} [isFile] ListingEntryMsg isFile
         * @property {common.IBooleanValue|null} [isFolder] ListingEntryMsg isFolder
         * @property {common.IBooleanValue|null} [isLink] ListingEntryMsg isLink
         */

        /**
         * Constructs a new ListingEntryMsg.
         * @memberof fs
         * @classdesc Represents a ListingEntryMsg.
         * @implements IListingEntryMsg
         * @constructor
         * @param {fs.IListingEntryMsg=} [properties] Properties to set
         */
        function ListingEntryMsg(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ListingEntryMsg name.
         * @member {string} name
         * @memberof fs.ListingEntryMsg
         * @instance
         */
        ListingEntryMsg.prototype.name = "";

        /**
         * ListingEntryMsg isFile.
         * @member {common.IBooleanValue|null|undefined} isFile
         * @memberof fs.ListingEntryMsg
         * @instance
         */
        ListingEntryMsg.prototype.isFile = null;

        /**
         * ListingEntryMsg isFolder.
         * @member {common.IBooleanValue|null|undefined} isFolder
         * @memberof fs.ListingEntryMsg
         * @instance
         */
        ListingEntryMsg.prototype.isFolder = null;

        /**
         * ListingEntryMsg isLink.
         * @member {common.IBooleanValue|null|undefined} isLink
         * @memberof fs.ListingEntryMsg
         * @instance
         */
        ListingEntryMsg.prototype.isLink = null;

        /**
         * Creates a new ListingEntryMsg instance using the specified properties.
         * @function create
         * @memberof fs.ListingEntryMsg
         * @static
         * @param {fs.IListingEntryMsg=} [properties] Properties to set
         * @returns {fs.ListingEntryMsg} ListingEntryMsg instance
         */
        ListingEntryMsg.create = function create(properties) {
            return new ListingEntryMsg(properties);
        };

        /**
         * Encodes the specified ListingEntryMsg message. Does not implicitly {@link fs.ListingEntryMsg.verify|verify} messages.
         * @function encode
         * @memberof fs.ListingEntryMsg
         * @static
         * @param {fs.IListingEntryMsg} message ListingEntryMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ListingEntryMsg.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                $root.common.BooleanValue.encode(message.isFile, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                $root.common.BooleanValue.encode(message.isFolder, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink"))
                $root.common.BooleanValue.encode(message.isLink, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified ListingEntryMsg message, length delimited. Does not implicitly {@link fs.ListingEntryMsg.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.ListingEntryMsg
         * @static
         * @param {fs.IListingEntryMsg} message ListingEntryMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ListingEntryMsg.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a ListingEntryMsg message from the specified reader or buffer.
         * @function decode
         * @memberof fs.ListingEntryMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.ListingEntryMsg} ListingEntryMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ListingEntryMsg.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.ListingEntryMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.name = reader.string();
                        break;
                    }
                case 2: {
                        message.isFile = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.isFolder = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.isLink = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a ListingEntryMsg message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.ListingEntryMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.ListingEntryMsg} ListingEntryMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ListingEntryMsg.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a ListingEntryMsg message.
         * @function verify
         * @memberof fs.ListingEntryMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ListingEntryMsg.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile")) {
                var error = $root.common.BooleanValue.verify(message.isFile, long + 1);
                if (error)
                    return "isFile." + error;
            }
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder")) {
                var error = $root.common.BooleanValue.verify(message.isFolder, long + 1);
                if (error)
                    return "isFolder." + error;
            }
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink")) {
                var error = $root.common.BooleanValue.verify(message.isLink, long + 1);
                if (error)
                    return "isLink." + error;
            }
            return null;
        };

        /**
         * Creates a ListingEntryMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.ListingEntryMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.ListingEntryMsg} ListingEntryMsg
         */
        ListingEntryMsg.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.ListingEntryMsg)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.ListingEntryMsg: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.ListingEntryMsg();
            if (object.name != null)
                message.name = String(object.name);
            if (object.isFile != null) {
                if (!$util.isObject(object.isFile))
                    throw TypeError(".fs.ListingEntryMsg.isFile: object expected");
                message.isFile = $root.common.BooleanValue.fromObject(object.isFile, long + 1);
            }
            if (object.isFolder != null) {
                if (!$util.isObject(object.isFolder))
                    throw TypeError(".fs.ListingEntryMsg.isFolder: object expected");
                message.isFolder = $root.common.BooleanValue.fromObject(object.isFolder, long + 1);
            }
            if (object.isLink != null) {
                if (!$util.isObject(object.isLink))
                    throw TypeError(".fs.ListingEntryMsg.isLink: object expected");
                message.isLink = $root.common.BooleanValue.fromObject(object.isLink, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a ListingEntryMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.ListingEntryMsg
         * @static
         * @param {fs.ListingEntryMsg} message ListingEntryMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ListingEntryMsg.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.name = "";
                object.isFile = null;
                object.isFolder = null;
                object.isLink = null;
            }
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                object.name = message.name;
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                object.isFile = $root.common.BooleanValue.toObject(message.isFile, options, q + 1);
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                object.isFolder = $root.common.BooleanValue.toObject(message.isFolder, options, q + 1);
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink"))
                object.isLink = $root.common.BooleanValue.toObject(message.isLink, options, q + 1);
            return object;
        };

        /**
         * Converts this ListingEntryMsg to JSON.
         * @function toJSON
         * @memberof fs.ListingEntryMsg
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ListingEntryMsg.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ListingEntryMsg
         * @function getTypeUrl
         * @memberof fs.ListingEntryMsg
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ListingEntryMsg.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.ListingEntryMsg";
        };

        return ListingEntryMsg;
    })();

    fs.ReadBytesRequestBody = (function() {

        /**
         * Properties of a ReadBytesRequestBody.
         * @memberof fs
         * @interface IReadBytesRequestBody
         * @property {string|null} [path] ReadBytesRequestBody path
         * @property {common.IUInt64Value|null} [start] ReadBytesRequestBody start
         * @property {common.IUInt64Value|null} [end] ReadBytesRequestBody end
         */

        /**
         * Constructs a new ReadBytesRequestBody.
         * @memberof fs
         * @classdesc Represents a ReadBytesRequestBody.
         * @implements IReadBytesRequestBody
         * @constructor
         * @param {fs.IReadBytesRequestBody=} [properties] Properties to set
         */
        function ReadBytesRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ReadBytesRequestBody path.
         * @member {string} path
         * @memberof fs.ReadBytesRequestBody
         * @instance
         */
        ReadBytesRequestBody.prototype.path = "";

        /**
         * ReadBytesRequestBody start.
         * @member {common.IUInt64Value|null|undefined} start
         * @memberof fs.ReadBytesRequestBody
         * @instance
         */
        ReadBytesRequestBody.prototype.start = null;

        /**
         * ReadBytesRequestBody end.
         * @member {common.IUInt64Value|null|undefined} end
         * @memberof fs.ReadBytesRequestBody
         * @instance
         */
        ReadBytesRequestBody.prototype.end = null;

        /**
         * Creates a new ReadBytesRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.ReadBytesRequestBody
         * @static
         * @param {fs.IReadBytesRequestBody=} [properties] Properties to set
         * @returns {fs.ReadBytesRequestBody} ReadBytesRequestBody instance
         */
        ReadBytesRequestBody.create = function create(properties) {
            return new ReadBytesRequestBody(properties);
        };

        /**
         * Encodes the specified ReadBytesRequestBody message. Does not implicitly {@link fs.ReadBytesRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.ReadBytesRequestBody
         * @static
         * @param {fs.IReadBytesRequestBody} message ReadBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ReadBytesRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                $root.common.UInt64Value.encode(message.start, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                $root.common.UInt64Value.encode(message.end, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified ReadBytesRequestBody message, length delimited. Does not implicitly {@link fs.ReadBytesRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.ReadBytesRequestBody
         * @static
         * @param {fs.IReadBytesRequestBody} message ReadBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ReadBytesRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a ReadBytesRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.ReadBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.ReadBytesRequestBody} ReadBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ReadBytesRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.ReadBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.start = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.end = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a ReadBytesRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.ReadBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.ReadBytesRequestBody} ReadBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ReadBytesRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a ReadBytesRequestBody message.
         * @function verify
         * @memberof fs.ReadBytesRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ReadBytesRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.start != null && Object.hasOwnProperty.call(message, "start")) {
                var error = $root.common.UInt64Value.verify(message.start, long + 1);
                if (error)
                    return "start." + error;
            }
            if (message.end != null && Object.hasOwnProperty.call(message, "end")) {
                var error = $root.common.UInt64Value.verify(message.end, long + 1);
                if (error)
                    return "end." + error;
            }
            return null;
        };

        /**
         * Creates a ReadBytesRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.ReadBytesRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.ReadBytesRequestBody} ReadBytesRequestBody
         */
        ReadBytesRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.ReadBytesRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.ReadBytesRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.ReadBytesRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.start != null) {
                if (!$util.isObject(object.start))
                    throw TypeError(".fs.ReadBytesRequestBody.start: object expected");
                message.start = $root.common.UInt64Value.fromObject(object.start, long + 1);
            }
            if (object.end != null) {
                if (!$util.isObject(object.end))
                    throw TypeError(".fs.ReadBytesRequestBody.end: object expected");
                message.end = $root.common.UInt64Value.fromObject(object.end, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a ReadBytesRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.ReadBytesRequestBody
         * @static
         * @param {fs.ReadBytesRequestBody} message ReadBytesRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ReadBytesRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.start = null;
                object.end = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                object.start = $root.common.UInt64Value.toObject(message.start, options, q + 1);
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                object.end = $root.common.UInt64Value.toObject(message.end, options, q + 1);
            return object;
        };

        /**
         * Converts this ReadBytesRequestBody to JSON.
         * @function toJSON
         * @memberof fs.ReadBytesRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ReadBytesRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ReadBytesRequestBody
         * @function getTypeUrl
         * @memberof fs.ReadBytesRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ReadBytesRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.ReadBytesRequestBody";
        };

        return ReadBytesRequestBody;
    })();

    fs.SelectRequestBody = (function() {

        /**
         * Properties of a SelectRequestBody.
         * @memberof fs
         * @interface ISelectRequestBody
         * @property {string|null} [path] SelectRequestBody path
         * @property {fs.SelectRequestBody.ISelectCriteria|null} [criteria] SelectRequestBody criteria
         */

        /**
         * Constructs a new SelectRequestBody.
         * @memberof fs
         * @classdesc Represents a SelectRequestBody.
         * @implements ISelectRequestBody
         * @constructor
         * @param {fs.ISelectRequestBody=} [properties] Properties to set
         */
        function SelectRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * SelectRequestBody path.
         * @member {string} path
         * @memberof fs.SelectRequestBody
         * @instance
         */
        SelectRequestBody.prototype.path = "";

        /**
         * SelectRequestBody criteria.
         * @member {fs.SelectRequestBody.ISelectCriteria|null|undefined} criteria
         * @memberof fs.SelectRequestBody
         * @instance
         */
        SelectRequestBody.prototype.criteria = null;

        /**
         * Creates a new SelectRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.SelectRequestBody
         * @static
         * @param {fs.ISelectRequestBody=} [properties] Properties to set
         * @returns {fs.SelectRequestBody} SelectRequestBody instance
         */
        SelectRequestBody.create = function create(properties) {
            return new SelectRequestBody(properties);
        };

        /**
         * Encodes the specified SelectRequestBody message. Does not implicitly {@link fs.SelectRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.SelectRequestBody
         * @static
         * @param {fs.ISelectRequestBody} message SelectRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SelectRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.criteria != null && Object.hasOwnProperty.call(message, "criteria"))
                $root.fs.SelectRequestBody.SelectCriteria.encode(message.criteria, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified SelectRequestBody message, length delimited. Does not implicitly {@link fs.SelectRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.SelectRequestBody
         * @static
         * @param {fs.ISelectRequestBody} message SelectRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SelectRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a SelectRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.SelectRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.SelectRequestBody} SelectRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SelectRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SelectRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.criteria = $root.fs.SelectRequestBody.SelectCriteria.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a SelectRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.SelectRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.SelectRequestBody} SelectRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SelectRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a SelectRequestBody message.
         * @function verify
         * @memberof fs.SelectRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        SelectRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.criteria != null && Object.hasOwnProperty.call(message, "criteria")) {
                var error = $root.fs.SelectRequestBody.SelectCriteria.verify(message.criteria, long + 1);
                if (error)
                    return "criteria." + error;
            }
            return null;
        };

        /**
         * Creates a SelectRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.SelectRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.SelectRequestBody} SelectRequestBody
         */
        SelectRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.SelectRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.SelectRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.SelectRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.criteria != null) {
                if (!$util.isObject(object.criteria))
                    throw TypeError(".fs.SelectRequestBody.criteria: object expected");
                message.criteria = $root.fs.SelectRequestBody.SelectCriteria.fromObject(object.criteria, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a SelectRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.SelectRequestBody
         * @static
         * @param {fs.SelectRequestBody} message SelectRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        SelectRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.criteria = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.criteria != null && Object.hasOwnProperty.call(message, "criteria"))
                object.criteria = $root.fs.SelectRequestBody.SelectCriteria.toObject(message.criteria, options, q + 1);
            return object;
        };

        /**
         * Converts this SelectRequestBody to JSON.
         * @function toJSON
         * @memberof fs.SelectRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        SelectRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for SelectRequestBody
         * @function getTypeUrl
         * @memberof fs.SelectRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        SelectRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.SelectRequestBody";
        };

        SelectRequestBody.SelectCriteria = (function() {

            /**
             * Properties of a SelectCriteria.
             * @memberof fs.SelectRequestBody
             * @interface ISelectCriteria
             * @property {common.IStringValue|null} [exactName] SelectCriteria exactName
             * @property {common.IStringValue|null} [pattern] SelectCriteria pattern
             * @property {common.IStringValue|null} [regexp] SelectCriteria regexp
             * @property {common.IUInt32Value|null} [depth] SelectCriteria depth
             * @property {Array.<string>|null} [type] SelectCriteria type
             * @property {string|null} [action] SelectCriteria action
             */

            /**
             * Constructs a new SelectCriteria.
             * @memberof fs.SelectRequestBody
             * @classdesc Represents a SelectCriteria.
             * @implements ISelectCriteria
             * @constructor
             * @param {fs.SelectRequestBody.ISelectCriteria=} [properties] Properties to set
             */
            function SelectCriteria(properties) {
                this.type = [];
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * SelectCriteria exactName.
             * @member {common.IStringValue|null|undefined} exactName
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @instance
             */
            SelectCriteria.prototype.exactName = null;

            /**
             * SelectCriteria pattern.
             * @member {common.IStringValue|null|undefined} pattern
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @instance
             */
            SelectCriteria.prototype.pattern = null;

            /**
             * SelectCriteria regexp.
             * @member {common.IStringValue|null|undefined} regexp
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @instance
             */
            SelectCriteria.prototype.regexp = null;

            /**
             * SelectCriteria depth.
             * @member {common.IUInt32Value|null|undefined} depth
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @instance
             */
            SelectCriteria.prototype.depth = null;

            /**
             * SelectCriteria type.
             * @member {Array.<string>} type
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @instance
             */
            SelectCriteria.prototype.type = $util.emptyArray;

            /**
             * SelectCriteria action.
             * @member {string} action
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @instance
             */
            SelectCriteria.prototype.action = "";

            /**
             * Creates a new SelectCriteria instance using the specified properties.
             * @function create
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @static
             * @param {fs.SelectRequestBody.ISelectCriteria=} [properties] Properties to set
             * @returns {fs.SelectRequestBody.SelectCriteria} SelectCriteria instance
             */
            SelectCriteria.create = function create(properties) {
                return new SelectCriteria(properties);
            };

            /**
             * Encodes the specified SelectCriteria message. Does not implicitly {@link fs.SelectRequestBody.SelectCriteria.verify|verify} messages.
             * @function encode
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @static
             * @param {fs.SelectRequestBody.ISelectCriteria} message SelectCriteria message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            SelectCriteria.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.exactName != null && Object.hasOwnProperty.call(message, "exactName"))
                    $root.common.StringValue.encode(message.exactName, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
                if (message.pattern != null && Object.hasOwnProperty.call(message, "pattern"))
                    $root.common.StringValue.encode(message.pattern, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
                if (message.regexp != null && Object.hasOwnProperty.call(message, "regexp"))
                    $root.common.StringValue.encode(message.regexp, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
                if (message.depth != null && Object.hasOwnProperty.call(message, "depth"))
                    $root.common.UInt32Value.encode(message.depth, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
                if (message.type != null && message.type.length)
                    for (var i = 0; i < message.type.length; ++i)
                        writer.uint32(/* id 5, wireType 2 =*/42).string(message.type[i]);
                if (message.action != null && Object.hasOwnProperty.call(message, "action"))
                    writer.uint32(/* id 6, wireType 2 =*/50).string(message.action);
                return writer;
            };

            /**
             * Encodes the specified SelectCriteria message, length delimited. Does not implicitly {@link fs.SelectRequestBody.SelectCriteria.verify|verify} messages.
             * @function encodeDelimited
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @static
             * @param {fs.SelectRequestBody.ISelectCriteria} message SelectCriteria message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            SelectCriteria.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes a SelectCriteria message from the specified reader or buffer.
             * @function decode
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {fs.SelectRequestBody.SelectCriteria} SelectCriteria
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            SelectCriteria.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SelectRequestBody.SelectCriteria();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.exactName = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 2: {
                            message.pattern = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 3: {
                            message.regexp = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 4: {
                            message.depth = $root.common.UInt32Value.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 5: {
                            if (!(message.type && message.type.length))
                                message.type = [];
                            message.type.push(reader.string());
                            break;
                        }
                    case 6: {
                            message.action = reader.string();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a SelectCriteria message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {fs.SelectRequestBody.SelectCriteria} SelectCriteria
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            SelectCriteria.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a SelectCriteria message.
             * @function verify
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            SelectCriteria.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.exactName != null && Object.hasOwnProperty.call(message, "exactName")) {
                    var error = $root.common.StringValue.verify(message.exactName, long + 1);
                    if (error)
                        return "exactName." + error;
                }
                if (message.pattern != null && Object.hasOwnProperty.call(message, "pattern")) {
                    var error = $root.common.StringValue.verify(message.pattern, long + 1);
                    if (error)
                        return "pattern." + error;
                }
                if (message.regexp != null && Object.hasOwnProperty.call(message, "regexp")) {
                    var error = $root.common.StringValue.verify(message.regexp, long + 1);
                    if (error)
                        return "regexp." + error;
                }
                if (message.depth != null && Object.hasOwnProperty.call(message, "depth")) {
                    var error = $root.common.UInt32Value.verify(message.depth, long + 1);
                    if (error)
                        return "depth." + error;
                }
                if (message.type != null && Object.hasOwnProperty.call(message, "type")) {
                    if (!Array.isArray(message.type))
                        return "type: array expected";
                    for (var i = 0; i < message.type.length; ++i)
                        if (!$util.isString(message.type[i]))
                            return "type: string[] expected";
                }
                if (message.action != null && Object.hasOwnProperty.call(message, "action"))
                    if (!$util.isString(message.action))
                        return "action: string expected";
                return null;
            };

            /**
             * Creates a SelectCriteria message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {fs.SelectRequestBody.SelectCriteria} SelectCriteria
             */
            SelectCriteria.fromObject = function fromObject(object, long) {
                if (object instanceof $root.fs.SelectRequestBody.SelectCriteria)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".fs.SelectRequestBody.SelectCriteria: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.fs.SelectRequestBody.SelectCriteria();
                if (object.exactName != null) {
                    if (!$util.isObject(object.exactName))
                        throw TypeError(".fs.SelectRequestBody.SelectCriteria.exactName: object expected");
                    message.exactName = $root.common.StringValue.fromObject(object.exactName, long + 1);
                }
                if (object.pattern != null) {
                    if (!$util.isObject(object.pattern))
                        throw TypeError(".fs.SelectRequestBody.SelectCriteria.pattern: object expected");
                    message.pattern = $root.common.StringValue.fromObject(object.pattern, long + 1);
                }
                if (object.regexp != null) {
                    if (!$util.isObject(object.regexp))
                        throw TypeError(".fs.SelectRequestBody.SelectCriteria.regexp: object expected");
                    message.regexp = $root.common.StringValue.fromObject(object.regexp, long + 1);
                }
                if (object.depth != null) {
                    if (!$util.isObject(object.depth))
                        throw TypeError(".fs.SelectRequestBody.SelectCriteria.depth: object expected");
                    message.depth = $root.common.UInt32Value.fromObject(object.depth, long + 1);
                }
                if (object.type) {
                    if (!Array.isArray(object.type))
                        throw TypeError(".fs.SelectRequestBody.SelectCriteria.type: array expected");
                    message.type = [];
                    for (var i = 0; i < object.type.length; ++i)
                        message.type[i] = String(object.type[i]);
                }
                if (object.action != null)
                    message.action = String(object.action);
                return message;
            };

            /**
             * Creates a plain object from a SelectCriteria message. Also converts values to other types if specified.
             * @function toObject
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @static
             * @param {fs.SelectRequestBody.SelectCriteria} message SelectCriteria
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            SelectCriteria.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.arrays || options.defaults)
                    object.type = [];
                if (options.defaults) {
                    object.exactName = null;
                    object.pattern = null;
                    object.regexp = null;
                    object.depth = null;
                    object.action = "";
                }
                if (message.exactName != null && Object.hasOwnProperty.call(message, "exactName"))
                    object.exactName = $root.common.StringValue.toObject(message.exactName, options, q + 1);
                if (message.pattern != null && Object.hasOwnProperty.call(message, "pattern"))
                    object.pattern = $root.common.StringValue.toObject(message.pattern, options, q + 1);
                if (message.regexp != null && Object.hasOwnProperty.call(message, "regexp"))
                    object.regexp = $root.common.StringValue.toObject(message.regexp, options, q + 1);
                if (message.depth != null && Object.hasOwnProperty.call(message, "depth"))
                    object.depth = $root.common.UInt32Value.toObject(message.depth, options, q + 1);
                if (message.type && message.type.length) {
                    object.type = [];
                    for (var j = 0; j < message.type.length; ++j)
                        object.type[j] = message.type[j];
                }
                if (message.action != null && Object.hasOwnProperty.call(message, "action"))
                    object.action = message.action;
                return object;
            };

            /**
             * Converts this SelectCriteria to JSON.
             * @function toJSON
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            SelectCriteria.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for SelectCriteria
             * @function getTypeUrl
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            SelectCriteria.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/fs.SelectRequestBody.SelectCriteria";
            };

            return SelectCriteria;
        })();

        return SelectRequestBody;
    })();

    fs.FSCGetRequestBody = (function() {

        /**
         * Properties of a FSCGetRequestBody.
         * @memberof fs
         * @interface IFSCGetRequestBody
         * @property {string|null} [name] FSCGetRequestBody name
         */

        /**
         * Constructs a new FSCGetRequestBody.
         * @memberof fs
         * @classdesc Represents a FSCGetRequestBody.
         * @implements IFSCGetRequestBody
         * @constructor
         * @param {fs.IFSCGetRequestBody=} [properties] Properties to set
         */
        function FSCGetRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FSCGetRequestBody name.
         * @member {string} name
         * @memberof fs.FSCGetRequestBody
         * @instance
         */
        FSCGetRequestBody.prototype.name = "";

        /**
         * Creates a new FSCGetRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.FSCGetRequestBody
         * @static
         * @param {fs.IFSCGetRequestBody=} [properties] Properties to set
         * @returns {fs.FSCGetRequestBody} FSCGetRequestBody instance
         */
        FSCGetRequestBody.create = function create(properties) {
            return new FSCGetRequestBody(properties);
        };

        /**
         * Encodes the specified FSCGetRequestBody message. Does not implicitly {@link fs.FSCGetRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.FSCGetRequestBody
         * @static
         * @param {fs.IFSCGetRequestBody} message FSCGetRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSCGetRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
            return writer;
        };

        /**
         * Encodes the specified FSCGetRequestBody message, length delimited. Does not implicitly {@link fs.FSCGetRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FSCGetRequestBody
         * @static
         * @param {fs.IFSCGetRequestBody} message FSCGetRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSCGetRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FSCGetRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FSCGetRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FSCGetRequestBody} FSCGetRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSCGetRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSCGetRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.name = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FSCGetRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FSCGetRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FSCGetRequestBody} FSCGetRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSCGetRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FSCGetRequestBody message.
         * @function verify
         * @memberof fs.FSCGetRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSCGetRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            return null;
        };

        /**
         * Creates a FSCGetRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSCGetRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSCGetRequestBody} FSCGetRequestBody
         */
        FSCGetRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FSCGetRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FSCGetRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FSCGetRequestBody();
            if (object.name != null)
                message.name = String(object.name);
            return message;
        };

        /**
         * Creates a plain object from a FSCGetRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSCGetRequestBody
         * @static
         * @param {fs.FSCGetRequestBody} message FSCGetRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSCGetRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.name = "";
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                object.name = message.name;
            return object;
        };

        /**
         * Converts this FSCGetRequestBody to JSON.
         * @function toJSON
         * @memberof fs.FSCGetRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FSCGetRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FSCGetRequestBody
         * @function getTypeUrl
         * @memberof fs.FSCGetRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FSCGetRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FSCGetRequestBody";
        };

        return FSCGetRequestBody;
    })();

    fs.FSCGetReplyBody = (function() {

        /**
         * Properties of a FSCGetReplyBody.
         * @memberof fs
         * @interface IFSCGetReplyBody
         * @property {fs.IFSItem|null} [item] FSCGetReplyBody item
         */

        /**
         * Constructs a new FSCGetReplyBody.
         * @memberof fs
         * @classdesc Represents a FSCGetReplyBody.
         * @implements IFSCGetReplyBody
         * @constructor
         * @param {fs.IFSCGetReplyBody=} [properties] Properties to set
         */
        function FSCGetReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FSCGetReplyBody item.
         * @member {fs.IFSItem|null|undefined} item
         * @memberof fs.FSCGetReplyBody
         * @instance
         */
        FSCGetReplyBody.prototype.item = null;

        /**
         * Creates a new FSCGetReplyBody instance using the specified properties.
         * @function create
         * @memberof fs.FSCGetReplyBody
         * @static
         * @param {fs.IFSCGetReplyBody=} [properties] Properties to set
         * @returns {fs.FSCGetReplyBody} FSCGetReplyBody instance
         */
        FSCGetReplyBody.create = function create(properties) {
            return new FSCGetReplyBody(properties);
        };

        /**
         * Encodes the specified FSCGetReplyBody message. Does not implicitly {@link fs.FSCGetReplyBody.verify|verify} messages.
         * @function encode
         * @memberof fs.FSCGetReplyBody
         * @static
         * @param {fs.IFSCGetReplyBody} message FSCGetReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSCGetReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                $root.fs.FSItem.encode(message.item, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FSCGetReplyBody message, length delimited. Does not implicitly {@link fs.FSCGetReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FSCGetReplyBody
         * @static
         * @param {fs.IFSCGetReplyBody} message FSCGetReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSCGetReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FSCGetReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FSCGetReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FSCGetReplyBody} FSCGetReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSCGetReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSCGetReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.item = $root.fs.FSItem.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FSCGetReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FSCGetReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FSCGetReplyBody} FSCGetReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSCGetReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FSCGetReplyBody message.
         * @function verify
         * @memberof fs.FSCGetReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSCGetReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.item != null && Object.hasOwnProperty.call(message, "item")) {
                var error = $root.fs.FSItem.verify(message.item, long + 1);
                if (error)
                    return "item." + error;
            }
            return null;
        };

        /**
         * Creates a FSCGetReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSCGetReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSCGetReplyBody} FSCGetReplyBody
         */
        FSCGetReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FSCGetReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FSCGetReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FSCGetReplyBody();
            if (object.item != null) {
                if (!$util.isObject(object.item))
                    throw TypeError(".fs.FSCGetReplyBody.item: object expected");
                message.item = $root.fs.FSItem.fromObject(object.item, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a FSCGetReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSCGetReplyBody
         * @static
         * @param {fs.FSCGetReplyBody} message FSCGetReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSCGetReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.item = null;
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                object.item = $root.fs.FSItem.toObject(message.item, options, q + 1);
            return object;
        };

        /**
         * Converts this FSCGetReplyBody to JSON.
         * @function toJSON
         * @memberof fs.FSCGetReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FSCGetReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FSCGetReplyBody
         * @function getTypeUrl
         * @memberof fs.FSCGetReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FSCGetReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FSCGetReplyBody";
        };

        return FSCGetReplyBody;
    })();

    fs.FSItem = (function() {

        /**
         * Properties of a FSItem.
         * @memberof fs
         * @interface IFSItem
         * @property {common.IBooleanValue|null} [isFile] FSItem isFile
         * @property {common.IBooleanValue|null} [isFolder] FSItem isFolder
         * @property {common.IBooleanValue|null} [isLink] FSItem isLink
         * @property {common.IBooleanValue|null} [isCollection] FSItem isCollection
         * @property {fs.FSItem.IItem|null} [item] FSItem item
         * @property {fs.FSItem.ILocation|null} [location] FSItem location
         */

        /**
         * Constructs a new FSItem.
         * @memberof fs
         * @classdesc Represents a FSItem.
         * @implements IFSItem
         * @constructor
         * @param {fs.IFSItem=} [properties] Properties to set
         */
        function FSItem(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FSItem isFile.
         * @member {common.IBooleanValue|null|undefined} isFile
         * @memberof fs.FSItem
         * @instance
         */
        FSItem.prototype.isFile = null;

        /**
         * FSItem isFolder.
         * @member {common.IBooleanValue|null|undefined} isFolder
         * @memberof fs.FSItem
         * @instance
         */
        FSItem.prototype.isFolder = null;

        /**
         * FSItem isLink.
         * @member {common.IBooleanValue|null|undefined} isLink
         * @memberof fs.FSItem
         * @instance
         */
        FSItem.prototype.isLink = null;

        /**
         * FSItem isCollection.
         * @member {common.IBooleanValue|null|undefined} isCollection
         * @memberof fs.FSItem
         * @instance
         */
        FSItem.prototype.isCollection = null;

        /**
         * FSItem item.
         * @member {fs.FSItem.IItem|null|undefined} item
         * @memberof fs.FSItem
         * @instance
         */
        FSItem.prototype.item = null;

        /**
         * FSItem location.
         * @member {fs.FSItem.ILocation|null|undefined} location
         * @memberof fs.FSItem
         * @instance
         */
        FSItem.prototype.location = null;

        /**
         * Creates a new FSItem instance using the specified properties.
         * @function create
         * @memberof fs.FSItem
         * @static
         * @param {fs.IFSItem=} [properties] Properties to set
         * @returns {fs.FSItem} FSItem instance
         */
        FSItem.create = function create(properties) {
            return new FSItem(properties);
        };

        /**
         * Encodes the specified FSItem message. Does not implicitly {@link fs.FSItem.verify|verify} messages.
         * @function encode
         * @memberof fs.FSItem
         * @static
         * @param {fs.IFSItem} message FSItem message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSItem.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                $root.common.BooleanValue.encode(message.isFile, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                $root.common.BooleanValue.encode(message.isFolder, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink"))
                $root.common.BooleanValue.encode(message.isLink, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.isCollection != null && Object.hasOwnProperty.call(message, "isCollection"))
                $root.common.BooleanValue.encode(message.isCollection, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                $root.fs.FSItem.Item.encode(message.item, writer.uint32(/* id 5, wireType 2 =*/42).fork(), q + 1).ldelim();
            if (message.location != null && Object.hasOwnProperty.call(message, "location"))
                $root.fs.FSItem.Location.encode(message.location, writer.uint32(/* id 6, wireType 2 =*/50).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FSItem message, length delimited. Does not implicitly {@link fs.FSItem.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FSItem
         * @static
         * @param {fs.IFSItem} message FSItem message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSItem.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FSItem message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FSItem
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FSItem} FSItem
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSItem.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSItem();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.isFile = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.isFolder = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.isLink = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.isCollection = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 5: {
                        message.item = $root.fs.FSItem.Item.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 6: {
                        message.location = $root.fs.FSItem.Location.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FSItem message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FSItem
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FSItem} FSItem
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSItem.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FSItem message.
         * @function verify
         * @memberof fs.FSItem
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSItem.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile")) {
                var error = $root.common.BooleanValue.verify(message.isFile, long + 1);
                if (error)
                    return "isFile." + error;
            }
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder")) {
                var error = $root.common.BooleanValue.verify(message.isFolder, long + 1);
                if (error)
                    return "isFolder." + error;
            }
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink")) {
                var error = $root.common.BooleanValue.verify(message.isLink, long + 1);
                if (error)
                    return "isLink." + error;
            }
            if (message.isCollection != null && Object.hasOwnProperty.call(message, "isCollection")) {
                var error = $root.common.BooleanValue.verify(message.isCollection, long + 1);
                if (error)
                    return "isCollection." + error;
            }
            if (message.item != null && Object.hasOwnProperty.call(message, "item")) {
                var error = $root.fs.FSItem.Item.verify(message.item, long + 1);
                if (error)
                    return "item." + error;
            }
            if (message.location != null && Object.hasOwnProperty.call(message, "location")) {
                var error = $root.fs.FSItem.Location.verify(message.location, long + 1);
                if (error)
                    return "location." + error;
            }
            return null;
        };

        /**
         * Creates a FSItem message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSItem
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSItem} FSItem
         */
        FSItem.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FSItem)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FSItem: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FSItem();
            if (object.isFile != null) {
                if (!$util.isObject(object.isFile))
                    throw TypeError(".fs.FSItem.isFile: object expected");
                message.isFile = $root.common.BooleanValue.fromObject(object.isFile, long + 1);
            }
            if (object.isFolder != null) {
                if (!$util.isObject(object.isFolder))
                    throw TypeError(".fs.FSItem.isFolder: object expected");
                message.isFolder = $root.common.BooleanValue.fromObject(object.isFolder, long + 1);
            }
            if (object.isLink != null) {
                if (!$util.isObject(object.isLink))
                    throw TypeError(".fs.FSItem.isLink: object expected");
                message.isLink = $root.common.BooleanValue.fromObject(object.isLink, long + 1);
            }
            if (object.isCollection != null) {
                if (!$util.isObject(object.isCollection))
                    throw TypeError(".fs.FSItem.isCollection: object expected");
                message.isCollection = $root.common.BooleanValue.fromObject(object.isCollection, long + 1);
            }
            if (object.item != null) {
                if (!$util.isObject(object.item))
                    throw TypeError(".fs.FSItem.item: object expected");
                message.item = $root.fs.FSItem.Item.fromObject(object.item, long + 1);
            }
            if (object.location != null) {
                if (!$util.isObject(object.location))
                    throw TypeError(".fs.FSItem.location: object expected");
                message.location = $root.fs.FSItem.Location.fromObject(object.location, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a FSItem message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSItem
         * @static
         * @param {fs.FSItem} message FSItem
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSItem.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.isFile = null;
                object.isFolder = null;
                object.isLink = null;
                object.isCollection = null;
                object.item = null;
                object.location = null;
            }
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                object.isFile = $root.common.BooleanValue.toObject(message.isFile, options, q + 1);
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                object.isFolder = $root.common.BooleanValue.toObject(message.isFolder, options, q + 1);
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink"))
                object.isLink = $root.common.BooleanValue.toObject(message.isLink, options, q + 1);
            if (message.isCollection != null && Object.hasOwnProperty.call(message, "isCollection"))
                object.isCollection = $root.common.BooleanValue.toObject(message.isCollection, options, q + 1);
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                object.item = $root.fs.FSItem.Item.toObject(message.item, options, q + 1);
            if (message.location != null && Object.hasOwnProperty.call(message, "location"))
                object.location = $root.fs.FSItem.Location.toObject(message.location, options, q + 1);
            return object;
        };

        /**
         * Converts this FSItem to JSON.
         * @function toJSON
         * @memberof fs.FSItem
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FSItem.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FSItem
         * @function getTypeUrl
         * @memberof fs.FSItem
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FSItem.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FSItem";
        };

        FSItem.Location = (function() {

            /**
             * Properties of a Location.
             * @memberof fs.FSItem
             * @interface ILocation
             * @property {fs.IFS|null} [fs] Location fs
             * @property {string|null} [path] Location path
             * @property {string|null} [storageUse] Location storageUse
             * @property {string|null} [storageType] Location storageType
             */

            /**
             * Constructs a new Location.
             * @memberof fs.FSItem
             * @classdesc Represents a Location.
             * @implements ILocation
             * @constructor
             * @param {fs.FSItem.ILocation=} [properties] Properties to set
             */
            function Location(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * Location fs.
             * @member {fs.IFS|null|undefined} fs
             * @memberof fs.FSItem.Location
             * @instance
             */
            Location.prototype.fs = null;

            /**
             * Location path.
             * @member {string} path
             * @memberof fs.FSItem.Location
             * @instance
             */
            Location.prototype.path = "";

            /**
             * Location storageUse.
             * @member {string} storageUse
             * @memberof fs.FSItem.Location
             * @instance
             */
            Location.prototype.storageUse = "";

            /**
             * Location storageType.
             * @member {string} storageType
             * @memberof fs.FSItem.Location
             * @instance
             */
            Location.prototype.storageType = "";

            /**
             * Creates a new Location instance using the specified properties.
             * @function create
             * @memberof fs.FSItem.Location
             * @static
             * @param {fs.FSItem.ILocation=} [properties] Properties to set
             * @returns {fs.FSItem.Location} Location instance
             */
            Location.create = function create(properties) {
                return new Location(properties);
            };

            /**
             * Encodes the specified Location message. Does not implicitly {@link fs.FSItem.Location.verify|verify} messages.
             * @function encode
             * @memberof fs.FSItem.Location
             * @static
             * @param {fs.FSItem.ILocation} message Location message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Location.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.fs != null && Object.hasOwnProperty.call(message, "fs"))
                    $root.fs.FS.encode(message.fs, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
                if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.path);
                if (message.storageUse != null && Object.hasOwnProperty.call(message, "storageUse"))
                    writer.uint32(/* id 3, wireType 2 =*/26).string(message.storageUse);
                if (message.storageType != null && Object.hasOwnProperty.call(message, "storageType"))
                    writer.uint32(/* id 4, wireType 2 =*/34).string(message.storageType);
                return writer;
            };

            /**
             * Encodes the specified Location message, length delimited. Does not implicitly {@link fs.FSItem.Location.verify|verify} messages.
             * @function encodeDelimited
             * @memberof fs.FSItem.Location
             * @static
             * @param {fs.FSItem.ILocation} message Location message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Location.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes a Location message from the specified reader or buffer.
             * @function decode
             * @memberof fs.FSItem.Location
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {fs.FSItem.Location} Location
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Location.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSItem.Location();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.fs = $root.fs.FS.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 2: {
                            message.path = reader.string();
                            break;
                        }
                    case 3: {
                            message.storageUse = reader.string();
                            break;
                        }
                    case 4: {
                            message.storageType = reader.string();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a Location message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof fs.FSItem.Location
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {fs.FSItem.Location} Location
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Location.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a Location message.
             * @function verify
             * @memberof fs.FSItem.Location
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            Location.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.fs != null && Object.hasOwnProperty.call(message, "fs")) {
                    var error = $root.fs.FS.verify(message.fs, long + 1);
                    if (error)
                        return "fs." + error;
                }
                if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                    if (!$util.isString(message.path))
                        return "path: string expected";
                if (message.storageUse != null && Object.hasOwnProperty.call(message, "storageUse"))
                    if (!$util.isString(message.storageUse))
                        return "storageUse: string expected";
                if (message.storageType != null && Object.hasOwnProperty.call(message, "storageType"))
                    if (!$util.isString(message.storageType))
                        return "storageType: string expected";
                return null;
            };

            /**
             * Creates a Location message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof fs.FSItem.Location
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {fs.FSItem.Location} Location
             */
            Location.fromObject = function fromObject(object, long) {
                if (object instanceof $root.fs.FSItem.Location)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".fs.FSItem.Location: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.fs.FSItem.Location();
                if (object.fs != null) {
                    if (!$util.isObject(object.fs))
                        throw TypeError(".fs.FSItem.Location.fs: object expected");
                    message.fs = $root.fs.FS.fromObject(object.fs, long + 1);
                }
                if (object.path != null)
                    message.path = String(object.path);
                if (object.storageUse != null)
                    message.storageUse = String(object.storageUse);
                if (object.storageType != null)
                    message.storageType = String(object.storageType);
                return message;
            };

            /**
             * Creates a plain object from a Location message. Also converts values to other types if specified.
             * @function toObject
             * @memberof fs.FSItem.Location
             * @static
             * @param {fs.FSItem.Location} message Location
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            Location.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults) {
                    object.fs = null;
                    object.path = "";
                    object.storageUse = "";
                    object.storageType = "";
                }
                if (message.fs != null && Object.hasOwnProperty.call(message, "fs"))
                    object.fs = $root.fs.FS.toObject(message.fs, options, q + 1);
                if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                    object.path = message.path;
                if (message.storageUse != null && Object.hasOwnProperty.call(message, "storageUse"))
                    object.storageUse = message.storageUse;
                if (message.storageType != null && Object.hasOwnProperty.call(message, "storageType"))
                    object.storageType = message.storageType;
                return object;
            };

            /**
             * Converts this Location to JSON.
             * @function toJSON
             * @memberof fs.FSItem.Location
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            Location.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for Location
             * @function getTypeUrl
             * @memberof fs.FSItem.Location
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            Location.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/fs.FSItem.Location";
            };

            return Location;
        })();

        FSItem.Item = (function() {

            /**
             * Properties of an Item.
             * @memberof fs.FSItem
             * @interface IItem
             * @property {fs.IFS|null} [fs] Item fs
             * @property {file.IFile|null} [file] Item file
             * @property {common.IObjectReference|null} [collection] Item collection
             */

            /**
             * Constructs a new Item.
             * @memberof fs.FSItem
             * @classdesc Represents an Item.
             * @implements IItem
             * @constructor
             * @param {fs.FSItem.IItem=} [properties] Properties to set
             */
            function Item(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * Item fs.
             * @member {fs.IFS|null|undefined} fs
             * @memberof fs.FSItem.Item
             * @instance
             */
            Item.prototype.fs = null;

            /**
             * Item file.
             * @member {file.IFile|null|undefined} file
             * @memberof fs.FSItem.Item
             * @instance
             */
            Item.prototype.file = null;

            /**
             * Item collection.
             * @member {common.IObjectReference|null|undefined} collection
             * @memberof fs.FSItem.Item
             * @instance
             */
            Item.prototype.collection = null;

            /**
             * Creates a new Item instance using the specified properties.
             * @function create
             * @memberof fs.FSItem.Item
             * @static
             * @param {fs.FSItem.IItem=} [properties] Properties to set
             * @returns {fs.FSItem.Item} Item instance
             */
            Item.create = function create(properties) {
                return new Item(properties);
            };

            /**
             * Encodes the specified Item message. Does not implicitly {@link fs.FSItem.Item.verify|verify} messages.
             * @function encode
             * @memberof fs.FSItem.Item
             * @static
             * @param {fs.FSItem.IItem} message Item message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Item.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.fs != null && Object.hasOwnProperty.call(message, "fs"))
                    $root.fs.FS.encode(message.fs, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
                if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                    $root.file.File.encode(message.file, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
                if (message.collection != null && Object.hasOwnProperty.call(message, "collection"))
                    $root.common.ObjectReference.encode(message.collection, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
                return writer;
            };

            /**
             * Encodes the specified Item message, length delimited. Does not implicitly {@link fs.FSItem.Item.verify|verify} messages.
             * @function encodeDelimited
             * @memberof fs.FSItem.Item
             * @static
             * @param {fs.FSItem.IItem} message Item message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Item.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes an Item message from the specified reader or buffer.
             * @function decode
             * @memberof fs.FSItem.Item
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {fs.FSItem.Item} Item
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Item.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSItem.Item();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.fs = $root.fs.FS.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 2: {
                            message.file = $root.file.File.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 3: {
                            message.collection = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes an Item message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof fs.FSItem.Item
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {fs.FSItem.Item} Item
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Item.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies an Item message.
             * @function verify
             * @memberof fs.FSItem.Item
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            Item.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.fs != null && Object.hasOwnProperty.call(message, "fs")) {
                    var error = $root.fs.FS.verify(message.fs, long + 1);
                    if (error)
                        return "fs." + error;
                }
                if (message.file != null && Object.hasOwnProperty.call(message, "file")) {
                    var error = $root.file.File.verify(message.file, long + 1);
                    if (error)
                        return "file." + error;
                }
                if (message.collection != null && Object.hasOwnProperty.call(message, "collection")) {
                    var error = $root.common.ObjectReference.verify(message.collection, long + 1);
                    if (error)
                        return "collection." + error;
                }
                return null;
            };

            /**
             * Creates an Item message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof fs.FSItem.Item
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {fs.FSItem.Item} Item
             */
            Item.fromObject = function fromObject(object, long) {
                if (object instanceof $root.fs.FSItem.Item)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".fs.FSItem.Item: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.fs.FSItem.Item();
                if (object.fs != null) {
                    if (!$util.isObject(object.fs))
                        throw TypeError(".fs.FSItem.Item.fs: object expected");
                    message.fs = $root.fs.FS.fromObject(object.fs, long + 1);
                }
                if (object.file != null) {
                    if (!$util.isObject(object.file))
                        throw TypeError(".fs.FSItem.Item.file: object expected");
                    message.file = $root.file.File.fromObject(object.file, long + 1);
                }
                if (object.collection != null) {
                    if (!$util.isObject(object.collection))
                        throw TypeError(".fs.FSItem.Item.collection: object expected");
                    message.collection = $root.common.ObjectReference.fromObject(object.collection, long + 1);
                }
                return message;
            };

            /**
             * Creates a plain object from an Item message. Also converts values to other types if specified.
             * @function toObject
             * @memberof fs.FSItem.Item
             * @static
             * @param {fs.FSItem.Item} message Item
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            Item.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults) {
                    object.fs = null;
                    object.file = null;
                    object.collection = null;
                }
                if (message.fs != null && Object.hasOwnProperty.call(message, "fs"))
                    object.fs = $root.fs.FS.toObject(message.fs, options, q + 1);
                if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                    object.file = $root.file.File.toObject(message.file, options, q + 1);
                if (message.collection != null && Object.hasOwnProperty.call(message, "collection"))
                    object.collection = $root.common.ObjectReference.toObject(message.collection, options, q + 1);
                return object;
            };

            /**
             * Converts this Item to JSON.
             * @function toJSON
             * @memberof fs.FSItem.Item
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            Item.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for Item
             * @function getTypeUrl
             * @memberof fs.FSItem.Item
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            Item.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/fs.FSItem.Item";
            };

            return Item;
        })();

        return FSItem;
    })();

    fs.FSCGetAllReplyBody = (function() {

        /**
         * Properties of a FSCGetAllReplyBody.
         * @memberof fs
         * @interface IFSCGetAllReplyBody
         * @property {Array.<fs.INameAndItem>|null} [items] FSCGetAllReplyBody items
         */

        /**
         * Constructs a new FSCGetAllReplyBody.
         * @memberof fs
         * @classdesc Represents a FSCGetAllReplyBody.
         * @implements IFSCGetAllReplyBody
         * @constructor
         * @param {fs.IFSCGetAllReplyBody=} [properties] Properties to set
         */
        function FSCGetAllReplyBody(properties) {
            this.items = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FSCGetAllReplyBody items.
         * @member {Array.<fs.INameAndItem>} items
         * @memberof fs.FSCGetAllReplyBody
         * @instance
         */
        FSCGetAllReplyBody.prototype.items = $util.emptyArray;

        /**
         * Creates a new FSCGetAllReplyBody instance using the specified properties.
         * @function create
         * @memberof fs.FSCGetAllReplyBody
         * @static
         * @param {fs.IFSCGetAllReplyBody=} [properties] Properties to set
         * @returns {fs.FSCGetAllReplyBody} FSCGetAllReplyBody instance
         */
        FSCGetAllReplyBody.create = function create(properties) {
            return new FSCGetAllReplyBody(properties);
        };

        /**
         * Encodes the specified FSCGetAllReplyBody message. Does not implicitly {@link fs.FSCGetAllReplyBody.verify|verify} messages.
         * @function encode
         * @memberof fs.FSCGetAllReplyBody
         * @static
         * @param {fs.IFSCGetAllReplyBody} message FSCGetAllReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSCGetAllReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.items != null && message.items.length)
                for (var i = 0; i < message.items.length; ++i)
                    $root.fs.NameAndItem.encode(message.items[i], writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FSCGetAllReplyBody message, length delimited. Does not implicitly {@link fs.FSCGetAllReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FSCGetAllReplyBody
         * @static
         * @param {fs.IFSCGetAllReplyBody} message FSCGetAllReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSCGetAllReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FSCGetAllReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FSCGetAllReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FSCGetAllReplyBody} FSCGetAllReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSCGetAllReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSCGetAllReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.items && message.items.length))
                            message.items = [];
                        message.items.push($root.fs.NameAndItem.decode(reader, reader.uint32(), undefined, long + 1));
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FSCGetAllReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FSCGetAllReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FSCGetAllReplyBody} FSCGetAllReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSCGetAllReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FSCGetAllReplyBody message.
         * @function verify
         * @memberof fs.FSCGetAllReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSCGetAllReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.items != null && Object.hasOwnProperty.call(message, "items")) {
                if (!Array.isArray(message.items))
                    return "items: array expected";
                for (var i = 0; i < message.items.length; ++i) {
                    var error = $root.fs.NameAndItem.verify(message.items[i], long + 1);
                    if (error)
                        return "items." + error;
                }
            }
            return null;
        };

        /**
         * Creates a FSCGetAllReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSCGetAllReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSCGetAllReplyBody} FSCGetAllReplyBody
         */
        FSCGetAllReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FSCGetAllReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FSCGetAllReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FSCGetAllReplyBody();
            if (object.items) {
                if (!Array.isArray(object.items))
                    throw TypeError(".fs.FSCGetAllReplyBody.items: array expected");
                message.items = [];
                for (var i = 0; i < object.items.length; ++i) {
                    if (!$util.isObject(object.items[i]))
                        throw TypeError(".fs.FSCGetAllReplyBody.items: object expected");
                    message.items[i] = $root.fs.NameAndItem.fromObject(object.items[i], long + 1);
                }
            }
            return message;
        };

        /**
         * Creates a plain object from a FSCGetAllReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSCGetAllReplyBody
         * @static
         * @param {fs.FSCGetAllReplyBody} message FSCGetAllReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSCGetAllReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.items = [];
            if (message.items && message.items.length) {
                object.items = [];
                for (var j = 0; j < message.items.length; ++j)
                    object.items[j] = $root.fs.NameAndItem.toObject(message.items[j], options, q + 1);
            }
            return object;
        };

        /**
         * Converts this FSCGetAllReplyBody to JSON.
         * @function toJSON
         * @memberof fs.FSCGetAllReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FSCGetAllReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FSCGetAllReplyBody
         * @function getTypeUrl
         * @memberof fs.FSCGetAllReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FSCGetAllReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FSCGetAllReplyBody";
        };

        return FSCGetAllReplyBody;
    })();

    fs.NameAndItem = (function() {

        /**
         * Properties of a NameAndItem.
         * @memberof fs
         * @interface INameAndItem
         * @property {string|null} [name] NameAndItem name
         * @property {fs.IFSItem|null} [item] NameAndItem item
         */

        /**
         * Constructs a new NameAndItem.
         * @memberof fs
         * @classdesc Represents a NameAndItem.
         * @implements INameAndItem
         * @constructor
         * @param {fs.INameAndItem=} [properties] Properties to set
         */
        function NameAndItem(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * NameAndItem name.
         * @member {string} name
         * @memberof fs.NameAndItem
         * @instance
         */
        NameAndItem.prototype.name = "";

        /**
         * NameAndItem item.
         * @member {fs.IFSItem|null|undefined} item
         * @memberof fs.NameAndItem
         * @instance
         */
        NameAndItem.prototype.item = null;

        /**
         * Creates a new NameAndItem instance using the specified properties.
         * @function create
         * @memberof fs.NameAndItem
         * @static
         * @param {fs.INameAndItem=} [properties] Properties to set
         * @returns {fs.NameAndItem} NameAndItem instance
         */
        NameAndItem.create = function create(properties) {
            return new NameAndItem(properties);
        };

        /**
         * Encodes the specified NameAndItem message. Does not implicitly {@link fs.NameAndItem.verify|verify} messages.
         * @function encode
         * @memberof fs.NameAndItem
         * @static
         * @param {fs.INameAndItem} message NameAndItem message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        NameAndItem.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                $root.fs.FSItem.encode(message.item, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified NameAndItem message, length delimited. Does not implicitly {@link fs.NameAndItem.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.NameAndItem
         * @static
         * @param {fs.INameAndItem} message NameAndItem message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        NameAndItem.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a NameAndItem message from the specified reader or buffer.
         * @function decode
         * @memberof fs.NameAndItem
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.NameAndItem} NameAndItem
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        NameAndItem.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.NameAndItem();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.name = reader.string();
                        break;
                    }
                case 2: {
                        message.item = $root.fs.FSItem.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a NameAndItem message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.NameAndItem
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.NameAndItem} NameAndItem
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        NameAndItem.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a NameAndItem message.
         * @function verify
         * @memberof fs.NameAndItem
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        NameAndItem.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.item != null && Object.hasOwnProperty.call(message, "item")) {
                var error = $root.fs.FSItem.verify(message.item, long + 1);
                if (error)
                    return "item." + error;
            }
            return null;
        };

        /**
         * Creates a NameAndItem message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.NameAndItem
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.NameAndItem} NameAndItem
         */
        NameAndItem.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.NameAndItem)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.NameAndItem: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.NameAndItem();
            if (object.name != null)
                message.name = String(object.name);
            if (object.item != null) {
                if (!$util.isObject(object.item))
                    throw TypeError(".fs.NameAndItem.item: object expected");
                message.item = $root.fs.FSItem.fromObject(object.item, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a NameAndItem message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.NameAndItem
         * @static
         * @param {fs.NameAndItem} message NameAndItem
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        NameAndItem.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.name = "";
                object.item = null;
            }
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                object.name = message.name;
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                object.item = $root.fs.FSItem.toObject(message.item, options, q + 1);
            return object;
        };

        /**
         * Converts this NameAndItem to JSON.
         * @function toJSON
         * @memberof fs.NameAndItem
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        NameAndItem.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for NameAndItem
         * @function getTypeUrl
         * @memberof fs.NameAndItem
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        NameAndItem.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.NameAndItem";
        };

        return NameAndItem;
    })();

    fs.IterResMsg = (function() {

        /**
         * Properties of an IterResMsg.
         * @memberof fs
         * @interface IIterResMsg
         * @property {common.IBooleanValue|null} [done] IterResMsg done
         * @property {fs.INameAndItem|null} [value] IterResMsg value
         */

        /**
         * Constructs a new IterResMsg.
         * @memberof fs
         * @classdesc Represents an IterResMsg.
         * @implements IIterResMsg
         * @constructor
         * @param {fs.IIterResMsg=} [properties] Properties to set
         */
        function IterResMsg(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * IterResMsg done.
         * @member {common.IBooleanValue|null|undefined} done
         * @memberof fs.IterResMsg
         * @instance
         */
        IterResMsg.prototype.done = null;

        /**
         * IterResMsg value.
         * @member {fs.INameAndItem|null|undefined} value
         * @memberof fs.IterResMsg
         * @instance
         */
        IterResMsg.prototype.value = null;

        /**
         * Creates a new IterResMsg instance using the specified properties.
         * @function create
         * @memberof fs.IterResMsg
         * @static
         * @param {fs.IIterResMsg=} [properties] Properties to set
         * @returns {fs.IterResMsg} IterResMsg instance
         */
        IterResMsg.create = function create(properties) {
            return new IterResMsg(properties);
        };

        /**
         * Encodes the specified IterResMsg message. Does not implicitly {@link fs.IterResMsg.verify|verify} messages.
         * @function encode
         * @memberof fs.IterResMsg
         * @static
         * @param {fs.IIterResMsg} message IterResMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        IterResMsg.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.done != null && Object.hasOwnProperty.call(message, "done"))
                $root.common.BooleanValue.encode(message.done, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                $root.fs.NameAndItem.encode(message.value, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified IterResMsg message, length delimited. Does not implicitly {@link fs.IterResMsg.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.IterResMsg
         * @static
         * @param {fs.IIterResMsg} message IterResMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        IterResMsg.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an IterResMsg message from the specified reader or buffer.
         * @function decode
         * @memberof fs.IterResMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.IterResMsg} IterResMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        IterResMsg.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.IterResMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.done = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.value = $root.fs.NameAndItem.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an IterResMsg message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.IterResMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.IterResMsg} IterResMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        IterResMsg.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an IterResMsg message.
         * @function verify
         * @memberof fs.IterResMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        IterResMsg.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.done != null && Object.hasOwnProperty.call(message, "done")) {
                var error = $root.common.BooleanValue.verify(message.done, long + 1);
                if (error)
                    return "done." + error;
            }
            if (message.value != null && Object.hasOwnProperty.call(message, "value")) {
                var error = $root.fs.NameAndItem.verify(message.value, long + 1);
                if (error)
                    return "value." + error;
            }
            return null;
        };

        /**
         * Creates an IterResMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.IterResMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.IterResMsg} IterResMsg
         */
        IterResMsg.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.IterResMsg)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.IterResMsg: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.IterResMsg();
            if (object.done != null) {
                if (!$util.isObject(object.done))
                    throw TypeError(".fs.IterResMsg.done: object expected");
                message.done = $root.common.BooleanValue.fromObject(object.done, long + 1);
            }
            if (object.value != null) {
                if (!$util.isObject(object.value))
                    throw TypeError(".fs.IterResMsg.value: object expected");
                message.value = $root.fs.NameAndItem.fromObject(object.value, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an IterResMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.IterResMsg
         * @static
         * @param {fs.IterResMsg} message IterResMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        IterResMsg.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.done = null;
                object.value = null;
            }
            if (message.done != null && Object.hasOwnProperty.call(message, "done"))
                object.done = $root.common.BooleanValue.toObject(message.done, options, q + 1);
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = $root.fs.NameAndItem.toObject(message.value, options, q + 1);
            return object;
        };

        /**
         * Converts this IterResMsg to JSON.
         * @function toJSON
         * @memberof fs.IterResMsg
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        IterResMsg.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for IterResMsg
         * @function getTypeUrl
         * @memberof fs.IterResMsg
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        IterResMsg.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.IterResMsg";
        };

        return IterResMsg;
    })();

    fs.CollectionEvent = (function() {

        /**
         * Properties of a CollectionEvent.
         * @memberof fs
         * @interface ICollectionEvent
         * @property {string|null} [type] CollectionEvent type
         * @property {common.IStringValue|null} [path] CollectionEvent path
         * @property {fs.IFSItem|null} [item] CollectionEvent item
         */

        /**
         * Constructs a new CollectionEvent.
         * @memberof fs
         * @classdesc Represents a CollectionEvent.
         * @implements ICollectionEvent
         * @constructor
         * @param {fs.ICollectionEvent=} [properties] Properties to set
         */
        function CollectionEvent(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * CollectionEvent type.
         * @member {string} type
         * @memberof fs.CollectionEvent
         * @instance
         */
        CollectionEvent.prototype.type = "";

        /**
         * CollectionEvent path.
         * @member {common.IStringValue|null|undefined} path
         * @memberof fs.CollectionEvent
         * @instance
         */
        CollectionEvent.prototype.path = null;

        /**
         * CollectionEvent item.
         * @member {fs.IFSItem|null|undefined} item
         * @memberof fs.CollectionEvent
         * @instance
         */
        CollectionEvent.prototype.item = null;

        /**
         * Creates a new CollectionEvent instance using the specified properties.
         * @function create
         * @memberof fs.CollectionEvent
         * @static
         * @param {fs.ICollectionEvent=} [properties] Properties to set
         * @returns {fs.CollectionEvent} CollectionEvent instance
         */
        CollectionEvent.create = function create(properties) {
            return new CollectionEvent(properties);
        };

        /**
         * Encodes the specified CollectionEvent message. Does not implicitly {@link fs.CollectionEvent.verify|verify} messages.
         * @function encode
         * @memberof fs.CollectionEvent
         * @static
         * @param {fs.ICollectionEvent} message CollectionEvent message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CollectionEvent.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.type);
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                $root.common.StringValue.encode(message.path, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                $root.fs.FSItem.encode(message.item, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified CollectionEvent message, length delimited. Does not implicitly {@link fs.CollectionEvent.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.CollectionEvent
         * @static
         * @param {fs.ICollectionEvent} message CollectionEvent message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CollectionEvent.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a CollectionEvent message from the specified reader or buffer.
         * @function decode
         * @memberof fs.CollectionEvent
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.CollectionEvent} CollectionEvent
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CollectionEvent.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.CollectionEvent();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.type = reader.string();
                        break;
                    }
                case 2: {
                        message.path = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.item = $root.fs.FSItem.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a CollectionEvent message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.CollectionEvent
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.CollectionEvent} CollectionEvent
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CollectionEvent.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a CollectionEvent message.
         * @function verify
         * @memberof fs.CollectionEvent
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        CollectionEvent.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.path != null && Object.hasOwnProperty.call(message, "path")) {
                var error = $root.common.StringValue.verify(message.path, long + 1);
                if (error)
                    return "path." + error;
            }
            if (message.item != null && Object.hasOwnProperty.call(message, "item")) {
                var error = $root.fs.FSItem.verify(message.item, long + 1);
                if (error)
                    return "item." + error;
            }
            return null;
        };

        /**
         * Creates a CollectionEvent message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.CollectionEvent
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.CollectionEvent} CollectionEvent
         */
        CollectionEvent.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.CollectionEvent)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.CollectionEvent: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.CollectionEvent();
            if (object.type != null)
                message.type = String(object.type);
            if (object.path != null) {
                if (!$util.isObject(object.path))
                    throw TypeError(".fs.CollectionEvent.path: object expected");
                message.path = $root.common.StringValue.fromObject(object.path, long + 1);
            }
            if (object.item != null) {
                if (!$util.isObject(object.item))
                    throw TypeError(".fs.CollectionEvent.item: object expected");
                message.item = $root.fs.FSItem.fromObject(object.item, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a CollectionEvent message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.CollectionEvent
         * @static
         * @param {fs.CollectionEvent} message CollectionEvent
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        CollectionEvent.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.path = null;
                object.item = null;
            }
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                object.type = message.type;
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = $root.common.StringValue.toObject(message.path, options, q + 1);
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                object.item = $root.fs.FSItem.toObject(message.item, options, q + 1);
            return object;
        };

        /**
         * Converts this CollectionEvent to JSON.
         * @function toJSON
         * @memberof fs.CollectionEvent
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        CollectionEvent.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for CollectionEvent
         * @function getTypeUrl
         * @memberof fs.CollectionEvent
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        CollectionEvent.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.CollectionEvent";
        };

        return CollectionEvent;
    })();

    fs.VersionedGetXAttrRequestBody = (function() {

        /**
         * Properties of a VersionedGetXAttrRequestBody.
         * @memberof fs
         * @interface IVersionedGetXAttrRequestBody
         * @property {string|null} [path] VersionedGetXAttrRequestBody path
         * @property {string|null} [xaName] VersionedGetXAttrRequestBody xaName
         * @property {file.IVersionedReadFlags|null} [flags] VersionedGetXAttrRequestBody flags
         */

        /**
         * Constructs a new VersionedGetXAttrRequestBody.
         * @memberof fs
         * @classdesc Represents a VersionedGetXAttrRequestBody.
         * @implements IVersionedGetXAttrRequestBody
         * @constructor
         * @param {fs.IVersionedGetXAttrRequestBody=} [properties] Properties to set
         */
        function VersionedGetXAttrRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedGetXAttrRequestBody path.
         * @member {string} path
         * @memberof fs.VersionedGetXAttrRequestBody
         * @instance
         */
        VersionedGetXAttrRequestBody.prototype.path = "";

        /**
         * VersionedGetXAttrRequestBody xaName.
         * @member {string} xaName
         * @memberof fs.VersionedGetXAttrRequestBody
         * @instance
         */
        VersionedGetXAttrRequestBody.prototype.xaName = "";

        /**
         * VersionedGetXAttrRequestBody flags.
         * @member {file.IVersionedReadFlags|null|undefined} flags
         * @memberof fs.VersionedGetXAttrRequestBody
         * @instance
         */
        VersionedGetXAttrRequestBody.prototype.flags = null;

        /**
         * Creates a new VersionedGetXAttrRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.VersionedGetXAttrRequestBody
         * @static
         * @param {fs.IVersionedGetXAttrRequestBody=} [properties] Properties to set
         * @returns {fs.VersionedGetXAttrRequestBody} VersionedGetXAttrRequestBody instance
         */
        VersionedGetXAttrRequestBody.create = function create(properties) {
            return new VersionedGetXAttrRequestBody(properties);
        };

        /**
         * Encodes the specified VersionedGetXAttrRequestBody message. Does not implicitly {@link fs.VersionedGetXAttrRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.VersionedGetXAttrRequestBody
         * @static
         * @param {fs.IVersionedGetXAttrRequestBody} message VersionedGetXAttrRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetXAttrRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.xaName);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 10, wireType 2 =*/82).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedGetXAttrRequestBody message, length delimited. Does not implicitly {@link fs.VersionedGetXAttrRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.VersionedGetXAttrRequestBody
         * @static
         * @param {fs.IVersionedGetXAttrRequestBody} message VersionedGetXAttrRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetXAttrRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedGetXAttrRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.VersionedGetXAttrRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.VersionedGetXAttrRequestBody} VersionedGetXAttrRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetXAttrRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedGetXAttrRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.xaName = reader.string();
                        break;
                    }
                case 10: {
                        message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedGetXAttrRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.VersionedGetXAttrRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.VersionedGetXAttrRequestBody} VersionedGetXAttrRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetXAttrRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedGetXAttrRequestBody message.
         * @function verify
         * @memberof fs.VersionedGetXAttrRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedGetXAttrRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                if (!$util.isString(message.xaName))
                    return "xaName: string expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedGetXAttrRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.VersionedGetXAttrRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.VersionedGetXAttrRequestBody} VersionedGetXAttrRequestBody
         */
        VersionedGetXAttrRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.VersionedGetXAttrRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.VersionedGetXAttrRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.VersionedGetXAttrRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.xaName != null)
                message.xaName = String(object.xaName);
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.VersionedGetXAttrRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedGetXAttrRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.VersionedGetXAttrRequestBody
         * @static
         * @param {fs.VersionedGetXAttrRequestBody} message VersionedGetXAttrRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedGetXAttrRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.xaName = "";
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                object.xaName = message.xaName;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedGetXAttrRequestBody to JSON.
         * @function toJSON
         * @memberof fs.VersionedGetXAttrRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedGetXAttrRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedGetXAttrRequestBody
         * @function getTypeUrl
         * @memberof fs.VersionedGetXAttrRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedGetXAttrRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.VersionedGetXAttrRequestBody";
        };

        return VersionedGetXAttrRequestBody;
    })();

    fs.PathAndFlagsRequestBody = (function() {

        /**
         * Properties of a PathAndFlagsRequestBody.
         * @memberof fs
         * @interface IPathAndFlagsRequestBody
         * @property {string|null} [path] PathAndFlagsRequestBody path
         * @property {file.IVersionedReadFlags|null} [flags] PathAndFlagsRequestBody flags
         */

        /**
         * Constructs a new PathAndFlagsRequestBody.
         * @memberof fs
         * @classdesc Represents a PathAndFlagsRequestBody.
         * @implements IPathAndFlagsRequestBody
         * @constructor
         * @param {fs.IPathAndFlagsRequestBody=} [properties] Properties to set
         */
        function PathAndFlagsRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * PathAndFlagsRequestBody path.
         * @member {string} path
         * @memberof fs.PathAndFlagsRequestBody
         * @instance
         */
        PathAndFlagsRequestBody.prototype.path = "";

        /**
         * PathAndFlagsRequestBody flags.
         * @member {file.IVersionedReadFlags|null|undefined} flags
         * @memberof fs.PathAndFlagsRequestBody
         * @instance
         */
        PathAndFlagsRequestBody.prototype.flags = null;

        /**
         * Creates a new PathAndFlagsRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.PathAndFlagsRequestBody
         * @static
         * @param {fs.IPathAndFlagsRequestBody=} [properties] Properties to set
         * @returns {fs.PathAndFlagsRequestBody} PathAndFlagsRequestBody instance
         */
        PathAndFlagsRequestBody.create = function create(properties) {
            return new PathAndFlagsRequestBody(properties);
        };

        /**
         * Encodes the specified PathAndFlagsRequestBody message. Does not implicitly {@link fs.PathAndFlagsRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.PathAndFlagsRequestBody
         * @static
         * @param {fs.IPathAndFlagsRequestBody} message PathAndFlagsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        PathAndFlagsRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified PathAndFlagsRequestBody message, length delimited. Does not implicitly {@link fs.PathAndFlagsRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.PathAndFlagsRequestBody
         * @static
         * @param {fs.IPathAndFlagsRequestBody} message PathAndFlagsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        PathAndFlagsRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a PathAndFlagsRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.PathAndFlagsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.PathAndFlagsRequestBody} PathAndFlagsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        PathAndFlagsRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.PathAndFlagsRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a PathAndFlagsRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.PathAndFlagsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.PathAndFlagsRequestBody} PathAndFlagsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        PathAndFlagsRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a PathAndFlagsRequestBody message.
         * @function verify
         * @memberof fs.PathAndFlagsRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        PathAndFlagsRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a PathAndFlagsRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.PathAndFlagsRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.PathAndFlagsRequestBody} PathAndFlagsRequestBody
         */
        PathAndFlagsRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.PathAndFlagsRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.PathAndFlagsRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.PathAndFlagsRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.PathAndFlagsRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a PathAndFlagsRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.PathAndFlagsRequestBody
         * @static
         * @param {fs.PathAndFlagsRequestBody} message PathAndFlagsRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        PathAndFlagsRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this PathAndFlagsRequestBody to JSON.
         * @function toJSON
         * @memberof fs.PathAndFlagsRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        PathAndFlagsRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for PathAndFlagsRequestBody
         * @function getTypeUrl
         * @memberof fs.PathAndFlagsRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        PathAndFlagsRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.PathAndFlagsRequestBody";
        };

        return PathAndFlagsRequestBody;
    })();

    fs.VersionedListFolderReplyBody = (function() {

        /**
         * Properties of a VersionedListFolderReplyBody.
         * @memberof fs
         * @interface IVersionedListFolderReplyBody
         * @property {number|Long|null} [version] VersionedListFolderReplyBody version
         * @property {Array.<fs.IListingEntryMsg>|null} [entries] VersionedListFolderReplyBody entries
         */

        /**
         * Constructs a new VersionedListFolderReplyBody.
         * @memberof fs
         * @classdesc Represents a VersionedListFolderReplyBody.
         * @implements IVersionedListFolderReplyBody
         * @constructor
         * @param {fs.IVersionedListFolderReplyBody=} [properties] Properties to set
         */
        function VersionedListFolderReplyBody(properties) {
            this.entries = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedListFolderReplyBody version.
         * @member {number|Long} version
         * @memberof fs.VersionedListFolderReplyBody
         * @instance
         */
        VersionedListFolderReplyBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * VersionedListFolderReplyBody entries.
         * @member {Array.<fs.IListingEntryMsg>} entries
         * @memberof fs.VersionedListFolderReplyBody
         * @instance
         */
        VersionedListFolderReplyBody.prototype.entries = $util.emptyArray;

        /**
         * Creates a new VersionedListFolderReplyBody instance using the specified properties.
         * @function create
         * @memberof fs.VersionedListFolderReplyBody
         * @static
         * @param {fs.IVersionedListFolderReplyBody=} [properties] Properties to set
         * @returns {fs.VersionedListFolderReplyBody} VersionedListFolderReplyBody instance
         */
        VersionedListFolderReplyBody.create = function create(properties) {
            return new VersionedListFolderReplyBody(properties);
        };

        /**
         * Encodes the specified VersionedListFolderReplyBody message. Does not implicitly {@link fs.VersionedListFolderReplyBody.verify|verify} messages.
         * @function encode
         * @memberof fs.VersionedListFolderReplyBody
         * @static
         * @param {fs.IVersionedListFolderReplyBody} message VersionedListFolderReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedListFolderReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            if (message.entries != null && message.entries.length)
                for (var i = 0; i < message.entries.length; ++i)
                    $root.fs.ListingEntryMsg.encode(message.entries[i], writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedListFolderReplyBody message, length delimited. Does not implicitly {@link fs.VersionedListFolderReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.VersionedListFolderReplyBody
         * @static
         * @param {fs.IVersionedListFolderReplyBody} message VersionedListFolderReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedListFolderReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedListFolderReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.VersionedListFolderReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.VersionedListFolderReplyBody} VersionedListFolderReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedListFolderReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedListFolderReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        if (!(message.entries && message.entries.length))
                            message.entries = [];
                        message.entries.push($root.fs.ListingEntryMsg.decode(reader, reader.uint32(), undefined, long + 1));
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedListFolderReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.VersionedListFolderReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.VersionedListFolderReplyBody} VersionedListFolderReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedListFolderReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedListFolderReplyBody message.
         * @function verify
         * @memberof fs.VersionedListFolderReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedListFolderReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            if (message.entries != null && Object.hasOwnProperty.call(message, "entries")) {
                if (!Array.isArray(message.entries))
                    return "entries: array expected";
                for (var i = 0; i < message.entries.length; ++i) {
                    var error = $root.fs.ListingEntryMsg.verify(message.entries[i], long + 1);
                    if (error)
                        return "entries." + error;
                }
            }
            return null;
        };

        /**
         * Creates a VersionedListFolderReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.VersionedListFolderReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.VersionedListFolderReplyBody} VersionedListFolderReplyBody
         */
        VersionedListFolderReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.VersionedListFolderReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.VersionedListFolderReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.VersionedListFolderReplyBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            if (object.entries) {
                if (!Array.isArray(object.entries))
                    throw TypeError(".fs.VersionedListFolderReplyBody.entries: array expected");
                message.entries = [];
                for (var i = 0; i < object.entries.length; ++i) {
                    if (!$util.isObject(object.entries[i]))
                        throw TypeError(".fs.VersionedListFolderReplyBody.entries: object expected");
                    message.entries[i] = $root.fs.ListingEntryMsg.fromObject(object.entries[i], long + 1);
                }
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedListFolderReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.VersionedListFolderReplyBody
         * @static
         * @param {fs.VersionedListFolderReplyBody} message VersionedListFolderReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedListFolderReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.entries = [];
            if (options.defaults)
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            if (message.entries && message.entries.length) {
                object.entries = [];
                for (var j = 0; j < message.entries.length; ++j)
                    object.entries[j] = $root.fs.ListingEntryMsg.toObject(message.entries[j], options, q + 1);
            }
            return object;
        };

        /**
         * Converts this VersionedListFolderReplyBody to JSON.
         * @function toJSON
         * @memberof fs.VersionedListFolderReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedListFolderReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedListFolderReplyBody
         * @function getTypeUrl
         * @memberof fs.VersionedListFolderReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedListFolderReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.VersionedListFolderReplyBody";
        };

        return VersionedListFolderReplyBody;
    })();

    fs.VersionedReadBytesRequestBody = (function() {

        /**
         * Properties of a VersionedReadBytesRequestBody.
         * @memberof fs
         * @interface IVersionedReadBytesRequestBody
         * @property {string|null} [path] VersionedReadBytesRequestBody path
         * @property {common.IUInt64Value|null} [start] VersionedReadBytesRequestBody start
         * @property {common.IUInt64Value|null} [end] VersionedReadBytesRequestBody end
         * @property {file.IVersionedReadFlags|null} [flags] VersionedReadBytesRequestBody flags
         */

        /**
         * Constructs a new VersionedReadBytesRequestBody.
         * @memberof fs
         * @classdesc Represents a VersionedReadBytesRequestBody.
         * @implements IVersionedReadBytesRequestBody
         * @constructor
         * @param {fs.IVersionedReadBytesRequestBody=} [properties] Properties to set
         */
        function VersionedReadBytesRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedReadBytesRequestBody path.
         * @member {string} path
         * @memberof fs.VersionedReadBytesRequestBody
         * @instance
         */
        VersionedReadBytesRequestBody.prototype.path = "";

        /**
         * VersionedReadBytesRequestBody start.
         * @member {common.IUInt64Value|null|undefined} start
         * @memberof fs.VersionedReadBytesRequestBody
         * @instance
         */
        VersionedReadBytesRequestBody.prototype.start = null;

        /**
         * VersionedReadBytesRequestBody end.
         * @member {common.IUInt64Value|null|undefined} end
         * @memberof fs.VersionedReadBytesRequestBody
         * @instance
         */
        VersionedReadBytesRequestBody.prototype.end = null;

        /**
         * VersionedReadBytesRequestBody flags.
         * @member {file.IVersionedReadFlags|null|undefined} flags
         * @memberof fs.VersionedReadBytesRequestBody
         * @instance
         */
        VersionedReadBytesRequestBody.prototype.flags = null;

        /**
         * Creates a new VersionedReadBytesRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.VersionedReadBytesRequestBody
         * @static
         * @param {fs.IVersionedReadBytesRequestBody=} [properties] Properties to set
         * @returns {fs.VersionedReadBytesRequestBody} VersionedReadBytesRequestBody instance
         */
        VersionedReadBytesRequestBody.create = function create(properties) {
            return new VersionedReadBytesRequestBody(properties);
        };

        /**
         * Encodes the specified VersionedReadBytesRequestBody message. Does not implicitly {@link fs.VersionedReadBytesRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.VersionedReadBytesRequestBody
         * @static
         * @param {fs.IVersionedReadBytesRequestBody} message VersionedReadBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadBytesRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                $root.common.UInt64Value.encode(message.start, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                $root.common.UInt64Value.encode(message.end, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 10, wireType 2 =*/82).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedReadBytesRequestBody message, length delimited. Does not implicitly {@link fs.VersionedReadBytesRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.VersionedReadBytesRequestBody
         * @static
         * @param {fs.IVersionedReadBytesRequestBody} message VersionedReadBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadBytesRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedReadBytesRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.VersionedReadBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.VersionedReadBytesRequestBody} VersionedReadBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadBytesRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedReadBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.start = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.end = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 10: {
                        message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedReadBytesRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.VersionedReadBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.VersionedReadBytesRequestBody} VersionedReadBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadBytesRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedReadBytesRequestBody message.
         * @function verify
         * @memberof fs.VersionedReadBytesRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedReadBytesRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.start != null && Object.hasOwnProperty.call(message, "start")) {
                var error = $root.common.UInt64Value.verify(message.start, long + 1);
                if (error)
                    return "start." + error;
            }
            if (message.end != null && Object.hasOwnProperty.call(message, "end")) {
                var error = $root.common.UInt64Value.verify(message.end, long + 1);
                if (error)
                    return "end." + error;
            }
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedReadBytesRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.VersionedReadBytesRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.VersionedReadBytesRequestBody} VersionedReadBytesRequestBody
         */
        VersionedReadBytesRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.VersionedReadBytesRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.VersionedReadBytesRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.VersionedReadBytesRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.start != null) {
                if (!$util.isObject(object.start))
                    throw TypeError(".fs.VersionedReadBytesRequestBody.start: object expected");
                message.start = $root.common.UInt64Value.fromObject(object.start, long + 1);
            }
            if (object.end != null) {
                if (!$util.isObject(object.end))
                    throw TypeError(".fs.VersionedReadBytesRequestBody.end: object expected");
                message.end = $root.common.UInt64Value.fromObject(object.end, long + 1);
            }
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.VersionedReadBytesRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedReadBytesRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.VersionedReadBytesRequestBody
         * @static
         * @param {fs.VersionedReadBytesRequestBody} message VersionedReadBytesRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedReadBytesRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.start = null;
                object.end = null;
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                object.start = $root.common.UInt64Value.toObject(message.start, options, q + 1);
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                object.end = $root.common.UInt64Value.toObject(message.end, options, q + 1);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedReadBytesRequestBody to JSON.
         * @function toJSON
         * @memberof fs.VersionedReadBytesRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedReadBytesRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedReadBytesRequestBody
         * @function getTypeUrl
         * @memberof fs.VersionedReadBytesRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedReadBytesRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.VersionedReadBytesRequestBody";
        };

        return VersionedReadBytesRequestBody;
    })();

    fs.UpdateXAttrsRequestBody = (function() {

        /**
         * Properties of an UpdateXAttrsRequestBody.
         * @memberof fs
         * @interface IUpdateXAttrsRequestBody
         * @property {string|null} [path] UpdateXAttrsRequestBody path
         * @property {file.IXAttrsChanges|null} [changes] UpdateXAttrsRequestBody changes
         */

        /**
         * Constructs a new UpdateXAttrsRequestBody.
         * @memberof fs
         * @classdesc Represents an UpdateXAttrsRequestBody.
         * @implements IUpdateXAttrsRequestBody
         * @constructor
         * @param {fs.IUpdateXAttrsRequestBody=} [properties] Properties to set
         */
        function UpdateXAttrsRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * UpdateXAttrsRequestBody path.
         * @member {string} path
         * @memberof fs.UpdateXAttrsRequestBody
         * @instance
         */
        UpdateXAttrsRequestBody.prototype.path = "";

        /**
         * UpdateXAttrsRequestBody changes.
         * @member {file.IXAttrsChanges|null|undefined} changes
         * @memberof fs.UpdateXAttrsRequestBody
         * @instance
         */
        UpdateXAttrsRequestBody.prototype.changes = null;

        /**
         * Creates a new UpdateXAttrsRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.UpdateXAttrsRequestBody
         * @static
         * @param {fs.IUpdateXAttrsRequestBody=} [properties] Properties to set
         * @returns {fs.UpdateXAttrsRequestBody} UpdateXAttrsRequestBody instance
         */
        UpdateXAttrsRequestBody.create = function create(properties) {
            return new UpdateXAttrsRequestBody(properties);
        };

        /**
         * Encodes the specified UpdateXAttrsRequestBody message. Does not implicitly {@link fs.UpdateXAttrsRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.UpdateXAttrsRequestBody
         * @static
         * @param {fs.IUpdateXAttrsRequestBody} message UpdateXAttrsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UpdateXAttrsRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.changes != null && Object.hasOwnProperty.call(message, "changes"))
                $root.file.XAttrsChanges.encode(message.changes, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified UpdateXAttrsRequestBody message, length delimited. Does not implicitly {@link fs.UpdateXAttrsRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.UpdateXAttrsRequestBody
         * @static
         * @param {fs.IUpdateXAttrsRequestBody} message UpdateXAttrsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UpdateXAttrsRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an UpdateXAttrsRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.UpdateXAttrsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.UpdateXAttrsRequestBody} UpdateXAttrsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UpdateXAttrsRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.UpdateXAttrsRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.changes = $root.file.XAttrsChanges.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an UpdateXAttrsRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.UpdateXAttrsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.UpdateXAttrsRequestBody} UpdateXAttrsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UpdateXAttrsRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an UpdateXAttrsRequestBody message.
         * @function verify
         * @memberof fs.UpdateXAttrsRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        UpdateXAttrsRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.changes != null && Object.hasOwnProperty.call(message, "changes")) {
                var error = $root.file.XAttrsChanges.verify(message.changes, long + 1);
                if (error)
                    return "changes." + error;
            }
            return null;
        };

        /**
         * Creates an UpdateXAttrsRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.UpdateXAttrsRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.UpdateXAttrsRequestBody} UpdateXAttrsRequestBody
         */
        UpdateXAttrsRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.UpdateXAttrsRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.UpdateXAttrsRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.UpdateXAttrsRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.changes != null) {
                if (!$util.isObject(object.changes))
                    throw TypeError(".fs.UpdateXAttrsRequestBody.changes: object expected");
                message.changes = $root.file.XAttrsChanges.fromObject(object.changes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an UpdateXAttrsRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.UpdateXAttrsRequestBody
         * @static
         * @param {fs.UpdateXAttrsRequestBody} message UpdateXAttrsRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        UpdateXAttrsRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.changes = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.changes != null && Object.hasOwnProperty.call(message, "changes"))
                object.changes = $root.file.XAttrsChanges.toObject(message.changes, options, q + 1);
            return object;
        };

        /**
         * Converts this UpdateXAttrsRequestBody to JSON.
         * @function toJSON
         * @memberof fs.UpdateXAttrsRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        UpdateXAttrsRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for UpdateXAttrsRequestBody
         * @function getTypeUrl
         * @memberof fs.UpdateXAttrsRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        UpdateXAttrsRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.UpdateXAttrsRequestBody";
        };

        return UpdateXAttrsRequestBody;
    })();

    fs.MakeFolderRequestBody = (function() {

        /**
         * Properties of a MakeFolderRequestBody.
         * @memberof fs
         * @interface IMakeFolderRequestBody
         * @property {string|null} [path] MakeFolderRequestBody path
         * @property {common.IBooleanValue|null} [exclusive] MakeFolderRequestBody exclusive
         */

        /**
         * Constructs a new MakeFolderRequestBody.
         * @memberof fs
         * @classdesc Represents a MakeFolderRequestBody.
         * @implements IMakeFolderRequestBody
         * @constructor
         * @param {fs.IMakeFolderRequestBody=} [properties] Properties to set
         */
        function MakeFolderRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * MakeFolderRequestBody path.
         * @member {string} path
         * @memberof fs.MakeFolderRequestBody
         * @instance
         */
        MakeFolderRequestBody.prototype.path = "";

        /**
         * MakeFolderRequestBody exclusive.
         * @member {common.IBooleanValue|null|undefined} exclusive
         * @memberof fs.MakeFolderRequestBody
         * @instance
         */
        MakeFolderRequestBody.prototype.exclusive = null;

        /**
         * Creates a new MakeFolderRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.MakeFolderRequestBody
         * @static
         * @param {fs.IMakeFolderRequestBody=} [properties] Properties to set
         * @returns {fs.MakeFolderRequestBody} MakeFolderRequestBody instance
         */
        MakeFolderRequestBody.create = function create(properties) {
            return new MakeFolderRequestBody(properties);
        };

        /**
         * Encodes the specified MakeFolderRequestBody message. Does not implicitly {@link fs.MakeFolderRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.MakeFolderRequestBody
         * @static
         * @param {fs.IMakeFolderRequestBody} message MakeFolderRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        MakeFolderRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive"))
                $root.common.BooleanValue.encode(message.exclusive, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified MakeFolderRequestBody message, length delimited. Does not implicitly {@link fs.MakeFolderRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.MakeFolderRequestBody
         * @static
         * @param {fs.IMakeFolderRequestBody} message MakeFolderRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        MakeFolderRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a MakeFolderRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.MakeFolderRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.MakeFolderRequestBody} MakeFolderRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        MakeFolderRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.MakeFolderRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.exclusive = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a MakeFolderRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.MakeFolderRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.MakeFolderRequestBody} MakeFolderRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        MakeFolderRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a MakeFolderRequestBody message.
         * @function verify
         * @memberof fs.MakeFolderRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        MakeFolderRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive")) {
                var error = $root.common.BooleanValue.verify(message.exclusive, long + 1);
                if (error)
                    return "exclusive." + error;
            }
            return null;
        };

        /**
         * Creates a MakeFolderRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.MakeFolderRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.MakeFolderRequestBody} MakeFolderRequestBody
         */
        MakeFolderRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.MakeFolderRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.MakeFolderRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.MakeFolderRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.exclusive != null) {
                if (!$util.isObject(object.exclusive))
                    throw TypeError(".fs.MakeFolderRequestBody.exclusive: object expected");
                message.exclusive = $root.common.BooleanValue.fromObject(object.exclusive, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a MakeFolderRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.MakeFolderRequestBody
         * @static
         * @param {fs.MakeFolderRequestBody} message MakeFolderRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        MakeFolderRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.exclusive = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive"))
                object.exclusive = $root.common.BooleanValue.toObject(message.exclusive, options, q + 1);
            return object;
        };

        /**
         * Converts this MakeFolderRequestBody to JSON.
         * @function toJSON
         * @memberof fs.MakeFolderRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        MakeFolderRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for MakeFolderRequestBody
         * @function getTypeUrl
         * @memberof fs.MakeFolderRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        MakeFolderRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.MakeFolderRequestBody";
        };

        return MakeFolderRequestBody;
    })();

    fs.DeleteFolderRequestBody = (function() {

        /**
         * Properties of a DeleteFolderRequestBody.
         * @memberof fs
         * @interface IDeleteFolderRequestBody
         * @property {string|null} [path] DeleteFolderRequestBody path
         * @property {common.IBooleanValue|null} [removeContent] DeleteFolderRequestBody removeContent
         */

        /**
         * Constructs a new DeleteFolderRequestBody.
         * @memberof fs
         * @classdesc Represents a DeleteFolderRequestBody.
         * @implements IDeleteFolderRequestBody
         * @constructor
         * @param {fs.IDeleteFolderRequestBody=} [properties] Properties to set
         */
        function DeleteFolderRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * DeleteFolderRequestBody path.
         * @member {string} path
         * @memberof fs.DeleteFolderRequestBody
         * @instance
         */
        DeleteFolderRequestBody.prototype.path = "";

        /**
         * DeleteFolderRequestBody removeContent.
         * @member {common.IBooleanValue|null|undefined} removeContent
         * @memberof fs.DeleteFolderRequestBody
         * @instance
         */
        DeleteFolderRequestBody.prototype.removeContent = null;

        /**
         * Creates a new DeleteFolderRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.DeleteFolderRequestBody
         * @static
         * @param {fs.IDeleteFolderRequestBody=} [properties] Properties to set
         * @returns {fs.DeleteFolderRequestBody} DeleteFolderRequestBody instance
         */
        DeleteFolderRequestBody.create = function create(properties) {
            return new DeleteFolderRequestBody(properties);
        };

        /**
         * Encodes the specified DeleteFolderRequestBody message. Does not implicitly {@link fs.DeleteFolderRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.DeleteFolderRequestBody
         * @static
         * @param {fs.IDeleteFolderRequestBody} message DeleteFolderRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DeleteFolderRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.removeContent != null && Object.hasOwnProperty.call(message, "removeContent"))
                $root.common.BooleanValue.encode(message.removeContent, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified DeleteFolderRequestBody message, length delimited. Does not implicitly {@link fs.DeleteFolderRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.DeleteFolderRequestBody
         * @static
         * @param {fs.IDeleteFolderRequestBody} message DeleteFolderRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DeleteFolderRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a DeleteFolderRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.DeleteFolderRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.DeleteFolderRequestBody} DeleteFolderRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DeleteFolderRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.DeleteFolderRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.removeContent = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a DeleteFolderRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.DeleteFolderRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.DeleteFolderRequestBody} DeleteFolderRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DeleteFolderRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a DeleteFolderRequestBody message.
         * @function verify
         * @memberof fs.DeleteFolderRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        DeleteFolderRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.removeContent != null && Object.hasOwnProperty.call(message, "removeContent")) {
                var error = $root.common.BooleanValue.verify(message.removeContent, long + 1);
                if (error)
                    return "removeContent." + error;
            }
            return null;
        };

        /**
         * Creates a DeleteFolderRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.DeleteFolderRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.DeleteFolderRequestBody} DeleteFolderRequestBody
         */
        DeleteFolderRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.DeleteFolderRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.DeleteFolderRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.DeleteFolderRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.removeContent != null) {
                if (!$util.isObject(object.removeContent))
                    throw TypeError(".fs.DeleteFolderRequestBody.removeContent: object expected");
                message.removeContent = $root.common.BooleanValue.fromObject(object.removeContent, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a DeleteFolderRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.DeleteFolderRequestBody
         * @static
         * @param {fs.DeleteFolderRequestBody} message DeleteFolderRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        DeleteFolderRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.removeContent = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.removeContent != null && Object.hasOwnProperty.call(message, "removeContent"))
                object.removeContent = $root.common.BooleanValue.toObject(message.removeContent, options, q + 1);
            return object;
        };

        /**
         * Converts this DeleteFolderRequestBody to JSON.
         * @function toJSON
         * @memberof fs.DeleteFolderRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        DeleteFolderRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for DeleteFolderRequestBody
         * @function getTypeUrl
         * @memberof fs.DeleteFolderRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        DeleteFolderRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.DeleteFolderRequestBody";
        };

        return DeleteFolderRequestBody;
    })();

    fs.MoveRequestBody = (function() {

        /**
         * Properties of a MoveRequestBody.
         * @memberof fs
         * @interface IMoveRequestBody
         * @property {string|null} [src] MoveRequestBody src
         * @property {string|null} [dst] MoveRequestBody dst
         */

        /**
         * Constructs a new MoveRequestBody.
         * @memberof fs
         * @classdesc Represents a MoveRequestBody.
         * @implements IMoveRequestBody
         * @constructor
         * @param {fs.IMoveRequestBody=} [properties] Properties to set
         */
        function MoveRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * MoveRequestBody src.
         * @member {string} src
         * @memberof fs.MoveRequestBody
         * @instance
         */
        MoveRequestBody.prototype.src = "";

        /**
         * MoveRequestBody dst.
         * @member {string} dst
         * @memberof fs.MoveRequestBody
         * @instance
         */
        MoveRequestBody.prototype.dst = "";

        /**
         * Creates a new MoveRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.MoveRequestBody
         * @static
         * @param {fs.IMoveRequestBody=} [properties] Properties to set
         * @returns {fs.MoveRequestBody} MoveRequestBody instance
         */
        MoveRequestBody.create = function create(properties) {
            return new MoveRequestBody(properties);
        };

        /**
         * Encodes the specified MoveRequestBody message. Does not implicitly {@link fs.MoveRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.MoveRequestBody
         * @static
         * @param {fs.IMoveRequestBody} message MoveRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        MoveRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.src);
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.dst);
            return writer;
        };

        /**
         * Encodes the specified MoveRequestBody message, length delimited. Does not implicitly {@link fs.MoveRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.MoveRequestBody
         * @static
         * @param {fs.IMoveRequestBody} message MoveRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        MoveRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a MoveRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.MoveRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.MoveRequestBody} MoveRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        MoveRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.MoveRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.src = reader.string();
                        break;
                    }
                case 2: {
                        message.dst = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a MoveRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.MoveRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.MoveRequestBody} MoveRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        MoveRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a MoveRequestBody message.
         * @function verify
         * @memberof fs.MoveRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        MoveRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                if (!$util.isString(message.src))
                    return "src: string expected";
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                if (!$util.isString(message.dst))
                    return "dst: string expected";
            return null;
        };

        /**
         * Creates a MoveRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.MoveRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.MoveRequestBody} MoveRequestBody
         */
        MoveRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.MoveRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.MoveRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.MoveRequestBody();
            if (object.src != null)
                message.src = String(object.src);
            if (object.dst != null)
                message.dst = String(object.dst);
            return message;
        };

        /**
         * Creates a plain object from a MoveRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.MoveRequestBody
         * @static
         * @param {fs.MoveRequestBody} message MoveRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        MoveRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.src = "";
                object.dst = "";
            }
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                object.src = message.src;
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                object.dst = message.dst;
            return object;
        };

        /**
         * Converts this MoveRequestBody to JSON.
         * @function toJSON
         * @memberof fs.MoveRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        MoveRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for MoveRequestBody
         * @function getTypeUrl
         * @memberof fs.MoveRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        MoveRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.MoveRequestBody";
        };

        return MoveRequestBody;
    })();

    fs.CopyFileRequestBody = (function() {

        /**
         * Properties of a CopyFileRequestBody.
         * @memberof fs
         * @interface ICopyFileRequestBody
         * @property {string|null} [src] CopyFileRequestBody src
         * @property {string|null} [dst] CopyFileRequestBody dst
         * @property {common.IBooleanValue|null} [overwrite] CopyFileRequestBody overwrite
         */

        /**
         * Constructs a new CopyFileRequestBody.
         * @memberof fs
         * @classdesc Represents a CopyFileRequestBody.
         * @implements ICopyFileRequestBody
         * @constructor
         * @param {fs.ICopyFileRequestBody=} [properties] Properties to set
         */
        function CopyFileRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * CopyFileRequestBody src.
         * @member {string} src
         * @memberof fs.CopyFileRequestBody
         * @instance
         */
        CopyFileRequestBody.prototype.src = "";

        /**
         * CopyFileRequestBody dst.
         * @member {string} dst
         * @memberof fs.CopyFileRequestBody
         * @instance
         */
        CopyFileRequestBody.prototype.dst = "";

        /**
         * CopyFileRequestBody overwrite.
         * @member {common.IBooleanValue|null|undefined} overwrite
         * @memberof fs.CopyFileRequestBody
         * @instance
         */
        CopyFileRequestBody.prototype.overwrite = null;

        /**
         * Creates a new CopyFileRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.CopyFileRequestBody
         * @static
         * @param {fs.ICopyFileRequestBody=} [properties] Properties to set
         * @returns {fs.CopyFileRequestBody} CopyFileRequestBody instance
         */
        CopyFileRequestBody.create = function create(properties) {
            return new CopyFileRequestBody(properties);
        };

        /**
         * Encodes the specified CopyFileRequestBody message. Does not implicitly {@link fs.CopyFileRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.CopyFileRequestBody
         * @static
         * @param {fs.ICopyFileRequestBody} message CopyFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CopyFileRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.src);
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.dst);
            if (message.overwrite != null && Object.hasOwnProperty.call(message, "overwrite"))
                $root.common.BooleanValue.encode(message.overwrite, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified CopyFileRequestBody message, length delimited. Does not implicitly {@link fs.CopyFileRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.CopyFileRequestBody
         * @static
         * @param {fs.ICopyFileRequestBody} message CopyFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CopyFileRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a CopyFileRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.CopyFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.CopyFileRequestBody} CopyFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CopyFileRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.CopyFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.src = reader.string();
                        break;
                    }
                case 2: {
                        message.dst = reader.string();
                        break;
                    }
                case 3: {
                        message.overwrite = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a CopyFileRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.CopyFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.CopyFileRequestBody} CopyFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CopyFileRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a CopyFileRequestBody message.
         * @function verify
         * @memberof fs.CopyFileRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        CopyFileRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                if (!$util.isString(message.src))
                    return "src: string expected";
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                if (!$util.isString(message.dst))
                    return "dst: string expected";
            if (message.overwrite != null && Object.hasOwnProperty.call(message, "overwrite")) {
                var error = $root.common.BooleanValue.verify(message.overwrite, long + 1);
                if (error)
                    return "overwrite." + error;
            }
            return null;
        };

        /**
         * Creates a CopyFileRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.CopyFileRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.CopyFileRequestBody} CopyFileRequestBody
         */
        CopyFileRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.CopyFileRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.CopyFileRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.CopyFileRequestBody();
            if (object.src != null)
                message.src = String(object.src);
            if (object.dst != null)
                message.dst = String(object.dst);
            if (object.overwrite != null) {
                if (!$util.isObject(object.overwrite))
                    throw TypeError(".fs.CopyFileRequestBody.overwrite: object expected");
                message.overwrite = $root.common.BooleanValue.fromObject(object.overwrite, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a CopyFileRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.CopyFileRequestBody
         * @static
         * @param {fs.CopyFileRequestBody} message CopyFileRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        CopyFileRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.src = "";
                object.dst = "";
                object.overwrite = null;
            }
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                object.src = message.src;
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                object.dst = message.dst;
            if (message.overwrite != null && Object.hasOwnProperty.call(message, "overwrite"))
                object.overwrite = $root.common.BooleanValue.toObject(message.overwrite, options, q + 1);
            return object;
        };

        /**
         * Converts this CopyFileRequestBody to JSON.
         * @function toJSON
         * @memberof fs.CopyFileRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        CopyFileRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for CopyFileRequestBody
         * @function getTypeUrl
         * @memberof fs.CopyFileRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        CopyFileRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.CopyFileRequestBody";
        };

        return CopyFileRequestBody;
    })();

    fs.CopyFolderRequestBody = (function() {

        /**
         * Properties of a CopyFolderRequestBody.
         * @memberof fs
         * @interface ICopyFolderRequestBody
         * @property {string|null} [src] CopyFolderRequestBody src
         * @property {string|null} [dst] CopyFolderRequestBody dst
         * @property {common.IBooleanValue|null} [mergeAndOverwrite] CopyFolderRequestBody mergeAndOverwrite
         */

        /**
         * Constructs a new CopyFolderRequestBody.
         * @memberof fs
         * @classdesc Represents a CopyFolderRequestBody.
         * @implements ICopyFolderRequestBody
         * @constructor
         * @param {fs.ICopyFolderRequestBody=} [properties] Properties to set
         */
        function CopyFolderRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * CopyFolderRequestBody src.
         * @member {string} src
         * @memberof fs.CopyFolderRequestBody
         * @instance
         */
        CopyFolderRequestBody.prototype.src = "";

        /**
         * CopyFolderRequestBody dst.
         * @member {string} dst
         * @memberof fs.CopyFolderRequestBody
         * @instance
         */
        CopyFolderRequestBody.prototype.dst = "";

        /**
         * CopyFolderRequestBody mergeAndOverwrite.
         * @member {common.IBooleanValue|null|undefined} mergeAndOverwrite
         * @memberof fs.CopyFolderRequestBody
         * @instance
         */
        CopyFolderRequestBody.prototype.mergeAndOverwrite = null;

        /**
         * Creates a new CopyFolderRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.CopyFolderRequestBody
         * @static
         * @param {fs.ICopyFolderRequestBody=} [properties] Properties to set
         * @returns {fs.CopyFolderRequestBody} CopyFolderRequestBody instance
         */
        CopyFolderRequestBody.create = function create(properties) {
            return new CopyFolderRequestBody(properties);
        };

        /**
         * Encodes the specified CopyFolderRequestBody message. Does not implicitly {@link fs.CopyFolderRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.CopyFolderRequestBody
         * @static
         * @param {fs.ICopyFolderRequestBody} message CopyFolderRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CopyFolderRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.src);
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.dst);
            if (message.mergeAndOverwrite != null && Object.hasOwnProperty.call(message, "mergeAndOverwrite"))
                $root.common.BooleanValue.encode(message.mergeAndOverwrite, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified CopyFolderRequestBody message, length delimited. Does not implicitly {@link fs.CopyFolderRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.CopyFolderRequestBody
         * @static
         * @param {fs.ICopyFolderRequestBody} message CopyFolderRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CopyFolderRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a CopyFolderRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.CopyFolderRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.CopyFolderRequestBody} CopyFolderRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CopyFolderRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.CopyFolderRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.src = reader.string();
                        break;
                    }
                case 2: {
                        message.dst = reader.string();
                        break;
                    }
                case 3: {
                        message.mergeAndOverwrite = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a CopyFolderRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.CopyFolderRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.CopyFolderRequestBody} CopyFolderRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CopyFolderRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a CopyFolderRequestBody message.
         * @function verify
         * @memberof fs.CopyFolderRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        CopyFolderRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                if (!$util.isString(message.src))
                    return "src: string expected";
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                if (!$util.isString(message.dst))
                    return "dst: string expected";
            if (message.mergeAndOverwrite != null && Object.hasOwnProperty.call(message, "mergeAndOverwrite")) {
                var error = $root.common.BooleanValue.verify(message.mergeAndOverwrite, long + 1);
                if (error)
                    return "mergeAndOverwrite." + error;
            }
            return null;
        };

        /**
         * Creates a CopyFolderRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.CopyFolderRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.CopyFolderRequestBody} CopyFolderRequestBody
         */
        CopyFolderRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.CopyFolderRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.CopyFolderRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.CopyFolderRequestBody();
            if (object.src != null)
                message.src = String(object.src);
            if (object.dst != null)
                message.dst = String(object.dst);
            if (object.mergeAndOverwrite != null) {
                if (!$util.isObject(object.mergeAndOverwrite))
                    throw TypeError(".fs.CopyFolderRequestBody.mergeAndOverwrite: object expected");
                message.mergeAndOverwrite = $root.common.BooleanValue.fromObject(object.mergeAndOverwrite, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a CopyFolderRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.CopyFolderRequestBody
         * @static
         * @param {fs.CopyFolderRequestBody} message CopyFolderRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        CopyFolderRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.src = "";
                object.dst = "";
                object.mergeAndOverwrite = null;
            }
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                object.src = message.src;
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                object.dst = message.dst;
            if (message.mergeAndOverwrite != null && Object.hasOwnProperty.call(message, "mergeAndOverwrite"))
                object.mergeAndOverwrite = $root.common.BooleanValue.toObject(message.mergeAndOverwrite, options, q + 1);
            return object;
        };

        /**
         * Converts this CopyFolderRequestBody to JSON.
         * @function toJSON
         * @memberof fs.CopyFolderRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        CopyFolderRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for CopyFolderRequestBody
         * @function getTypeUrl
         * @memberof fs.CopyFolderRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        CopyFolderRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.CopyFolderRequestBody";
        };

        return CopyFolderRequestBody;
    })();

    fs.SaveFileRequestBody = (function() {

        /**
         * Properties of a SaveFileRequestBody.
         * @memberof fs
         * @interface ISaveFileRequestBody
         * @property {common.IObjectReference|null} [file] SaveFileRequestBody file
         * @property {string|null} [dst] SaveFileRequestBody dst
         * @property {common.IBooleanValue|null} [overwrite] SaveFileRequestBody overwrite
         */

        /**
         * Constructs a new SaveFileRequestBody.
         * @memberof fs
         * @classdesc Represents a SaveFileRequestBody.
         * @implements ISaveFileRequestBody
         * @constructor
         * @param {fs.ISaveFileRequestBody=} [properties] Properties to set
         */
        function SaveFileRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * SaveFileRequestBody file.
         * @member {common.IObjectReference|null|undefined} file
         * @memberof fs.SaveFileRequestBody
         * @instance
         */
        SaveFileRequestBody.prototype.file = null;

        /**
         * SaveFileRequestBody dst.
         * @member {string} dst
         * @memberof fs.SaveFileRequestBody
         * @instance
         */
        SaveFileRequestBody.prototype.dst = "";

        /**
         * SaveFileRequestBody overwrite.
         * @member {common.IBooleanValue|null|undefined} overwrite
         * @memberof fs.SaveFileRequestBody
         * @instance
         */
        SaveFileRequestBody.prototype.overwrite = null;

        /**
         * Creates a new SaveFileRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.SaveFileRequestBody
         * @static
         * @param {fs.ISaveFileRequestBody=} [properties] Properties to set
         * @returns {fs.SaveFileRequestBody} SaveFileRequestBody instance
         */
        SaveFileRequestBody.create = function create(properties) {
            return new SaveFileRequestBody(properties);
        };

        /**
         * Encodes the specified SaveFileRequestBody message. Does not implicitly {@link fs.SaveFileRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.SaveFileRequestBody
         * @static
         * @param {fs.ISaveFileRequestBody} message SaveFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SaveFileRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                $root.common.ObjectReference.encode(message.file, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.dst);
            if (message.overwrite != null && Object.hasOwnProperty.call(message, "overwrite"))
                $root.common.BooleanValue.encode(message.overwrite, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified SaveFileRequestBody message, length delimited. Does not implicitly {@link fs.SaveFileRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.SaveFileRequestBody
         * @static
         * @param {fs.ISaveFileRequestBody} message SaveFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SaveFileRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a SaveFileRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.SaveFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.SaveFileRequestBody} SaveFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SaveFileRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SaveFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.file = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.dst = reader.string();
                        break;
                    }
                case 3: {
                        message.overwrite = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a SaveFileRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.SaveFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.SaveFileRequestBody} SaveFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SaveFileRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a SaveFileRequestBody message.
         * @function verify
         * @memberof fs.SaveFileRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        SaveFileRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.file != null && Object.hasOwnProperty.call(message, "file")) {
                var error = $root.common.ObjectReference.verify(message.file, long + 1);
                if (error)
                    return "file." + error;
            }
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                if (!$util.isString(message.dst))
                    return "dst: string expected";
            if (message.overwrite != null && Object.hasOwnProperty.call(message, "overwrite")) {
                var error = $root.common.BooleanValue.verify(message.overwrite, long + 1);
                if (error)
                    return "overwrite." + error;
            }
            return null;
        };

        /**
         * Creates a SaveFileRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.SaveFileRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.SaveFileRequestBody} SaveFileRequestBody
         */
        SaveFileRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.SaveFileRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.SaveFileRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.SaveFileRequestBody();
            if (object.file != null) {
                if (!$util.isObject(object.file))
                    throw TypeError(".fs.SaveFileRequestBody.file: object expected");
                message.file = $root.common.ObjectReference.fromObject(object.file, long + 1);
            }
            if (object.dst != null)
                message.dst = String(object.dst);
            if (object.overwrite != null) {
                if (!$util.isObject(object.overwrite))
                    throw TypeError(".fs.SaveFileRequestBody.overwrite: object expected");
                message.overwrite = $root.common.BooleanValue.fromObject(object.overwrite, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a SaveFileRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.SaveFileRequestBody
         * @static
         * @param {fs.SaveFileRequestBody} message SaveFileRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        SaveFileRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.file = null;
                object.dst = "";
                object.overwrite = null;
            }
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                object.file = $root.common.ObjectReference.toObject(message.file, options, q + 1);
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                object.dst = message.dst;
            if (message.overwrite != null && Object.hasOwnProperty.call(message, "overwrite"))
                object.overwrite = $root.common.BooleanValue.toObject(message.overwrite, options, q + 1);
            return object;
        };

        /**
         * Converts this SaveFileRequestBody to JSON.
         * @function toJSON
         * @memberof fs.SaveFileRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        SaveFileRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for SaveFileRequestBody
         * @function getTypeUrl
         * @memberof fs.SaveFileRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        SaveFileRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.SaveFileRequestBody";
        };

        return SaveFileRequestBody;
    })();

    fs.SaveFolderRequestBody = (function() {

        /**
         * Properties of a SaveFolderRequestBody.
         * @memberof fs
         * @interface ISaveFolderRequestBody
         * @property {common.IObjectReference|null} [folder] SaveFolderRequestBody folder
         * @property {string|null} [dst] SaveFolderRequestBody dst
         * @property {common.IBooleanValue|null} [mergeAndOverwrite] SaveFolderRequestBody mergeAndOverwrite
         */

        /**
         * Constructs a new SaveFolderRequestBody.
         * @memberof fs
         * @classdesc Represents a SaveFolderRequestBody.
         * @implements ISaveFolderRequestBody
         * @constructor
         * @param {fs.ISaveFolderRequestBody=} [properties] Properties to set
         */
        function SaveFolderRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * SaveFolderRequestBody folder.
         * @member {common.IObjectReference|null|undefined} folder
         * @memberof fs.SaveFolderRequestBody
         * @instance
         */
        SaveFolderRequestBody.prototype.folder = null;

        /**
         * SaveFolderRequestBody dst.
         * @member {string} dst
         * @memberof fs.SaveFolderRequestBody
         * @instance
         */
        SaveFolderRequestBody.prototype.dst = "";

        /**
         * SaveFolderRequestBody mergeAndOverwrite.
         * @member {common.IBooleanValue|null|undefined} mergeAndOverwrite
         * @memberof fs.SaveFolderRequestBody
         * @instance
         */
        SaveFolderRequestBody.prototype.mergeAndOverwrite = null;

        /**
         * Creates a new SaveFolderRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.SaveFolderRequestBody
         * @static
         * @param {fs.ISaveFolderRequestBody=} [properties] Properties to set
         * @returns {fs.SaveFolderRequestBody} SaveFolderRequestBody instance
         */
        SaveFolderRequestBody.create = function create(properties) {
            return new SaveFolderRequestBody(properties);
        };

        /**
         * Encodes the specified SaveFolderRequestBody message. Does not implicitly {@link fs.SaveFolderRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.SaveFolderRequestBody
         * @static
         * @param {fs.ISaveFolderRequestBody} message SaveFolderRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SaveFolderRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.folder != null && Object.hasOwnProperty.call(message, "folder"))
                $root.common.ObjectReference.encode(message.folder, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.dst);
            if (message.mergeAndOverwrite != null && Object.hasOwnProperty.call(message, "mergeAndOverwrite"))
                $root.common.BooleanValue.encode(message.mergeAndOverwrite, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified SaveFolderRequestBody message, length delimited. Does not implicitly {@link fs.SaveFolderRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.SaveFolderRequestBody
         * @static
         * @param {fs.ISaveFolderRequestBody} message SaveFolderRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SaveFolderRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a SaveFolderRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.SaveFolderRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.SaveFolderRequestBody} SaveFolderRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SaveFolderRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SaveFolderRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.folder = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.dst = reader.string();
                        break;
                    }
                case 3: {
                        message.mergeAndOverwrite = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a SaveFolderRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.SaveFolderRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.SaveFolderRequestBody} SaveFolderRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SaveFolderRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a SaveFolderRequestBody message.
         * @function verify
         * @memberof fs.SaveFolderRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        SaveFolderRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.folder != null && Object.hasOwnProperty.call(message, "folder")) {
                var error = $root.common.ObjectReference.verify(message.folder, long + 1);
                if (error)
                    return "folder." + error;
            }
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                if (!$util.isString(message.dst))
                    return "dst: string expected";
            if (message.mergeAndOverwrite != null && Object.hasOwnProperty.call(message, "mergeAndOverwrite")) {
                var error = $root.common.BooleanValue.verify(message.mergeAndOverwrite, long + 1);
                if (error)
                    return "mergeAndOverwrite." + error;
            }
            return null;
        };

        /**
         * Creates a SaveFolderRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.SaveFolderRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.SaveFolderRequestBody} SaveFolderRequestBody
         */
        SaveFolderRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.SaveFolderRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.SaveFolderRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.SaveFolderRequestBody();
            if (object.folder != null) {
                if (!$util.isObject(object.folder))
                    throw TypeError(".fs.SaveFolderRequestBody.folder: object expected");
                message.folder = $root.common.ObjectReference.fromObject(object.folder, long + 1);
            }
            if (object.dst != null)
                message.dst = String(object.dst);
            if (object.mergeAndOverwrite != null) {
                if (!$util.isObject(object.mergeAndOverwrite))
                    throw TypeError(".fs.SaveFolderRequestBody.mergeAndOverwrite: object expected");
                message.mergeAndOverwrite = $root.common.BooleanValue.fromObject(object.mergeAndOverwrite, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a SaveFolderRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.SaveFolderRequestBody
         * @static
         * @param {fs.SaveFolderRequestBody} message SaveFolderRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        SaveFolderRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.folder = null;
                object.dst = "";
                object.mergeAndOverwrite = null;
            }
            if (message.folder != null && Object.hasOwnProperty.call(message, "folder"))
                object.folder = $root.common.ObjectReference.toObject(message.folder, options, q + 1);
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                object.dst = message.dst;
            if (message.mergeAndOverwrite != null && Object.hasOwnProperty.call(message, "mergeAndOverwrite"))
                object.mergeAndOverwrite = $root.common.BooleanValue.toObject(message.mergeAndOverwrite, options, q + 1);
            return object;
        };

        /**
         * Converts this SaveFolderRequestBody to JSON.
         * @function toJSON
         * @memberof fs.SaveFolderRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        SaveFolderRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for SaveFolderRequestBody
         * @function getTypeUrl
         * @memberof fs.SaveFolderRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        SaveFolderRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.SaveFolderRequestBody";
        };

        return SaveFolderRequestBody;
    })();

    fs.LinkRequestBody = (function() {

        /**
         * Properties of a LinkRequestBody.
         * @memberof fs
         * @interface ILinkRequestBody
         * @property {string|null} [path] LinkRequestBody path
         * @property {common.IObjectReference|null} [target] LinkRequestBody target
         */

        /**
         * Constructs a new LinkRequestBody.
         * @memberof fs
         * @classdesc Represents a LinkRequestBody.
         * @implements ILinkRequestBody
         * @constructor
         * @param {fs.ILinkRequestBody=} [properties] Properties to set
         */
        function LinkRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * LinkRequestBody path.
         * @member {string} path
         * @memberof fs.LinkRequestBody
         * @instance
         */
        LinkRequestBody.prototype.path = "";

        /**
         * LinkRequestBody target.
         * @member {common.IObjectReference|null|undefined} target
         * @memberof fs.LinkRequestBody
         * @instance
         */
        LinkRequestBody.prototype.target = null;

        /**
         * Creates a new LinkRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.LinkRequestBody
         * @static
         * @param {fs.ILinkRequestBody=} [properties] Properties to set
         * @returns {fs.LinkRequestBody} LinkRequestBody instance
         */
        LinkRequestBody.create = function create(properties) {
            return new LinkRequestBody(properties);
        };

        /**
         * Encodes the specified LinkRequestBody message. Does not implicitly {@link fs.LinkRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.LinkRequestBody
         * @static
         * @param {fs.ILinkRequestBody} message LinkRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        LinkRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.target != null && Object.hasOwnProperty.call(message, "target"))
                $root.common.ObjectReference.encode(message.target, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified LinkRequestBody message, length delimited. Does not implicitly {@link fs.LinkRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.LinkRequestBody
         * @static
         * @param {fs.ILinkRequestBody} message LinkRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        LinkRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a LinkRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.LinkRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.LinkRequestBody} LinkRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        LinkRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.LinkRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.target = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a LinkRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.LinkRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.LinkRequestBody} LinkRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        LinkRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a LinkRequestBody message.
         * @function verify
         * @memberof fs.LinkRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        LinkRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.target != null && Object.hasOwnProperty.call(message, "target")) {
                var error = $root.common.ObjectReference.verify(message.target, long + 1);
                if (error)
                    return "target." + error;
            }
            return null;
        };

        /**
         * Creates a LinkRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.LinkRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.LinkRequestBody} LinkRequestBody
         */
        LinkRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.LinkRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.LinkRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.LinkRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.target != null) {
                if (!$util.isObject(object.target))
                    throw TypeError(".fs.LinkRequestBody.target: object expected");
                message.target = $root.common.ObjectReference.fromObject(object.target, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a LinkRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.LinkRequestBody
         * @static
         * @param {fs.LinkRequestBody} message LinkRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        LinkRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.target = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.target != null && Object.hasOwnProperty.call(message, "target"))
                object.target = $root.common.ObjectReference.toObject(message.target, options, q + 1);
            return object;
        };

        /**
         * Converts this LinkRequestBody to JSON.
         * @function toJSON
         * @memberof fs.LinkRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        LinkRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for LinkRequestBody
         * @function getTypeUrl
         * @memberof fs.LinkRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        LinkRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.LinkRequestBody";
        };

        return LinkRequestBody;
    })();

    fs.PathAndOptFileFlags = (function() {

        /**
         * Properties of a PathAndOptFileFlags.
         * @memberof fs
         * @interface IPathAndOptFileFlags
         * @property {string|null} [path] PathAndOptFileFlags path
         * @property {fs.IFileFlags|null} [flags] PathAndOptFileFlags flags
         */

        /**
         * Constructs a new PathAndOptFileFlags.
         * @memberof fs
         * @classdesc Represents a PathAndOptFileFlags.
         * @implements IPathAndOptFileFlags
         * @constructor
         * @param {fs.IPathAndOptFileFlags=} [properties] Properties to set
         */
        function PathAndOptFileFlags(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * PathAndOptFileFlags path.
         * @member {string} path
         * @memberof fs.PathAndOptFileFlags
         * @instance
         */
        PathAndOptFileFlags.prototype.path = "";

        /**
         * PathAndOptFileFlags flags.
         * @member {fs.IFileFlags|null|undefined} flags
         * @memberof fs.PathAndOptFileFlags
         * @instance
         */
        PathAndOptFileFlags.prototype.flags = null;

        /**
         * Creates a new PathAndOptFileFlags instance using the specified properties.
         * @function create
         * @memberof fs.PathAndOptFileFlags
         * @static
         * @param {fs.IPathAndOptFileFlags=} [properties] Properties to set
         * @returns {fs.PathAndOptFileFlags} PathAndOptFileFlags instance
         */
        PathAndOptFileFlags.create = function create(properties) {
            return new PathAndOptFileFlags(properties);
        };

        /**
         * Encodes the specified PathAndOptFileFlags message. Does not implicitly {@link fs.PathAndOptFileFlags.verify|verify} messages.
         * @function encode
         * @memberof fs.PathAndOptFileFlags
         * @static
         * @param {fs.IPathAndOptFileFlags} message PathAndOptFileFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        PathAndOptFileFlags.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.fs.FileFlags.encode(message.flags, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified PathAndOptFileFlags message, length delimited. Does not implicitly {@link fs.PathAndOptFileFlags.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.PathAndOptFileFlags
         * @static
         * @param {fs.IPathAndOptFileFlags} message PathAndOptFileFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        PathAndOptFileFlags.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a PathAndOptFileFlags message from the specified reader or buffer.
         * @function decode
         * @memberof fs.PathAndOptFileFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.PathAndOptFileFlags} PathAndOptFileFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        PathAndOptFileFlags.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.PathAndOptFileFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.flags = $root.fs.FileFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a PathAndOptFileFlags message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.PathAndOptFileFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.PathAndOptFileFlags} PathAndOptFileFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        PathAndOptFileFlags.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a PathAndOptFileFlags message.
         * @function verify
         * @memberof fs.PathAndOptFileFlags
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        PathAndOptFileFlags.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.fs.FileFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a PathAndOptFileFlags message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.PathAndOptFileFlags
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.PathAndOptFileFlags} PathAndOptFileFlags
         */
        PathAndOptFileFlags.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.PathAndOptFileFlags)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.PathAndOptFileFlags: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.PathAndOptFileFlags();
            if (object.path != null)
                message.path = String(object.path);
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.PathAndOptFileFlags.flags: object expected");
                message.flags = $root.fs.FileFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a PathAndOptFileFlags message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.PathAndOptFileFlags
         * @static
         * @param {fs.PathAndOptFileFlags} message PathAndOptFileFlags
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        PathAndOptFileFlags.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.fs.FileFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this PathAndOptFileFlags to JSON.
         * @function toJSON
         * @memberof fs.PathAndOptFileFlags
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        PathAndOptFileFlags.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for PathAndOptFileFlags
         * @function getTypeUrl
         * @memberof fs.PathAndOptFileFlags
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        PathAndOptFileFlags.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.PathAndOptFileFlags";
        };

        return PathAndOptFileFlags;
    })();

    fs.FileFlags = (function() {

        /**
         * Properties of a FileFlags.
         * @memberof fs
         * @interface IFileFlags
         * @property {common.IBooleanValue|null} [truncate] FileFlags truncate
         * @property {common.IBooleanValue|null} [create] FileFlags create
         * @property {common.IBooleanValue|null} [exclusive] FileFlags exclusive
         */

        /**
         * Constructs a new FileFlags.
         * @memberof fs
         * @classdesc Represents a FileFlags.
         * @implements IFileFlags
         * @constructor
         * @param {fs.IFileFlags=} [properties] Properties to set
         */
        function FileFlags(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileFlags truncate.
         * @member {common.IBooleanValue|null|undefined} truncate
         * @memberof fs.FileFlags
         * @instance
         */
        FileFlags.prototype.truncate = null;

        /**
         * FileFlags create.
         * @member {common.IBooleanValue|null|undefined} create
         * @memberof fs.FileFlags
         * @instance
         */
        FileFlags.prototype.create = null;

        /**
         * FileFlags exclusive.
         * @member {common.IBooleanValue|null|undefined} exclusive
         * @memberof fs.FileFlags
         * @instance
         */
        FileFlags.prototype.exclusive = null;

        /**
         * Creates a new FileFlags instance using the specified properties.
         * @function create
         * @memberof fs.FileFlags
         * @static
         * @param {fs.IFileFlags=} [properties] Properties to set
         * @returns {fs.FileFlags} FileFlags instance
         */
        FileFlags.create = function create(properties) {
            return new FileFlags(properties);
        };

        /**
         * Encodes the specified FileFlags message. Does not implicitly {@link fs.FileFlags.verify|verify} messages.
         * @function encode
         * @memberof fs.FileFlags
         * @static
         * @param {fs.IFileFlags} message FileFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileFlags.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.truncate != null && Object.hasOwnProperty.call(message, "truncate"))
                $root.common.BooleanValue.encode(message.truncate, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.create != null && Object.hasOwnProperty.call(message, "create"))
                $root.common.BooleanValue.encode(message.create, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive"))
                $root.common.BooleanValue.encode(message.exclusive, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FileFlags message, length delimited. Does not implicitly {@link fs.FileFlags.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FileFlags
         * @static
         * @param {fs.IFileFlags} message FileFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileFlags.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileFlags message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FileFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FileFlags} FileFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileFlags.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FileFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.truncate = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.create = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.exclusive = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileFlags message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FileFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FileFlags} FileFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileFlags.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileFlags message.
         * @function verify
         * @memberof fs.FileFlags
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileFlags.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.truncate != null && Object.hasOwnProperty.call(message, "truncate")) {
                var error = $root.common.BooleanValue.verify(message.truncate, long + 1);
                if (error)
                    return "truncate." + error;
            }
            if (message.create != null && Object.hasOwnProperty.call(message, "create")) {
                var error = $root.common.BooleanValue.verify(message.create, long + 1);
                if (error)
                    return "create." + error;
            }
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive")) {
                var error = $root.common.BooleanValue.verify(message.exclusive, long + 1);
                if (error)
                    return "exclusive." + error;
            }
            return null;
        };

        /**
         * Creates a FileFlags message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FileFlags
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FileFlags} FileFlags
         */
        FileFlags.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FileFlags)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FileFlags: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FileFlags();
            if (object.truncate != null) {
                if (!$util.isObject(object.truncate))
                    throw TypeError(".fs.FileFlags.truncate: object expected");
                message.truncate = $root.common.BooleanValue.fromObject(object.truncate, long + 1);
            }
            if (object.create != null) {
                if (!$util.isObject(object.create))
                    throw TypeError(".fs.FileFlags.create: object expected");
                message.create = $root.common.BooleanValue.fromObject(object.create, long + 1);
            }
            if (object.exclusive != null) {
                if (!$util.isObject(object.exclusive))
                    throw TypeError(".fs.FileFlags.exclusive: object expected");
                message.exclusive = $root.common.BooleanValue.fromObject(object.exclusive, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a FileFlags message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FileFlags
         * @static
         * @param {fs.FileFlags} message FileFlags
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileFlags.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.truncate = null;
                object.create = null;
                object.exclusive = null;
            }
            if (message.truncate != null && Object.hasOwnProperty.call(message, "truncate"))
                object.truncate = $root.common.BooleanValue.toObject(message.truncate, options, q + 1);
            if (message.create != null && Object.hasOwnProperty.call(message, "create"))
                object.create = $root.common.BooleanValue.toObject(message.create, options, q + 1);
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive"))
                object.exclusive = $root.common.BooleanValue.toObject(message.exclusive, options, q + 1);
            return object;
        };

        /**
         * Converts this FileFlags to JSON.
         * @function toJSON
         * @memberof fs.FileFlags
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileFlags.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileFlags
         * @function getTypeUrl
         * @memberof fs.FileFlags
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileFlags.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FileFlags";
        };

        return FileFlags;
    })();

    fs.WriteJsonFileRequestBody = (function() {

        /**
         * Properties of a WriteJsonFileRequestBody.
         * @memberof fs
         * @interface IWriteJsonFileRequestBody
         * @property {string|null} [path] WriteJsonFileRequestBody path
         * @property {string|null} [json] WriteJsonFileRequestBody json
         * @property {fs.IFileFlags|null} [flags] WriteJsonFileRequestBody flags
         */

        /**
         * Constructs a new WriteJsonFileRequestBody.
         * @memberof fs
         * @classdesc Represents a WriteJsonFileRequestBody.
         * @implements IWriteJsonFileRequestBody
         * @constructor
         * @param {fs.IWriteJsonFileRequestBody=} [properties] Properties to set
         */
        function WriteJsonFileRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * WriteJsonFileRequestBody path.
         * @member {string} path
         * @memberof fs.WriteJsonFileRequestBody
         * @instance
         */
        WriteJsonFileRequestBody.prototype.path = "";

        /**
         * WriteJsonFileRequestBody json.
         * @member {string} json
         * @memberof fs.WriteJsonFileRequestBody
         * @instance
         */
        WriteJsonFileRequestBody.prototype.json = "";

        /**
         * WriteJsonFileRequestBody flags.
         * @member {fs.IFileFlags|null|undefined} flags
         * @memberof fs.WriteJsonFileRequestBody
         * @instance
         */
        WriteJsonFileRequestBody.prototype.flags = null;

        /**
         * Creates a new WriteJsonFileRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.WriteJsonFileRequestBody
         * @static
         * @param {fs.IWriteJsonFileRequestBody=} [properties] Properties to set
         * @returns {fs.WriteJsonFileRequestBody} WriteJsonFileRequestBody instance
         */
        WriteJsonFileRequestBody.create = function create(properties) {
            return new WriteJsonFileRequestBody(properties);
        };

        /**
         * Encodes the specified WriteJsonFileRequestBody message. Does not implicitly {@link fs.WriteJsonFileRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.WriteJsonFileRequestBody
         * @static
         * @param {fs.IWriteJsonFileRequestBody} message WriteJsonFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteJsonFileRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.json);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.fs.FileFlags.encode(message.flags, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified WriteJsonFileRequestBody message, length delimited. Does not implicitly {@link fs.WriteJsonFileRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.WriteJsonFileRequestBody
         * @static
         * @param {fs.IWriteJsonFileRequestBody} message WriteJsonFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteJsonFileRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a WriteJsonFileRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.WriteJsonFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.WriteJsonFileRequestBody} WriteJsonFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteJsonFileRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.WriteJsonFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.json = reader.string();
                        break;
                    }
                case 3: {
                        message.flags = $root.fs.FileFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a WriteJsonFileRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.WriteJsonFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.WriteJsonFileRequestBody} WriteJsonFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteJsonFileRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a WriteJsonFileRequestBody message.
         * @function verify
         * @memberof fs.WriteJsonFileRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        WriteJsonFileRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                if (!$util.isString(message.json))
                    return "json: string expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.fs.FileFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a WriteJsonFileRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.WriteJsonFileRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.WriteJsonFileRequestBody} WriteJsonFileRequestBody
         */
        WriteJsonFileRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.WriteJsonFileRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.WriteJsonFileRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.WriteJsonFileRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.json != null)
                message.json = String(object.json);
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.WriteJsonFileRequestBody.flags: object expected");
                message.flags = $root.fs.FileFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a WriteJsonFileRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.WriteJsonFileRequestBody
         * @static
         * @param {fs.WriteJsonFileRequestBody} message WriteJsonFileRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        WriteJsonFileRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.json = "";
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = message.json;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.fs.FileFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this WriteJsonFileRequestBody to JSON.
         * @function toJSON
         * @memberof fs.WriteJsonFileRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        WriteJsonFileRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for WriteJsonFileRequestBody
         * @function getTypeUrl
         * @memberof fs.WriteJsonFileRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        WriteJsonFileRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.WriteJsonFileRequestBody";
        };

        return WriteJsonFileRequestBody;
    })();

    fs.WriteTxtFileRequestBody = (function() {

        /**
         * Properties of a WriteTxtFileRequestBody.
         * @memberof fs
         * @interface IWriteTxtFileRequestBody
         * @property {string|null} [path] WriteTxtFileRequestBody path
         * @property {string|null} [txt] WriteTxtFileRequestBody txt
         * @property {fs.IFileFlags|null} [flags] WriteTxtFileRequestBody flags
         */

        /**
         * Constructs a new WriteTxtFileRequestBody.
         * @memberof fs
         * @classdesc Represents a WriteTxtFileRequestBody.
         * @implements IWriteTxtFileRequestBody
         * @constructor
         * @param {fs.IWriteTxtFileRequestBody=} [properties] Properties to set
         */
        function WriteTxtFileRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * WriteTxtFileRequestBody path.
         * @member {string} path
         * @memberof fs.WriteTxtFileRequestBody
         * @instance
         */
        WriteTxtFileRequestBody.prototype.path = "";

        /**
         * WriteTxtFileRequestBody txt.
         * @member {string} txt
         * @memberof fs.WriteTxtFileRequestBody
         * @instance
         */
        WriteTxtFileRequestBody.prototype.txt = "";

        /**
         * WriteTxtFileRequestBody flags.
         * @member {fs.IFileFlags|null|undefined} flags
         * @memberof fs.WriteTxtFileRequestBody
         * @instance
         */
        WriteTxtFileRequestBody.prototype.flags = null;

        /**
         * Creates a new WriteTxtFileRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.WriteTxtFileRequestBody
         * @static
         * @param {fs.IWriteTxtFileRequestBody=} [properties] Properties to set
         * @returns {fs.WriteTxtFileRequestBody} WriteTxtFileRequestBody instance
         */
        WriteTxtFileRequestBody.create = function create(properties) {
            return new WriteTxtFileRequestBody(properties);
        };

        /**
         * Encodes the specified WriteTxtFileRequestBody message. Does not implicitly {@link fs.WriteTxtFileRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.WriteTxtFileRequestBody
         * @static
         * @param {fs.IWriteTxtFileRequestBody} message WriteTxtFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteTxtFileRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.txt);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.fs.FileFlags.encode(message.flags, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified WriteTxtFileRequestBody message, length delimited. Does not implicitly {@link fs.WriteTxtFileRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.WriteTxtFileRequestBody
         * @static
         * @param {fs.IWriteTxtFileRequestBody} message WriteTxtFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteTxtFileRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a WriteTxtFileRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.WriteTxtFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.WriteTxtFileRequestBody} WriteTxtFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteTxtFileRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.WriteTxtFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.txt = reader.string();
                        break;
                    }
                case 3: {
                        message.flags = $root.fs.FileFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a WriteTxtFileRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.WriteTxtFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.WriteTxtFileRequestBody} WriteTxtFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteTxtFileRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a WriteTxtFileRequestBody message.
         * @function verify
         * @memberof fs.WriteTxtFileRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        WriteTxtFileRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                if (!$util.isString(message.txt))
                    return "txt: string expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.fs.FileFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a WriteTxtFileRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.WriteTxtFileRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.WriteTxtFileRequestBody} WriteTxtFileRequestBody
         */
        WriteTxtFileRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.WriteTxtFileRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.WriteTxtFileRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.WriteTxtFileRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.txt != null)
                message.txt = String(object.txt);
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.WriteTxtFileRequestBody.flags: object expected");
                message.flags = $root.fs.FileFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a WriteTxtFileRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.WriteTxtFileRequestBody
         * @static
         * @param {fs.WriteTxtFileRequestBody} message WriteTxtFileRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        WriteTxtFileRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.txt = "";
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                object.txt = message.txt;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.fs.FileFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this WriteTxtFileRequestBody to JSON.
         * @function toJSON
         * @memberof fs.WriteTxtFileRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        WriteTxtFileRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for WriteTxtFileRequestBody
         * @function getTypeUrl
         * @memberof fs.WriteTxtFileRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        WriteTxtFileRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.WriteTxtFileRequestBody";
        };

        return WriteTxtFileRequestBody;
    })();

    fs.WriteBytesRequestBody = (function() {

        /**
         * Properties of a WriteBytesRequestBody.
         * @memberof fs
         * @interface IWriteBytesRequestBody
         * @property {string|null} [path] WriteBytesRequestBody path
         * @property {Uint8Array|null} [bytes] WriteBytesRequestBody bytes
         * @property {fs.IFileFlags|null} [flags] WriteBytesRequestBody flags
         */

        /**
         * Constructs a new WriteBytesRequestBody.
         * @memberof fs
         * @classdesc Represents a WriteBytesRequestBody.
         * @implements IWriteBytesRequestBody
         * @constructor
         * @param {fs.IWriteBytesRequestBody=} [properties] Properties to set
         */
        function WriteBytesRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * WriteBytesRequestBody path.
         * @member {string} path
         * @memberof fs.WriteBytesRequestBody
         * @instance
         */
        WriteBytesRequestBody.prototype.path = "";

        /**
         * WriteBytesRequestBody bytes.
         * @member {Uint8Array} bytes
         * @memberof fs.WriteBytesRequestBody
         * @instance
         */
        WriteBytesRequestBody.prototype.bytes = $util.newBuffer([]);

        /**
         * WriteBytesRequestBody flags.
         * @member {fs.IFileFlags|null|undefined} flags
         * @memberof fs.WriteBytesRequestBody
         * @instance
         */
        WriteBytesRequestBody.prototype.flags = null;

        /**
         * Creates a new WriteBytesRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.WriteBytesRequestBody
         * @static
         * @param {fs.IWriteBytesRequestBody=} [properties] Properties to set
         * @returns {fs.WriteBytesRequestBody} WriteBytesRequestBody instance
         */
        WriteBytesRequestBody.create = function create(properties) {
            return new WriteBytesRequestBody(properties);
        };

        /**
         * Encodes the specified WriteBytesRequestBody message. Does not implicitly {@link fs.WriteBytesRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.WriteBytesRequestBody
         * @static
         * @param {fs.IWriteBytesRequestBody} message WriteBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteBytesRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.bytes);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.fs.FileFlags.encode(message.flags, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified WriteBytesRequestBody message, length delimited. Does not implicitly {@link fs.WriteBytesRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.WriteBytesRequestBody
         * @static
         * @param {fs.IWriteBytesRequestBody} message WriteBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteBytesRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a WriteBytesRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.WriteBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.WriteBytesRequestBody} WriteBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteBytesRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.WriteBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.bytes = reader.bytes();
                        break;
                    }
                case 3: {
                        message.flags = $root.fs.FileFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a WriteBytesRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.WriteBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.WriteBytesRequestBody} WriteBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteBytesRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a WriteBytesRequestBody message.
         * @function verify
         * @memberof fs.WriteBytesRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        WriteBytesRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                if (!(message.bytes && typeof message.bytes.length === "number" || $util.isString(message.bytes)))
                    return "bytes: buffer expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.fs.FileFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a WriteBytesRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.WriteBytesRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.WriteBytesRequestBody} WriteBytesRequestBody
         */
        WriteBytesRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.WriteBytesRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.WriteBytesRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.WriteBytesRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.bytes != null)
                if (typeof object.bytes === "string")
                    $util.base64.decode(object.bytes, message.bytes = $util.newBuffer($util.base64.length(object.bytes)), 0);
                else if (object.bytes.length >= 0)
                    message.bytes = object.bytes;
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.WriteBytesRequestBody.flags: object expected");
                message.flags = $root.fs.FileFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a WriteBytesRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.WriteBytesRequestBody
         * @static
         * @param {fs.WriteBytesRequestBody} message WriteBytesRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        WriteBytesRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                if (options.bytes === String)
                    object.bytes = "";
                else {
                    object.bytes = [];
                    if (options.bytes !== Array)
                        object.bytes = $util.newBuffer(object.bytes);
                }
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = options.bytes === String ? $util.base64.encode(message.bytes, 0, message.bytes.length) : options.bytes === Array ? Array.prototype.slice.call(message.bytes) : message.bytes;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.fs.FileFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this WriteBytesRequestBody to JSON.
         * @function toJSON
         * @memberof fs.WriteBytesRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        WriteBytesRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for WriteBytesRequestBody
         * @function getTypeUrl
         * @memberof fs.WriteBytesRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        WriteBytesRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.WriteBytesRequestBody";
        };

        return WriteBytesRequestBody;
    })();

    fs.VersionedWriteJsonFileRequestBody = (function() {

        /**
         * Properties of a VersionedWriteJsonFileRequestBody.
         * @memberof fs
         * @interface IVersionedWriteJsonFileRequestBody
         * @property {string|null} [path] VersionedWriteJsonFileRequestBody path
         * @property {string|null} [json] VersionedWriteJsonFileRequestBody json
         * @property {fs.IVersionedFileWriteFlags|null} [flags] VersionedWriteJsonFileRequestBody flags
         */

        /**
         * Constructs a new VersionedWriteJsonFileRequestBody.
         * @memberof fs
         * @classdesc Represents a VersionedWriteJsonFileRequestBody.
         * @implements IVersionedWriteJsonFileRequestBody
         * @constructor
         * @param {fs.IVersionedWriteJsonFileRequestBody=} [properties] Properties to set
         */
        function VersionedWriteJsonFileRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedWriteJsonFileRequestBody path.
         * @member {string} path
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @instance
         */
        VersionedWriteJsonFileRequestBody.prototype.path = "";

        /**
         * VersionedWriteJsonFileRequestBody json.
         * @member {string} json
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @instance
         */
        VersionedWriteJsonFileRequestBody.prototype.json = "";

        /**
         * VersionedWriteJsonFileRequestBody flags.
         * @member {fs.IVersionedFileWriteFlags|null|undefined} flags
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @instance
         */
        VersionedWriteJsonFileRequestBody.prototype.flags = null;

        /**
         * Creates a new VersionedWriteJsonFileRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @static
         * @param {fs.IVersionedWriteJsonFileRequestBody=} [properties] Properties to set
         * @returns {fs.VersionedWriteJsonFileRequestBody} VersionedWriteJsonFileRequestBody instance
         */
        VersionedWriteJsonFileRequestBody.create = function create(properties) {
            return new VersionedWriteJsonFileRequestBody(properties);
        };

        /**
         * Encodes the specified VersionedWriteJsonFileRequestBody message. Does not implicitly {@link fs.VersionedWriteJsonFileRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @static
         * @param {fs.IVersionedWriteJsonFileRequestBody} message VersionedWriteJsonFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedWriteJsonFileRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.json);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.fs.VersionedFileWriteFlags.encode(message.flags, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedWriteJsonFileRequestBody message, length delimited. Does not implicitly {@link fs.VersionedWriteJsonFileRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @static
         * @param {fs.IVersionedWriteJsonFileRequestBody} message VersionedWriteJsonFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedWriteJsonFileRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedWriteJsonFileRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.VersionedWriteJsonFileRequestBody} VersionedWriteJsonFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedWriteJsonFileRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedWriteJsonFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.json = reader.string();
                        break;
                    }
                case 3: {
                        message.flags = $root.fs.VersionedFileWriteFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedWriteJsonFileRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.VersionedWriteJsonFileRequestBody} VersionedWriteJsonFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedWriteJsonFileRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedWriteJsonFileRequestBody message.
         * @function verify
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedWriteJsonFileRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                if (!$util.isString(message.json))
                    return "json: string expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.fs.VersionedFileWriteFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedWriteJsonFileRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.VersionedWriteJsonFileRequestBody} VersionedWriteJsonFileRequestBody
         */
        VersionedWriteJsonFileRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.VersionedWriteJsonFileRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.VersionedWriteJsonFileRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.VersionedWriteJsonFileRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.json != null)
                message.json = String(object.json);
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.VersionedWriteJsonFileRequestBody.flags: object expected");
                message.flags = $root.fs.VersionedFileWriteFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedWriteJsonFileRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @static
         * @param {fs.VersionedWriteJsonFileRequestBody} message VersionedWriteJsonFileRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedWriteJsonFileRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.json = "";
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = message.json;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.fs.VersionedFileWriteFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedWriteJsonFileRequestBody to JSON.
         * @function toJSON
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedWriteJsonFileRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedWriteJsonFileRequestBody
         * @function getTypeUrl
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedWriteJsonFileRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.VersionedWriteJsonFileRequestBody";
        };

        return VersionedWriteJsonFileRequestBody;
    })();

    fs.VersionedFileWriteFlags = (function() {

        /**
         * Properties of a VersionedFileWriteFlags.
         * @memberof fs
         * @interface IVersionedFileWriteFlags
         * @property {common.IBooleanValue|null} [truncate] VersionedFileWriteFlags truncate
         * @property {common.IBooleanValue|null} [create] VersionedFileWriteFlags create
         * @property {common.IBooleanValue|null} [exclusive] VersionedFileWriteFlags exclusive
         * @property {common.IUInt64Value|null} [currentVersion] VersionedFileWriteFlags currentVersion
         */

        /**
         * Constructs a new VersionedFileWriteFlags.
         * @memberof fs
         * @classdesc Represents a VersionedFileWriteFlags.
         * @implements IVersionedFileWriteFlags
         * @constructor
         * @param {fs.IVersionedFileWriteFlags=} [properties] Properties to set
         */
        function VersionedFileWriteFlags(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedFileWriteFlags truncate.
         * @member {common.IBooleanValue|null|undefined} truncate
         * @memberof fs.VersionedFileWriteFlags
         * @instance
         */
        VersionedFileWriteFlags.prototype.truncate = null;

        /**
         * VersionedFileWriteFlags create.
         * @member {common.IBooleanValue|null|undefined} create
         * @memberof fs.VersionedFileWriteFlags
         * @instance
         */
        VersionedFileWriteFlags.prototype.create = null;

        /**
         * VersionedFileWriteFlags exclusive.
         * @member {common.IBooleanValue|null|undefined} exclusive
         * @memberof fs.VersionedFileWriteFlags
         * @instance
         */
        VersionedFileWriteFlags.prototype.exclusive = null;

        /**
         * VersionedFileWriteFlags currentVersion.
         * @member {common.IUInt64Value|null|undefined} currentVersion
         * @memberof fs.VersionedFileWriteFlags
         * @instance
         */
        VersionedFileWriteFlags.prototype.currentVersion = null;

        /**
         * Creates a new VersionedFileWriteFlags instance using the specified properties.
         * @function create
         * @memberof fs.VersionedFileWriteFlags
         * @static
         * @param {fs.IVersionedFileWriteFlags=} [properties] Properties to set
         * @returns {fs.VersionedFileWriteFlags} VersionedFileWriteFlags instance
         */
        VersionedFileWriteFlags.create = function create(properties) {
            return new VersionedFileWriteFlags(properties);
        };

        /**
         * Encodes the specified VersionedFileWriteFlags message. Does not implicitly {@link fs.VersionedFileWriteFlags.verify|verify} messages.
         * @function encode
         * @memberof fs.VersionedFileWriteFlags
         * @static
         * @param {fs.IVersionedFileWriteFlags} message VersionedFileWriteFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedFileWriteFlags.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.truncate != null && Object.hasOwnProperty.call(message, "truncate"))
                $root.common.BooleanValue.encode(message.truncate, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.create != null && Object.hasOwnProperty.call(message, "create"))
                $root.common.BooleanValue.encode(message.create, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive"))
                $root.common.BooleanValue.encode(message.exclusive, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                $root.common.UInt64Value.encode(message.currentVersion, writer.uint32(/* id 10, wireType 2 =*/82).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedFileWriteFlags message, length delimited. Does not implicitly {@link fs.VersionedFileWriteFlags.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.VersionedFileWriteFlags
         * @static
         * @param {fs.IVersionedFileWriteFlags} message VersionedFileWriteFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedFileWriteFlags.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedFileWriteFlags message from the specified reader or buffer.
         * @function decode
         * @memberof fs.VersionedFileWriteFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.VersionedFileWriteFlags} VersionedFileWriteFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedFileWriteFlags.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedFileWriteFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.truncate = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.create = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.exclusive = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 10: {
                        message.currentVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedFileWriteFlags message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.VersionedFileWriteFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.VersionedFileWriteFlags} VersionedFileWriteFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedFileWriteFlags.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedFileWriteFlags message.
         * @function verify
         * @memberof fs.VersionedFileWriteFlags
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedFileWriteFlags.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.truncate != null && Object.hasOwnProperty.call(message, "truncate")) {
                var error = $root.common.BooleanValue.verify(message.truncate, long + 1);
                if (error)
                    return "truncate." + error;
            }
            if (message.create != null && Object.hasOwnProperty.call(message, "create")) {
                var error = $root.common.BooleanValue.verify(message.create, long + 1);
                if (error)
                    return "create." + error;
            }
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive")) {
                var error = $root.common.BooleanValue.verify(message.exclusive, long + 1);
                if (error)
                    return "exclusive." + error;
            }
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion")) {
                var error = $root.common.UInt64Value.verify(message.currentVersion, long + 1);
                if (error)
                    return "currentVersion." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedFileWriteFlags message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.VersionedFileWriteFlags
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.VersionedFileWriteFlags} VersionedFileWriteFlags
         */
        VersionedFileWriteFlags.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.VersionedFileWriteFlags)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.VersionedFileWriteFlags: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.VersionedFileWriteFlags();
            if (object.truncate != null) {
                if (!$util.isObject(object.truncate))
                    throw TypeError(".fs.VersionedFileWriteFlags.truncate: object expected");
                message.truncate = $root.common.BooleanValue.fromObject(object.truncate, long + 1);
            }
            if (object.create != null) {
                if (!$util.isObject(object.create))
                    throw TypeError(".fs.VersionedFileWriteFlags.create: object expected");
                message.create = $root.common.BooleanValue.fromObject(object.create, long + 1);
            }
            if (object.exclusive != null) {
                if (!$util.isObject(object.exclusive))
                    throw TypeError(".fs.VersionedFileWriteFlags.exclusive: object expected");
                message.exclusive = $root.common.BooleanValue.fromObject(object.exclusive, long + 1);
            }
            if (object.currentVersion != null) {
                if (!$util.isObject(object.currentVersion))
                    throw TypeError(".fs.VersionedFileWriteFlags.currentVersion: object expected");
                message.currentVersion = $root.common.UInt64Value.fromObject(object.currentVersion, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedFileWriteFlags message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.VersionedFileWriteFlags
         * @static
         * @param {fs.VersionedFileWriteFlags} message VersionedFileWriteFlags
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedFileWriteFlags.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.truncate = null;
                object.create = null;
                object.exclusive = null;
                object.currentVersion = null;
            }
            if (message.truncate != null && Object.hasOwnProperty.call(message, "truncate"))
                object.truncate = $root.common.BooleanValue.toObject(message.truncate, options, q + 1);
            if (message.create != null && Object.hasOwnProperty.call(message, "create"))
                object.create = $root.common.BooleanValue.toObject(message.create, options, q + 1);
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive"))
                object.exclusive = $root.common.BooleanValue.toObject(message.exclusive, options, q + 1);
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                object.currentVersion = $root.common.UInt64Value.toObject(message.currentVersion, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedFileWriteFlags to JSON.
         * @function toJSON
         * @memberof fs.VersionedFileWriteFlags
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedFileWriteFlags.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedFileWriteFlags
         * @function getTypeUrl
         * @memberof fs.VersionedFileWriteFlags
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedFileWriteFlags.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.VersionedFileWriteFlags";
        };

        return VersionedFileWriteFlags;
    })();

    fs.VersionedWriteTxtFileRequestBody = (function() {

        /**
         * Properties of a VersionedWriteTxtFileRequestBody.
         * @memberof fs
         * @interface IVersionedWriteTxtFileRequestBody
         * @property {string|null} [path] VersionedWriteTxtFileRequestBody path
         * @property {string|null} [txt] VersionedWriteTxtFileRequestBody txt
         * @property {fs.IVersionedFileWriteFlags|null} [flags] VersionedWriteTxtFileRequestBody flags
         */

        /**
         * Constructs a new VersionedWriteTxtFileRequestBody.
         * @memberof fs
         * @classdesc Represents a VersionedWriteTxtFileRequestBody.
         * @implements IVersionedWriteTxtFileRequestBody
         * @constructor
         * @param {fs.IVersionedWriteTxtFileRequestBody=} [properties] Properties to set
         */
        function VersionedWriteTxtFileRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedWriteTxtFileRequestBody path.
         * @member {string} path
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @instance
         */
        VersionedWriteTxtFileRequestBody.prototype.path = "";

        /**
         * VersionedWriteTxtFileRequestBody txt.
         * @member {string} txt
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @instance
         */
        VersionedWriteTxtFileRequestBody.prototype.txt = "";

        /**
         * VersionedWriteTxtFileRequestBody flags.
         * @member {fs.IVersionedFileWriteFlags|null|undefined} flags
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @instance
         */
        VersionedWriteTxtFileRequestBody.prototype.flags = null;

        /**
         * Creates a new VersionedWriteTxtFileRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @static
         * @param {fs.IVersionedWriteTxtFileRequestBody=} [properties] Properties to set
         * @returns {fs.VersionedWriteTxtFileRequestBody} VersionedWriteTxtFileRequestBody instance
         */
        VersionedWriteTxtFileRequestBody.create = function create(properties) {
            return new VersionedWriteTxtFileRequestBody(properties);
        };

        /**
         * Encodes the specified VersionedWriteTxtFileRequestBody message. Does not implicitly {@link fs.VersionedWriteTxtFileRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @static
         * @param {fs.IVersionedWriteTxtFileRequestBody} message VersionedWriteTxtFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedWriteTxtFileRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.txt);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.fs.VersionedFileWriteFlags.encode(message.flags, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedWriteTxtFileRequestBody message, length delimited. Does not implicitly {@link fs.VersionedWriteTxtFileRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @static
         * @param {fs.IVersionedWriteTxtFileRequestBody} message VersionedWriteTxtFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedWriteTxtFileRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedWriteTxtFileRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.VersionedWriteTxtFileRequestBody} VersionedWriteTxtFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedWriteTxtFileRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedWriteTxtFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.txt = reader.string();
                        break;
                    }
                case 3: {
                        message.flags = $root.fs.VersionedFileWriteFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedWriteTxtFileRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.VersionedWriteTxtFileRequestBody} VersionedWriteTxtFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedWriteTxtFileRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedWriteTxtFileRequestBody message.
         * @function verify
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedWriteTxtFileRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                if (!$util.isString(message.txt))
                    return "txt: string expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.fs.VersionedFileWriteFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedWriteTxtFileRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.VersionedWriteTxtFileRequestBody} VersionedWriteTxtFileRequestBody
         */
        VersionedWriteTxtFileRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.VersionedWriteTxtFileRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.VersionedWriteTxtFileRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.VersionedWriteTxtFileRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.txt != null)
                message.txt = String(object.txt);
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.VersionedWriteTxtFileRequestBody.flags: object expected");
                message.flags = $root.fs.VersionedFileWriteFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedWriteTxtFileRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @static
         * @param {fs.VersionedWriteTxtFileRequestBody} message VersionedWriteTxtFileRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedWriteTxtFileRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.txt = "";
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                object.txt = message.txt;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.fs.VersionedFileWriteFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedWriteTxtFileRequestBody to JSON.
         * @function toJSON
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedWriteTxtFileRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedWriteTxtFileRequestBody
         * @function getTypeUrl
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedWriteTxtFileRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.VersionedWriteTxtFileRequestBody";
        };

        return VersionedWriteTxtFileRequestBody;
    })();

    fs.VersionedWriteBytesRequestBody = (function() {

        /**
         * Properties of a VersionedWriteBytesRequestBody.
         * @memberof fs
         * @interface IVersionedWriteBytesRequestBody
         * @property {string|null} [path] VersionedWriteBytesRequestBody path
         * @property {Uint8Array|null} [bytes] VersionedWriteBytesRequestBody bytes
         * @property {fs.IVersionedFileWriteFlags|null} [flags] VersionedWriteBytesRequestBody flags
         */

        /**
         * Constructs a new VersionedWriteBytesRequestBody.
         * @memberof fs
         * @classdesc Represents a VersionedWriteBytesRequestBody.
         * @implements IVersionedWriteBytesRequestBody
         * @constructor
         * @param {fs.IVersionedWriteBytesRequestBody=} [properties] Properties to set
         */
        function VersionedWriteBytesRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedWriteBytesRequestBody path.
         * @member {string} path
         * @memberof fs.VersionedWriteBytesRequestBody
         * @instance
         */
        VersionedWriteBytesRequestBody.prototype.path = "";

        /**
         * VersionedWriteBytesRequestBody bytes.
         * @member {Uint8Array} bytes
         * @memberof fs.VersionedWriteBytesRequestBody
         * @instance
         */
        VersionedWriteBytesRequestBody.prototype.bytes = $util.newBuffer([]);

        /**
         * VersionedWriteBytesRequestBody flags.
         * @member {fs.IVersionedFileWriteFlags|null|undefined} flags
         * @memberof fs.VersionedWriteBytesRequestBody
         * @instance
         */
        VersionedWriteBytesRequestBody.prototype.flags = null;

        /**
         * Creates a new VersionedWriteBytesRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.VersionedWriteBytesRequestBody
         * @static
         * @param {fs.IVersionedWriteBytesRequestBody=} [properties] Properties to set
         * @returns {fs.VersionedWriteBytesRequestBody} VersionedWriteBytesRequestBody instance
         */
        VersionedWriteBytesRequestBody.create = function create(properties) {
            return new VersionedWriteBytesRequestBody(properties);
        };

        /**
         * Encodes the specified VersionedWriteBytesRequestBody message. Does not implicitly {@link fs.VersionedWriteBytesRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.VersionedWriteBytesRequestBody
         * @static
         * @param {fs.IVersionedWriteBytesRequestBody} message VersionedWriteBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedWriteBytesRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.bytes);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.fs.VersionedFileWriteFlags.encode(message.flags, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedWriteBytesRequestBody message, length delimited. Does not implicitly {@link fs.VersionedWriteBytesRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.VersionedWriteBytesRequestBody
         * @static
         * @param {fs.IVersionedWriteBytesRequestBody} message VersionedWriteBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedWriteBytesRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedWriteBytesRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.VersionedWriteBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.VersionedWriteBytesRequestBody} VersionedWriteBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedWriteBytesRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedWriteBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.bytes = reader.bytes();
                        break;
                    }
                case 3: {
                        message.flags = $root.fs.VersionedFileWriteFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedWriteBytesRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.VersionedWriteBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.VersionedWriteBytesRequestBody} VersionedWriteBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedWriteBytesRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedWriteBytesRequestBody message.
         * @function verify
         * @memberof fs.VersionedWriteBytesRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedWriteBytesRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                if (!(message.bytes && typeof message.bytes.length === "number" || $util.isString(message.bytes)))
                    return "bytes: buffer expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.fs.VersionedFileWriteFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedWriteBytesRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.VersionedWriteBytesRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.VersionedWriteBytesRequestBody} VersionedWriteBytesRequestBody
         */
        VersionedWriteBytesRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.VersionedWriteBytesRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.VersionedWriteBytesRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.VersionedWriteBytesRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.bytes != null)
                if (typeof object.bytes === "string")
                    $util.base64.decode(object.bytes, message.bytes = $util.newBuffer($util.base64.length(object.bytes)), 0);
                else if (object.bytes.length >= 0)
                    message.bytes = object.bytes;
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.VersionedWriteBytesRequestBody.flags: object expected");
                message.flags = $root.fs.VersionedFileWriteFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedWriteBytesRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.VersionedWriteBytesRequestBody
         * @static
         * @param {fs.VersionedWriteBytesRequestBody} message VersionedWriteBytesRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedWriteBytesRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                if (options.bytes === String)
                    object.bytes = "";
                else {
                    object.bytes = [];
                    if (options.bytes !== Array)
                        object.bytes = $util.newBuffer(object.bytes);
                }
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = options.bytes === String ? $util.base64.encode(message.bytes, 0, message.bytes.length) : options.bytes === Array ? Array.prototype.slice.call(message.bytes) : message.bytes;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.fs.VersionedFileWriteFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedWriteBytesRequestBody to JSON.
         * @function toJSON
         * @memberof fs.VersionedWriteBytesRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedWriteBytesRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedWriteBytesRequestBody
         * @function getTypeUrl
         * @memberof fs.VersionedWriteBytesRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedWriteBytesRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.VersionedWriteBytesRequestBody";
        };

        return VersionedWriteBytesRequestBody;
    })();

    fs.VersionedGetByteSinkRequestBody = (function() {

        /**
         * Properties of a VersionedGetByteSinkRequestBody.
         * @memberof fs
         * @interface IVersionedGetByteSinkRequestBody
         * @property {string|null} [path] VersionedGetByteSinkRequestBody path
         * @property {fs.IVersionedFileWriteFlags|null} [flags] VersionedGetByteSinkRequestBody flags
         */

        /**
         * Constructs a new VersionedGetByteSinkRequestBody.
         * @memberof fs
         * @classdesc Represents a VersionedGetByteSinkRequestBody.
         * @implements IVersionedGetByteSinkRequestBody
         * @constructor
         * @param {fs.IVersionedGetByteSinkRequestBody=} [properties] Properties to set
         */
        function VersionedGetByteSinkRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedGetByteSinkRequestBody path.
         * @member {string} path
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @instance
         */
        VersionedGetByteSinkRequestBody.prototype.path = "";

        /**
         * VersionedGetByteSinkRequestBody flags.
         * @member {fs.IVersionedFileWriteFlags|null|undefined} flags
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @instance
         */
        VersionedGetByteSinkRequestBody.prototype.flags = null;

        /**
         * Creates a new VersionedGetByteSinkRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @static
         * @param {fs.IVersionedGetByteSinkRequestBody=} [properties] Properties to set
         * @returns {fs.VersionedGetByteSinkRequestBody} VersionedGetByteSinkRequestBody instance
         */
        VersionedGetByteSinkRequestBody.create = function create(properties) {
            return new VersionedGetByteSinkRequestBody(properties);
        };

        /**
         * Encodes the specified VersionedGetByteSinkRequestBody message. Does not implicitly {@link fs.VersionedGetByteSinkRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @static
         * @param {fs.IVersionedGetByteSinkRequestBody} message VersionedGetByteSinkRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetByteSinkRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.fs.VersionedFileWriteFlags.encode(message.flags, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedGetByteSinkRequestBody message, length delimited. Does not implicitly {@link fs.VersionedGetByteSinkRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @static
         * @param {fs.IVersionedGetByteSinkRequestBody} message VersionedGetByteSinkRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetByteSinkRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedGetByteSinkRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.VersionedGetByteSinkRequestBody} VersionedGetByteSinkRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetByteSinkRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedGetByteSinkRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.flags = $root.fs.VersionedFileWriteFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedGetByteSinkRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.VersionedGetByteSinkRequestBody} VersionedGetByteSinkRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetByteSinkRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedGetByteSinkRequestBody message.
         * @function verify
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedGetByteSinkRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.fs.VersionedFileWriteFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedGetByteSinkRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.VersionedGetByteSinkRequestBody} VersionedGetByteSinkRequestBody
         */
        VersionedGetByteSinkRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.VersionedGetByteSinkRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.VersionedGetByteSinkRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.VersionedGetByteSinkRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.VersionedGetByteSinkRequestBody.flags: object expected");
                message.flags = $root.fs.VersionedFileWriteFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedGetByteSinkRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @static
         * @param {fs.VersionedGetByteSinkRequestBody} message VersionedGetByteSinkRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedGetByteSinkRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.fs.VersionedFileWriteFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedGetByteSinkRequestBody to JSON.
         * @function toJSON
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedGetByteSinkRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedGetByteSinkRequestBody
         * @function getTypeUrl
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedGetByteSinkRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.VersionedGetByteSinkRequestBody";
        };

        return VersionedGetByteSinkRequestBody;
    })();

    fs.ArchiveCurrentRequestBody = (function() {

        /**
         * Properties of an ArchiveCurrentRequestBody.
         * @memberof fs
         * @interface IArchiveCurrentRequestBody
         * @property {string|null} [path] ArchiveCurrentRequestBody path
         * @property {common.IUInt64Value|null} [version] ArchiveCurrentRequestBody version
         */

        /**
         * Constructs a new ArchiveCurrentRequestBody.
         * @memberof fs
         * @classdesc Represents an ArchiveCurrentRequestBody.
         * @implements IArchiveCurrentRequestBody
         * @constructor
         * @param {fs.IArchiveCurrentRequestBody=} [properties] Properties to set
         */
        function ArchiveCurrentRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ArchiveCurrentRequestBody path.
         * @member {string} path
         * @memberof fs.ArchiveCurrentRequestBody
         * @instance
         */
        ArchiveCurrentRequestBody.prototype.path = "";

        /**
         * ArchiveCurrentRequestBody version.
         * @member {common.IUInt64Value|null|undefined} version
         * @memberof fs.ArchiveCurrentRequestBody
         * @instance
         */
        ArchiveCurrentRequestBody.prototype.version = null;

        /**
         * Creates a new ArchiveCurrentRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.ArchiveCurrentRequestBody
         * @static
         * @param {fs.IArchiveCurrentRequestBody=} [properties] Properties to set
         * @returns {fs.ArchiveCurrentRequestBody} ArchiveCurrentRequestBody instance
         */
        ArchiveCurrentRequestBody.create = function create(properties) {
            return new ArchiveCurrentRequestBody(properties);
        };

        /**
         * Encodes the specified ArchiveCurrentRequestBody message. Does not implicitly {@link fs.ArchiveCurrentRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.ArchiveCurrentRequestBody
         * @static
         * @param {fs.IArchiveCurrentRequestBody} message ArchiveCurrentRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ArchiveCurrentRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                $root.common.UInt64Value.encode(message.version, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified ArchiveCurrentRequestBody message, length delimited. Does not implicitly {@link fs.ArchiveCurrentRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.ArchiveCurrentRequestBody
         * @static
         * @param {fs.IArchiveCurrentRequestBody} message ArchiveCurrentRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ArchiveCurrentRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an ArchiveCurrentRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.ArchiveCurrentRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.ArchiveCurrentRequestBody} ArchiveCurrentRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ArchiveCurrentRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.ArchiveCurrentRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.version = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an ArchiveCurrentRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.ArchiveCurrentRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.ArchiveCurrentRequestBody} ArchiveCurrentRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ArchiveCurrentRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an ArchiveCurrentRequestBody message.
         * @function verify
         * @memberof fs.ArchiveCurrentRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ArchiveCurrentRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.version != null && Object.hasOwnProperty.call(message, "version")) {
                var error = $root.common.UInt64Value.verify(message.version, long + 1);
                if (error)
                    return "version." + error;
            }
            return null;
        };

        /**
         * Creates an ArchiveCurrentRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.ArchiveCurrentRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.ArchiveCurrentRequestBody} ArchiveCurrentRequestBody
         */
        ArchiveCurrentRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.ArchiveCurrentRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.ArchiveCurrentRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.ArchiveCurrentRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.version != null) {
                if (!$util.isObject(object.version))
                    throw TypeError(".fs.ArchiveCurrentRequestBody.version: object expected");
                message.version = $root.common.UInt64Value.fromObject(object.version, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an ArchiveCurrentRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.ArchiveCurrentRequestBody
         * @static
         * @param {fs.ArchiveCurrentRequestBody} message ArchiveCurrentRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ArchiveCurrentRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.version = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                object.version = $root.common.UInt64Value.toObject(message.version, options, q + 1);
            return object;
        };

        /**
         * Converts this ArchiveCurrentRequestBody to JSON.
         * @function toJSON
         * @memberof fs.ArchiveCurrentRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ArchiveCurrentRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ArchiveCurrentRequestBody
         * @function getTypeUrl
         * @memberof fs.ArchiveCurrentRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ArchiveCurrentRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.ArchiveCurrentRequestBody";
        };

        return ArchiveCurrentRequestBody;
    })();

    fs.FSSyncStatusRequestBody = (function() {

        /**
         * Properties of a FSSyncStatusRequestBody.
         * @memberof fs
         * @interface IFSSyncStatusRequestBody
         * @property {string|null} [path] FSSyncStatusRequestBody path
         * @property {boolean|null} [skipServerCheck] FSSyncStatusRequestBody skipServerCheck
         */

        /**
         * Constructs a new FSSyncStatusRequestBody.
         * @memberof fs
         * @classdesc Represents a FSSyncStatusRequestBody.
         * @implements IFSSyncStatusRequestBody
         * @constructor
         * @param {fs.IFSSyncStatusRequestBody=} [properties] Properties to set
         */
        function FSSyncStatusRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FSSyncStatusRequestBody path.
         * @member {string} path
         * @memberof fs.FSSyncStatusRequestBody
         * @instance
         */
        FSSyncStatusRequestBody.prototype.path = "";

        /**
         * FSSyncStatusRequestBody skipServerCheck.
         * @member {boolean} skipServerCheck
         * @memberof fs.FSSyncStatusRequestBody
         * @instance
         */
        FSSyncStatusRequestBody.prototype.skipServerCheck = false;

        /**
         * Creates a new FSSyncStatusRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.FSSyncStatusRequestBody
         * @static
         * @param {fs.IFSSyncStatusRequestBody=} [properties] Properties to set
         * @returns {fs.FSSyncStatusRequestBody} FSSyncStatusRequestBody instance
         */
        FSSyncStatusRequestBody.create = function create(properties) {
            return new FSSyncStatusRequestBody(properties);
        };

        /**
         * Encodes the specified FSSyncStatusRequestBody message. Does not implicitly {@link fs.FSSyncStatusRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.FSSyncStatusRequestBody
         * @static
         * @param {fs.IFSSyncStatusRequestBody} message FSSyncStatusRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncStatusRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.skipServerCheck != null && Object.hasOwnProperty.call(message, "skipServerCheck"))
                writer.uint32(/* id 2, wireType 0 =*/16).bool(message.skipServerCheck);
            return writer;
        };

        /**
         * Encodes the specified FSSyncStatusRequestBody message, length delimited. Does not implicitly {@link fs.FSSyncStatusRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FSSyncStatusRequestBody
         * @static
         * @param {fs.IFSSyncStatusRequestBody} message FSSyncStatusRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncStatusRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FSSyncStatusRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FSSyncStatusRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FSSyncStatusRequestBody} FSSyncStatusRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSSyncStatusRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSSyncStatusRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.skipServerCheck = reader.bool();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FSSyncStatusRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FSSyncStatusRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FSSyncStatusRequestBody} FSSyncStatusRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSSyncStatusRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FSSyncStatusRequestBody message.
         * @function verify
         * @memberof fs.FSSyncStatusRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSSyncStatusRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.skipServerCheck != null && Object.hasOwnProperty.call(message, "skipServerCheck"))
                if (typeof message.skipServerCheck !== "boolean")
                    return "skipServerCheck: boolean expected";
            return null;
        };

        /**
         * Creates a FSSyncStatusRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSSyncStatusRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSSyncStatusRequestBody} FSSyncStatusRequestBody
         */
        FSSyncStatusRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FSSyncStatusRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FSSyncStatusRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FSSyncStatusRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.skipServerCheck != null)
                message.skipServerCheck = Boolean(object.skipServerCheck);
            return message;
        };

        /**
         * Creates a plain object from a FSSyncStatusRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSSyncStatusRequestBody
         * @static
         * @param {fs.FSSyncStatusRequestBody} message FSSyncStatusRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSSyncStatusRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.skipServerCheck = false;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.skipServerCheck != null && Object.hasOwnProperty.call(message, "skipServerCheck"))
                object.skipServerCheck = message.skipServerCheck;
            return object;
        };

        /**
         * Converts this FSSyncStatusRequestBody to JSON.
         * @function toJSON
         * @memberof fs.FSSyncStatusRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FSSyncStatusRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FSSyncStatusRequestBody
         * @function getTypeUrl
         * @memberof fs.FSSyncStatusRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FSSyncStatusRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FSSyncStatusRequestBody";
        };

        return FSSyncStatusRequestBody;
    })();

    fs.FSSyncIsOnDiskRequestBody = (function() {

        /**
         * Properties of a FSSyncIsOnDiskRequestBody.
         * @memberof fs
         * @interface IFSSyncIsOnDiskRequestBody
         * @property {string|null} [path] FSSyncIsOnDiskRequestBody path
         * @property {number|Long|null} [version] FSSyncIsOnDiskRequestBody version
         */

        /**
         * Constructs a new FSSyncIsOnDiskRequestBody.
         * @memberof fs
         * @classdesc Represents a FSSyncIsOnDiskRequestBody.
         * @implements IFSSyncIsOnDiskRequestBody
         * @constructor
         * @param {fs.IFSSyncIsOnDiskRequestBody=} [properties] Properties to set
         */
        function FSSyncIsOnDiskRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FSSyncIsOnDiskRequestBody path.
         * @member {string} path
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @instance
         */
        FSSyncIsOnDiskRequestBody.prototype.path = "";

        /**
         * FSSyncIsOnDiskRequestBody version.
         * @member {number|Long} version
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @instance
         */
        FSSyncIsOnDiskRequestBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new FSSyncIsOnDiskRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @static
         * @param {fs.IFSSyncIsOnDiskRequestBody=} [properties] Properties to set
         * @returns {fs.FSSyncIsOnDiskRequestBody} FSSyncIsOnDiskRequestBody instance
         */
        FSSyncIsOnDiskRequestBody.create = function create(properties) {
            return new FSSyncIsOnDiskRequestBody(properties);
        };

        /**
         * Encodes the specified FSSyncIsOnDiskRequestBody message. Does not implicitly {@link fs.FSSyncIsOnDiskRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @static
         * @param {fs.IFSSyncIsOnDiskRequestBody} message FSSyncIsOnDiskRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncIsOnDiskRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.version);
            return writer;
        };

        /**
         * Encodes the specified FSSyncIsOnDiskRequestBody message, length delimited. Does not implicitly {@link fs.FSSyncIsOnDiskRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @static
         * @param {fs.IFSSyncIsOnDiskRequestBody} message FSSyncIsOnDiskRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncIsOnDiskRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FSSyncIsOnDiskRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FSSyncIsOnDiskRequestBody} FSSyncIsOnDiskRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSSyncIsOnDiskRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSSyncIsOnDiskRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.version = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FSSyncIsOnDiskRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FSSyncIsOnDiskRequestBody} FSSyncIsOnDiskRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSSyncIsOnDiskRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FSSyncIsOnDiskRequestBody message.
         * @function verify
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSSyncIsOnDiskRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            return null;
        };

        /**
         * Creates a FSSyncIsOnDiskRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSSyncIsOnDiskRequestBody} FSSyncIsOnDiskRequestBody
         */
        FSSyncIsOnDiskRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FSSyncIsOnDiskRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FSSyncIsOnDiskRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FSSyncIsOnDiskRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from a FSSyncIsOnDiskRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @static
         * @param {fs.FSSyncIsOnDiskRequestBody} message FSSyncIsOnDiskRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSSyncIsOnDiskRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            return object;
        };

        /**
         * Converts this FSSyncIsOnDiskRequestBody to JSON.
         * @function toJSON
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FSSyncIsOnDiskRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FSSyncIsOnDiskRequestBody
         * @function getTypeUrl
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FSSyncIsOnDiskRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FSSyncIsOnDiskRequestBody";
        };

        return FSSyncIsOnDiskRequestBody;
    })();

    fs.FSSyncIsOnDiskReplyBody = (function() {

        /**
         * Properties of a FSSyncIsOnDiskReplyBody.
         * @memberof fs
         * @interface IFSSyncIsOnDiskReplyBody
         * @property {string|null} [status] FSSyncIsOnDiskReplyBody status
         */

        /**
         * Constructs a new FSSyncIsOnDiskReplyBody.
         * @memberof fs
         * @classdesc Represents a FSSyncIsOnDiskReplyBody.
         * @implements IFSSyncIsOnDiskReplyBody
         * @constructor
         * @param {fs.IFSSyncIsOnDiskReplyBody=} [properties] Properties to set
         */
        function FSSyncIsOnDiskReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FSSyncIsOnDiskReplyBody status.
         * @member {string} status
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @instance
         */
        FSSyncIsOnDiskReplyBody.prototype.status = "";

        /**
         * Creates a new FSSyncIsOnDiskReplyBody instance using the specified properties.
         * @function create
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @static
         * @param {fs.IFSSyncIsOnDiskReplyBody=} [properties] Properties to set
         * @returns {fs.FSSyncIsOnDiskReplyBody} FSSyncIsOnDiskReplyBody instance
         */
        FSSyncIsOnDiskReplyBody.create = function create(properties) {
            return new FSSyncIsOnDiskReplyBody(properties);
        };

        /**
         * Encodes the specified FSSyncIsOnDiskReplyBody message. Does not implicitly {@link fs.FSSyncIsOnDiskReplyBody.verify|verify} messages.
         * @function encode
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @static
         * @param {fs.IFSSyncIsOnDiskReplyBody} message FSSyncIsOnDiskReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncIsOnDiskReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.status != null && Object.hasOwnProperty.call(message, "status"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.status);
            return writer;
        };

        /**
         * Encodes the specified FSSyncIsOnDiskReplyBody message, length delimited. Does not implicitly {@link fs.FSSyncIsOnDiskReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @static
         * @param {fs.IFSSyncIsOnDiskReplyBody} message FSSyncIsOnDiskReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncIsOnDiskReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FSSyncIsOnDiskReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FSSyncIsOnDiskReplyBody} FSSyncIsOnDiskReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSSyncIsOnDiskReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSSyncIsOnDiskReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.status = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FSSyncIsOnDiskReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FSSyncIsOnDiskReplyBody} FSSyncIsOnDiskReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSSyncIsOnDiskReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FSSyncIsOnDiskReplyBody message.
         * @function verify
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSSyncIsOnDiskReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.status != null && Object.hasOwnProperty.call(message, "status"))
                if (!$util.isString(message.status))
                    return "status: string expected";
            return null;
        };

        /**
         * Creates a FSSyncIsOnDiskReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSSyncIsOnDiskReplyBody} FSSyncIsOnDiskReplyBody
         */
        FSSyncIsOnDiskReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FSSyncIsOnDiskReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FSSyncIsOnDiskReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FSSyncIsOnDiskReplyBody();
            if (object.status != null)
                message.status = String(object.status);
            return message;
        };

        /**
         * Creates a plain object from a FSSyncIsOnDiskReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @static
         * @param {fs.FSSyncIsOnDiskReplyBody} message FSSyncIsOnDiskReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSSyncIsOnDiskReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.status = "";
            if (message.status != null && Object.hasOwnProperty.call(message, "status"))
                object.status = message.status;
            return object;
        };

        /**
         * Converts this FSSyncIsOnDiskReplyBody to JSON.
         * @function toJSON
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FSSyncIsOnDiskReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FSSyncIsOnDiskReplyBody
         * @function getTypeUrl
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FSSyncIsOnDiskReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FSSyncIsOnDiskReplyBody";
        };

        return FSSyncIsOnDiskReplyBody;
    })();

    fs.FSSyncStartDownloadRequestBody = (function() {

        /**
         * Properties of a FSSyncStartDownloadRequestBody.
         * @memberof fs
         * @interface IFSSyncStartDownloadRequestBody
         * @property {string|null} [path] FSSyncStartDownloadRequestBody path
         * @property {number|Long|null} [version] FSSyncStartDownloadRequestBody version
         */

        /**
         * Constructs a new FSSyncStartDownloadRequestBody.
         * @memberof fs
         * @classdesc Represents a FSSyncStartDownloadRequestBody.
         * @implements IFSSyncStartDownloadRequestBody
         * @constructor
         * @param {fs.IFSSyncStartDownloadRequestBody=} [properties] Properties to set
         */
        function FSSyncStartDownloadRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FSSyncStartDownloadRequestBody path.
         * @member {string} path
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @instance
         */
        FSSyncStartDownloadRequestBody.prototype.path = "";

        /**
         * FSSyncStartDownloadRequestBody version.
         * @member {number|Long} version
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @instance
         */
        FSSyncStartDownloadRequestBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new FSSyncStartDownloadRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @static
         * @param {fs.IFSSyncStartDownloadRequestBody=} [properties] Properties to set
         * @returns {fs.FSSyncStartDownloadRequestBody} FSSyncStartDownloadRequestBody instance
         */
        FSSyncStartDownloadRequestBody.create = function create(properties) {
            return new FSSyncStartDownloadRequestBody(properties);
        };

        /**
         * Encodes the specified FSSyncStartDownloadRequestBody message. Does not implicitly {@link fs.FSSyncStartDownloadRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @static
         * @param {fs.IFSSyncStartDownloadRequestBody} message FSSyncStartDownloadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncStartDownloadRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.version);
            return writer;
        };

        /**
         * Encodes the specified FSSyncStartDownloadRequestBody message, length delimited. Does not implicitly {@link fs.FSSyncStartDownloadRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @static
         * @param {fs.IFSSyncStartDownloadRequestBody} message FSSyncStartDownloadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncStartDownloadRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FSSyncStartDownloadRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FSSyncStartDownloadRequestBody} FSSyncStartDownloadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSSyncStartDownloadRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSSyncStartDownloadRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.version = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FSSyncStartDownloadRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FSSyncStartDownloadRequestBody} FSSyncStartDownloadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSSyncStartDownloadRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FSSyncStartDownloadRequestBody message.
         * @function verify
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSSyncStartDownloadRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            return null;
        };

        /**
         * Creates a FSSyncStartDownloadRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSSyncStartDownloadRequestBody} FSSyncStartDownloadRequestBody
         */
        FSSyncStartDownloadRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FSSyncStartDownloadRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FSSyncStartDownloadRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FSSyncStartDownloadRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from a FSSyncStartDownloadRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @static
         * @param {fs.FSSyncStartDownloadRequestBody} message FSSyncStartDownloadRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSSyncStartDownloadRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            return object;
        };

        /**
         * Converts this FSSyncStartDownloadRequestBody to JSON.
         * @function toJSON
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FSSyncStartDownloadRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FSSyncStartDownloadRequestBody
         * @function getTypeUrl
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FSSyncStartDownloadRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FSSyncStartDownloadRequestBody";
        };

        return FSSyncStartDownloadRequestBody;
    })();

    fs.AdoptRemoteRequestBody = (function() {

        /**
         * Properties of an AdoptRemoteRequestBody.
         * @memberof fs
         * @interface IAdoptRemoteRequestBody
         * @property {string|null} [path] AdoptRemoteRequestBody path
         * @property {file.IOptionsToAdopteRemote|null} [opts] AdoptRemoteRequestBody opts
         */

        /**
         * Constructs a new AdoptRemoteRequestBody.
         * @memberof fs
         * @classdesc Represents an AdoptRemoteRequestBody.
         * @implements IAdoptRemoteRequestBody
         * @constructor
         * @param {fs.IAdoptRemoteRequestBody=} [properties] Properties to set
         */
        function AdoptRemoteRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * AdoptRemoteRequestBody path.
         * @member {string} path
         * @memberof fs.AdoptRemoteRequestBody
         * @instance
         */
        AdoptRemoteRequestBody.prototype.path = "";

        /**
         * AdoptRemoteRequestBody opts.
         * @member {file.IOptionsToAdopteRemote|null|undefined} opts
         * @memberof fs.AdoptRemoteRequestBody
         * @instance
         */
        AdoptRemoteRequestBody.prototype.opts = null;

        /**
         * Creates a new AdoptRemoteRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.AdoptRemoteRequestBody
         * @static
         * @param {fs.IAdoptRemoteRequestBody=} [properties] Properties to set
         * @returns {fs.AdoptRemoteRequestBody} AdoptRemoteRequestBody instance
         */
        AdoptRemoteRequestBody.create = function create(properties) {
            return new AdoptRemoteRequestBody(properties);
        };

        /**
         * Encodes the specified AdoptRemoteRequestBody message. Does not implicitly {@link fs.AdoptRemoteRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.AdoptRemoteRequestBody
         * @static
         * @param {fs.IAdoptRemoteRequestBody} message AdoptRemoteRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AdoptRemoteRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.file.OptionsToAdopteRemote.encode(message.opts, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified AdoptRemoteRequestBody message, length delimited. Does not implicitly {@link fs.AdoptRemoteRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.AdoptRemoteRequestBody
         * @static
         * @param {fs.IAdoptRemoteRequestBody} message AdoptRemoteRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AdoptRemoteRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an AdoptRemoteRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.AdoptRemoteRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.AdoptRemoteRequestBody} AdoptRemoteRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AdoptRemoteRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.AdoptRemoteRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.opts = $root.file.OptionsToAdopteRemote.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an AdoptRemoteRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.AdoptRemoteRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.AdoptRemoteRequestBody} AdoptRemoteRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AdoptRemoteRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an AdoptRemoteRequestBody message.
         * @function verify
         * @memberof fs.AdoptRemoteRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        AdoptRemoteRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts")) {
                var error = $root.file.OptionsToAdopteRemote.verify(message.opts, long + 1);
                if (error)
                    return "opts." + error;
            }
            return null;
        };

        /**
         * Creates an AdoptRemoteRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.AdoptRemoteRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.AdoptRemoteRequestBody} AdoptRemoteRequestBody
         */
        AdoptRemoteRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.AdoptRemoteRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.AdoptRemoteRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.AdoptRemoteRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.opts != null) {
                if (!$util.isObject(object.opts))
                    throw TypeError(".fs.AdoptRemoteRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToAdopteRemote.fromObject(object.opts, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an AdoptRemoteRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.AdoptRemoteRequestBody
         * @static
         * @param {fs.AdoptRemoteRequestBody} message AdoptRemoteRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        AdoptRemoteRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.opts = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                object.opts = $root.file.OptionsToAdopteRemote.toObject(message.opts, options, q + 1);
            return object;
        };

        /**
         * Converts this AdoptRemoteRequestBody to JSON.
         * @function toJSON
         * @memberof fs.AdoptRemoteRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        AdoptRemoteRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for AdoptRemoteRequestBody
         * @function getTypeUrl
         * @memberof fs.AdoptRemoteRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        AdoptRemoteRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.AdoptRemoteRequestBody";
        };

        return AdoptRemoteRequestBody;
    })();

    fs.DiffCurrentAndRemoteFileVersionsRequestBody = (function() {

        /**
         * Properties of a DiffCurrentAndRemoteFileVersionsRequestBody.
         * @memberof fs
         * @interface IDiffCurrentAndRemoteFileVersionsRequestBody
         * @property {string|null} [path] DiffCurrentAndRemoteFileVersionsRequestBody path
         * @property {file.IOptionsToDiffFileVersions|null} [opts] DiffCurrentAndRemoteFileVersionsRequestBody opts
         */

        /**
         * Constructs a new DiffCurrentAndRemoteFileVersionsRequestBody.
         * @memberof fs
         * @classdesc Represents a DiffCurrentAndRemoteFileVersionsRequestBody.
         * @implements IDiffCurrentAndRemoteFileVersionsRequestBody
         * @constructor
         * @param {fs.IDiffCurrentAndRemoteFileVersionsRequestBody=} [properties] Properties to set
         */
        function DiffCurrentAndRemoteFileVersionsRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * DiffCurrentAndRemoteFileVersionsRequestBody path.
         * @member {string} path
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @instance
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.prototype.path = "";

        /**
         * DiffCurrentAndRemoteFileVersionsRequestBody opts.
         * @member {file.IOptionsToDiffFileVersions|null|undefined} opts
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @instance
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.prototype.opts = null;

        /**
         * Creates a new DiffCurrentAndRemoteFileVersionsRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @static
         * @param {fs.IDiffCurrentAndRemoteFileVersionsRequestBody=} [properties] Properties to set
         * @returns {fs.DiffCurrentAndRemoteFileVersionsRequestBody} DiffCurrentAndRemoteFileVersionsRequestBody instance
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.create = function create(properties) {
            return new DiffCurrentAndRemoteFileVersionsRequestBody(properties);
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteFileVersionsRequestBody message. Does not implicitly {@link fs.DiffCurrentAndRemoteFileVersionsRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @static
         * @param {fs.IDiffCurrentAndRemoteFileVersionsRequestBody} message DiffCurrentAndRemoteFileVersionsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.file.OptionsToDiffFileVersions.encode(message.opts, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteFileVersionsRequestBody message, length delimited. Does not implicitly {@link fs.DiffCurrentAndRemoteFileVersionsRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @static
         * @param {fs.IDiffCurrentAndRemoteFileVersionsRequestBody} message DiffCurrentAndRemoteFileVersionsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a DiffCurrentAndRemoteFileVersionsRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.DiffCurrentAndRemoteFileVersionsRequestBody} DiffCurrentAndRemoteFileVersionsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.DiffCurrentAndRemoteFileVersionsRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.opts = $root.file.OptionsToDiffFileVersions.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a DiffCurrentAndRemoteFileVersionsRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.DiffCurrentAndRemoteFileVersionsRequestBody} DiffCurrentAndRemoteFileVersionsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a DiffCurrentAndRemoteFileVersionsRequestBody message.
         * @function verify
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts")) {
                var error = $root.file.OptionsToDiffFileVersions.verify(message.opts, long + 1);
                if (error)
                    return "opts." + error;
            }
            return null;
        };

        /**
         * Creates a DiffCurrentAndRemoteFileVersionsRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.DiffCurrentAndRemoteFileVersionsRequestBody} DiffCurrentAndRemoteFileVersionsRequestBody
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.DiffCurrentAndRemoteFileVersionsRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.DiffCurrentAndRemoteFileVersionsRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.DiffCurrentAndRemoteFileVersionsRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.opts != null) {
                if (!$util.isObject(object.opts))
                    throw TypeError(".fs.DiffCurrentAndRemoteFileVersionsRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToDiffFileVersions.fromObject(object.opts, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a DiffCurrentAndRemoteFileVersionsRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @static
         * @param {fs.DiffCurrentAndRemoteFileVersionsRequestBody} message DiffCurrentAndRemoteFileVersionsRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.opts = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                object.opts = $root.file.OptionsToDiffFileVersions.toObject(message.opts, options, q + 1);
            return object;
        };

        /**
         * Converts this DiffCurrentAndRemoteFileVersionsRequestBody to JSON.
         * @function toJSON
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for DiffCurrentAndRemoteFileVersionsRequestBody
         * @function getTypeUrl
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.DiffCurrentAndRemoteFileVersionsRequestBody";
        };

        return DiffCurrentAndRemoteFileVersionsRequestBody;
    })();

    fs.DiffCurrentAndRemoteFolderVersionsRequestBody = (function() {

        /**
         * Properties of a DiffCurrentAndRemoteFolderVersionsRequestBody.
         * @memberof fs
         * @interface IDiffCurrentAndRemoteFolderVersionsRequestBody
         * @property {string|null} [path] DiffCurrentAndRemoteFolderVersionsRequestBody path
         * @property {common.IUInt64Value|null} [remoteVersion] DiffCurrentAndRemoteFolderVersionsRequestBody remoteVersion
         */

        /**
         * Constructs a new DiffCurrentAndRemoteFolderVersionsRequestBody.
         * @memberof fs
         * @classdesc Represents a DiffCurrentAndRemoteFolderVersionsRequestBody.
         * @implements IDiffCurrentAndRemoteFolderVersionsRequestBody
         * @constructor
         * @param {fs.IDiffCurrentAndRemoteFolderVersionsRequestBody=} [properties] Properties to set
         */
        function DiffCurrentAndRemoteFolderVersionsRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * DiffCurrentAndRemoteFolderVersionsRequestBody path.
         * @member {string} path
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @instance
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.prototype.path = "";

        /**
         * DiffCurrentAndRemoteFolderVersionsRequestBody remoteVersion.
         * @member {common.IUInt64Value|null|undefined} remoteVersion
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @instance
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.prototype.remoteVersion = null;

        /**
         * Creates a new DiffCurrentAndRemoteFolderVersionsRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @static
         * @param {fs.IDiffCurrentAndRemoteFolderVersionsRequestBody=} [properties] Properties to set
         * @returns {fs.DiffCurrentAndRemoteFolderVersionsRequestBody} DiffCurrentAndRemoteFolderVersionsRequestBody instance
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.create = function create(properties) {
            return new DiffCurrentAndRemoteFolderVersionsRequestBody(properties);
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteFolderVersionsRequestBody message. Does not implicitly {@link fs.DiffCurrentAndRemoteFolderVersionsRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @static
         * @param {fs.IDiffCurrentAndRemoteFolderVersionsRequestBody} message DiffCurrentAndRemoteFolderVersionsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteFolderVersionsRequestBody message, length delimited. Does not implicitly {@link fs.DiffCurrentAndRemoteFolderVersionsRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @static
         * @param {fs.IDiffCurrentAndRemoteFolderVersionsRequestBody} message DiffCurrentAndRemoteFolderVersionsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a DiffCurrentAndRemoteFolderVersionsRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.DiffCurrentAndRemoteFolderVersionsRequestBody} DiffCurrentAndRemoteFolderVersionsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.DiffCurrentAndRemoteFolderVersionsRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a DiffCurrentAndRemoteFolderVersionsRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.DiffCurrentAndRemoteFolderVersionsRequestBody} DiffCurrentAndRemoteFolderVersionsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a DiffCurrentAndRemoteFolderVersionsRequestBody message.
         * @function verify
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion, long + 1);
                if (error)
                    return "remoteVersion." + error;
            }
            return null;
        };

        /**
         * Creates a DiffCurrentAndRemoteFolderVersionsRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.DiffCurrentAndRemoteFolderVersionsRequestBody} DiffCurrentAndRemoteFolderVersionsRequestBody
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.DiffCurrentAndRemoteFolderVersionsRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.DiffCurrentAndRemoteFolderVersionsRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.DiffCurrentAndRemoteFolderVersionsRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.remoteVersion != null) {
                if (!$util.isObject(object.remoteVersion))
                    throw TypeError(".fs.DiffCurrentAndRemoteFolderVersionsRequestBody.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a DiffCurrentAndRemoteFolderVersionsRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @static
         * @param {fs.DiffCurrentAndRemoteFolderVersionsRequestBody} message DiffCurrentAndRemoteFolderVersionsRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.remoteVersion = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options, q + 1);
            return object;
        };

        /**
         * Converts this DiffCurrentAndRemoteFolderVersionsRequestBody to JSON.
         * @function toJSON
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for DiffCurrentAndRemoteFolderVersionsRequestBody
         * @function getTypeUrl
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.DiffCurrentAndRemoteFolderVersionsRequestBody";
        };

        return DiffCurrentAndRemoteFolderVersionsRequestBody;
    })();

    fs.DiffCurrentAndRemoteReplyBody = (function() {

        /**
         * Properties of a DiffCurrentAndRemoteReplyBody.
         * @memberof fs
         * @interface IDiffCurrentAndRemoteReplyBody
         * @property {fs.IFolderDiff|null} [diff] DiffCurrentAndRemoteReplyBody diff
         */

        /**
         * Constructs a new DiffCurrentAndRemoteReplyBody.
         * @memberof fs
         * @classdesc Represents a DiffCurrentAndRemoteReplyBody.
         * @implements IDiffCurrentAndRemoteReplyBody
         * @constructor
         * @param {fs.IDiffCurrentAndRemoteReplyBody=} [properties] Properties to set
         */
        function DiffCurrentAndRemoteReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * DiffCurrentAndRemoteReplyBody diff.
         * @member {fs.IFolderDiff|null|undefined} diff
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @instance
         */
        DiffCurrentAndRemoteReplyBody.prototype.diff = null;

        /**
         * Creates a new DiffCurrentAndRemoteReplyBody instance using the specified properties.
         * @function create
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {fs.IDiffCurrentAndRemoteReplyBody=} [properties] Properties to set
         * @returns {fs.DiffCurrentAndRemoteReplyBody} DiffCurrentAndRemoteReplyBody instance
         */
        DiffCurrentAndRemoteReplyBody.create = function create(properties) {
            return new DiffCurrentAndRemoteReplyBody(properties);
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteReplyBody message. Does not implicitly {@link fs.DiffCurrentAndRemoteReplyBody.verify|verify} messages.
         * @function encode
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {fs.IDiffCurrentAndRemoteReplyBody} message DiffCurrentAndRemoteReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.diff != null && Object.hasOwnProperty.call(message, "diff"))
                $root.fs.FolderDiff.encode(message.diff, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteReplyBody message, length delimited. Does not implicitly {@link fs.DiffCurrentAndRemoteReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {fs.IDiffCurrentAndRemoteReplyBody} message DiffCurrentAndRemoteReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a DiffCurrentAndRemoteReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.DiffCurrentAndRemoteReplyBody} DiffCurrentAndRemoteReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.DiffCurrentAndRemoteReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.diff = $root.fs.FolderDiff.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a DiffCurrentAndRemoteReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.DiffCurrentAndRemoteReplyBody} DiffCurrentAndRemoteReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a DiffCurrentAndRemoteReplyBody message.
         * @function verify
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        DiffCurrentAndRemoteReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.diff != null && Object.hasOwnProperty.call(message, "diff")) {
                var error = $root.fs.FolderDiff.verify(message.diff, long + 1);
                if (error)
                    return "diff." + error;
            }
            return null;
        };

        /**
         * Creates a DiffCurrentAndRemoteReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.DiffCurrentAndRemoteReplyBody} DiffCurrentAndRemoteReplyBody
         */
        DiffCurrentAndRemoteReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.DiffCurrentAndRemoteReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.DiffCurrentAndRemoteReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.DiffCurrentAndRemoteReplyBody();
            if (object.diff != null) {
                if (!$util.isObject(object.diff))
                    throw TypeError(".fs.DiffCurrentAndRemoteReplyBody.diff: object expected");
                message.diff = $root.fs.FolderDiff.fromObject(object.diff, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a DiffCurrentAndRemoteReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {fs.DiffCurrentAndRemoteReplyBody} message DiffCurrentAndRemoteReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        DiffCurrentAndRemoteReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.diff = null;
            if (message.diff != null && Object.hasOwnProperty.call(message, "diff"))
                object.diff = $root.fs.FolderDiff.toObject(message.diff, options, q + 1);
            return object;
        };

        /**
         * Converts this DiffCurrentAndRemoteReplyBody to JSON.
         * @function toJSON
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        DiffCurrentAndRemoteReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for DiffCurrentAndRemoteReplyBody
         * @function getTypeUrl
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        DiffCurrentAndRemoteReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.DiffCurrentAndRemoteReplyBody";
        };

        return DiffCurrentAndRemoteReplyBody;
    })();

    fs.FolderDiff = (function() {

        /**
         * Properties of a FolderDiff.
         * @memberof fs
         * @interface IFolderDiff
         * @property {number|Long|null} [currentVersion] FolderDiff currentVersion
         * @property {boolean|null} [isCurrentLocal] FolderDiff isCurrentLocal
         * @property {common.IUInt64Value|null} [remoteVersion] FolderDiff remoteVersion
         * @property {common.IUInt64Value|null} [syncedVersion] FolderDiff syncedVersion
         * @property {boolean|null} [isRemoteRemoved] FolderDiff isRemoteRemoved
         * @property {file.ITimeStampsDiff|null} [ctime] FolderDiff ctime
         * @property {file.ITimeStampsDiff|null} [mtime] FolderDiff mtime
         * @property {Array.<file.IXAttrDiff>|null} [xattrs] FolderDiff xattrs
         * @property {fs.FolderDiff.IItemsByBranches|null} [removed] FolderDiff removed
         * @property {Array.<fs.FolderDiff.IRenamed>|null} [renamed] FolderDiff renamed
         * @property {fs.FolderDiff.IItemsByBranches|null} [added] FolderDiff added
         * @property {Array.<fs.FolderDiff.IRekeyed>|null} [rekeyed] FolderDiff rekeyed
         * @property {Array.<string>|null} [nameOverlaps] FolderDiff nameOverlaps
         */

        /**
         * Constructs a new FolderDiff.
         * @memberof fs
         * @classdesc Represents a FolderDiff.
         * @implements IFolderDiff
         * @constructor
         * @param {fs.IFolderDiff=} [properties] Properties to set
         */
        function FolderDiff(properties) {
            this.xattrs = [];
            this.renamed = [];
            this.rekeyed = [];
            this.nameOverlaps = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FolderDiff currentVersion.
         * @member {number|Long} currentVersion
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.currentVersion = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * FolderDiff isCurrentLocal.
         * @member {boolean} isCurrentLocal
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.isCurrentLocal = false;

        /**
         * FolderDiff remoteVersion.
         * @member {common.IUInt64Value|null|undefined} remoteVersion
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.remoteVersion = null;

        /**
         * FolderDiff syncedVersion.
         * @member {common.IUInt64Value|null|undefined} syncedVersion
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.syncedVersion = null;

        /**
         * FolderDiff isRemoteRemoved.
         * @member {boolean} isRemoteRemoved
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.isRemoteRemoved = false;

        /**
         * FolderDiff ctime.
         * @member {file.ITimeStampsDiff|null|undefined} ctime
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.ctime = null;

        /**
         * FolderDiff mtime.
         * @member {file.ITimeStampsDiff|null|undefined} mtime
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.mtime = null;

        /**
         * FolderDiff xattrs.
         * @member {Array.<file.IXAttrDiff>} xattrs
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.xattrs = $util.emptyArray;

        /**
         * FolderDiff removed.
         * @member {fs.FolderDiff.IItemsByBranches|null|undefined} removed
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.removed = null;

        /**
         * FolderDiff renamed.
         * @member {Array.<fs.FolderDiff.IRenamed>} renamed
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.renamed = $util.emptyArray;

        /**
         * FolderDiff added.
         * @member {fs.FolderDiff.IItemsByBranches|null|undefined} added
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.added = null;

        /**
         * FolderDiff rekeyed.
         * @member {Array.<fs.FolderDiff.IRekeyed>} rekeyed
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.rekeyed = $util.emptyArray;

        /**
         * FolderDiff nameOverlaps.
         * @member {Array.<string>} nameOverlaps
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.nameOverlaps = $util.emptyArray;

        /**
         * Creates a new FolderDiff instance using the specified properties.
         * @function create
         * @memberof fs.FolderDiff
         * @static
         * @param {fs.IFolderDiff=} [properties] Properties to set
         * @returns {fs.FolderDiff} FolderDiff instance
         */
        FolderDiff.create = function create(properties) {
            return new FolderDiff(properties);
        };

        /**
         * Encodes the specified FolderDiff message. Does not implicitly {@link fs.FolderDiff.verify|verify} messages.
         * @function encode
         * @memberof fs.FolderDiff
         * @static
         * @param {fs.IFolderDiff} message FolderDiff message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FolderDiff.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.currentVersion);
            if (message.isCurrentLocal != null && Object.hasOwnProperty.call(message, "isCurrentLocal"))
                writer.uint32(/* id 2, wireType 0 =*/16).bool(message.isCurrentLocal);
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.syncedVersion != null && Object.hasOwnProperty.call(message, "syncedVersion"))
                $root.common.UInt64Value.encode(message.syncedVersion, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            if (message.isRemoteRemoved != null && Object.hasOwnProperty.call(message, "isRemoteRemoved"))
                writer.uint32(/* id 5, wireType 0 =*/40).bool(message.isRemoteRemoved);
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime"))
                $root.file.TimeStampsDiff.encode(message.ctime, writer.uint32(/* id 6, wireType 2 =*/50).fork(), q + 1).ldelim();
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime"))
                $root.file.TimeStampsDiff.encode(message.mtime, writer.uint32(/* id 7, wireType 2 =*/58).fork(), q + 1).ldelim();
            if (message.xattrs != null && message.xattrs.length)
                for (var i = 0; i < message.xattrs.length; ++i)
                    $root.file.XAttrDiff.encode(message.xattrs[i], writer.uint32(/* id 8, wireType 2 =*/66).fork(), q + 1).ldelim();
            if (message.removed != null && Object.hasOwnProperty.call(message, "removed"))
                $root.fs.FolderDiff.ItemsByBranches.encode(message.removed, writer.uint32(/* id 11, wireType 2 =*/90).fork(), q + 1).ldelim();
            if (message.renamed != null && message.renamed.length)
                for (var i = 0; i < message.renamed.length; ++i)
                    $root.fs.FolderDiff.Renamed.encode(message.renamed[i], writer.uint32(/* id 12, wireType 2 =*/98).fork(), q + 1).ldelim();
            if (message.added != null && Object.hasOwnProperty.call(message, "added"))
                $root.fs.FolderDiff.ItemsByBranches.encode(message.added, writer.uint32(/* id 13, wireType 2 =*/106).fork(), q + 1).ldelim();
            if (message.rekeyed != null && message.rekeyed.length)
                for (var i = 0; i < message.rekeyed.length; ++i)
                    $root.fs.FolderDiff.Rekeyed.encode(message.rekeyed[i], writer.uint32(/* id 14, wireType 2 =*/114).fork(), q + 1).ldelim();
            if (message.nameOverlaps != null && message.nameOverlaps.length)
                for (var i = 0; i < message.nameOverlaps.length; ++i)
                    writer.uint32(/* id 15, wireType 2 =*/122).string(message.nameOverlaps[i]);
            return writer;
        };

        /**
         * Encodes the specified FolderDiff message, length delimited. Does not implicitly {@link fs.FolderDiff.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FolderDiff
         * @static
         * @param {fs.IFolderDiff} message FolderDiff message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FolderDiff.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FolderDiff message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FolderDiff
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FolderDiff} FolderDiff
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FolderDiff.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FolderDiff();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.currentVersion = reader.uint64();
                        break;
                    }
                case 2: {
                        message.isCurrentLocal = reader.bool();
                        break;
                    }
                case 3: {
                        message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.syncedVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 5: {
                        message.isRemoteRemoved = reader.bool();
                        break;
                    }
                case 6: {
                        message.ctime = $root.file.TimeStampsDiff.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 7: {
                        message.mtime = $root.file.TimeStampsDiff.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 8: {
                        if (!(message.xattrs && message.xattrs.length))
                            message.xattrs = [];
                        message.xattrs.push($root.file.XAttrDiff.decode(reader, reader.uint32(), undefined, long + 1));
                        break;
                    }
                case 11: {
                        message.removed = $root.fs.FolderDiff.ItemsByBranches.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 12: {
                        if (!(message.renamed && message.renamed.length))
                            message.renamed = [];
                        message.renamed.push($root.fs.FolderDiff.Renamed.decode(reader, reader.uint32(), undefined, long + 1));
                        break;
                    }
                case 13: {
                        message.added = $root.fs.FolderDiff.ItemsByBranches.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 14: {
                        if (!(message.rekeyed && message.rekeyed.length))
                            message.rekeyed = [];
                        message.rekeyed.push($root.fs.FolderDiff.Rekeyed.decode(reader, reader.uint32(), undefined, long + 1));
                        break;
                    }
                case 15: {
                        if (!(message.nameOverlaps && message.nameOverlaps.length))
                            message.nameOverlaps = [];
                        message.nameOverlaps.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FolderDiff message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FolderDiff
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FolderDiff} FolderDiff
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FolderDiff.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FolderDiff message.
         * @function verify
         * @memberof fs.FolderDiff
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FolderDiff.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                if (!$util.isInteger(message.currentVersion) && !(message.currentVersion && $util.isInteger(message.currentVersion.low) && $util.isInteger(message.currentVersion.high)))
                    return "currentVersion: integer|Long expected";
            if (message.isCurrentLocal != null && Object.hasOwnProperty.call(message, "isCurrentLocal"))
                if (typeof message.isCurrentLocal !== "boolean")
                    return "isCurrentLocal: boolean expected";
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion, long + 1);
                if (error)
                    return "remoteVersion." + error;
            }
            if (message.syncedVersion != null && Object.hasOwnProperty.call(message, "syncedVersion")) {
                var error = $root.common.UInt64Value.verify(message.syncedVersion, long + 1);
                if (error)
                    return "syncedVersion." + error;
            }
            if (message.isRemoteRemoved != null && Object.hasOwnProperty.call(message, "isRemoteRemoved"))
                if (typeof message.isRemoteRemoved !== "boolean")
                    return "isRemoteRemoved: boolean expected";
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime")) {
                var error = $root.file.TimeStampsDiff.verify(message.ctime, long + 1);
                if (error)
                    return "ctime." + error;
            }
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime")) {
                var error = $root.file.TimeStampsDiff.verify(message.mtime, long + 1);
                if (error)
                    return "mtime." + error;
            }
            if (message.xattrs != null && Object.hasOwnProperty.call(message, "xattrs")) {
                if (!Array.isArray(message.xattrs))
                    return "xattrs: array expected";
                for (var i = 0; i < message.xattrs.length; ++i) {
                    var error = $root.file.XAttrDiff.verify(message.xattrs[i], long + 1);
                    if (error)
                        return "xattrs." + error;
                }
            }
            if (message.removed != null && Object.hasOwnProperty.call(message, "removed")) {
                var error = $root.fs.FolderDiff.ItemsByBranches.verify(message.removed, long + 1);
                if (error)
                    return "removed." + error;
            }
            if (message.renamed != null && Object.hasOwnProperty.call(message, "renamed")) {
                if (!Array.isArray(message.renamed))
                    return "renamed: array expected";
                for (var i = 0; i < message.renamed.length; ++i) {
                    var error = $root.fs.FolderDiff.Renamed.verify(message.renamed[i], long + 1);
                    if (error)
                        return "renamed." + error;
                }
            }
            if (message.added != null && Object.hasOwnProperty.call(message, "added")) {
                var error = $root.fs.FolderDiff.ItemsByBranches.verify(message.added, long + 1);
                if (error)
                    return "added." + error;
            }
            if (message.rekeyed != null && Object.hasOwnProperty.call(message, "rekeyed")) {
                if (!Array.isArray(message.rekeyed))
                    return "rekeyed: array expected";
                for (var i = 0; i < message.rekeyed.length; ++i) {
                    var error = $root.fs.FolderDiff.Rekeyed.verify(message.rekeyed[i], long + 1);
                    if (error)
                        return "rekeyed." + error;
                }
            }
            if (message.nameOverlaps != null && Object.hasOwnProperty.call(message, "nameOverlaps")) {
                if (!Array.isArray(message.nameOverlaps))
                    return "nameOverlaps: array expected";
                for (var i = 0; i < message.nameOverlaps.length; ++i)
                    if (!$util.isString(message.nameOverlaps[i]))
                        return "nameOverlaps: string[] expected";
            }
            return null;
        };

        /**
         * Creates a FolderDiff message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FolderDiff
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FolderDiff} FolderDiff
         */
        FolderDiff.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FolderDiff)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FolderDiff: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FolderDiff();
            if (object.currentVersion != null)
                if ($util.Long)
                    message.currentVersion = $util.Long.fromValue(object.currentVersion, true);
                else if (typeof object.currentVersion === "string")
                    message.currentVersion = parseInt(object.currentVersion, 10);
                else if (typeof object.currentVersion === "number")
                    message.currentVersion = object.currentVersion;
                else if (typeof object.currentVersion === "object")
                    message.currentVersion = new $util.LongBits(object.currentVersion.low >>> 0, object.currentVersion.high >>> 0).toNumber(true);
            if (object.isCurrentLocal != null)
                message.isCurrentLocal = Boolean(object.isCurrentLocal);
            if (object.remoteVersion != null) {
                if (!$util.isObject(object.remoteVersion))
                    throw TypeError(".fs.FolderDiff.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion, long + 1);
            }
            if (object.syncedVersion != null) {
                if (!$util.isObject(object.syncedVersion))
                    throw TypeError(".fs.FolderDiff.syncedVersion: object expected");
                message.syncedVersion = $root.common.UInt64Value.fromObject(object.syncedVersion, long + 1);
            }
            if (object.isRemoteRemoved != null)
                message.isRemoteRemoved = Boolean(object.isRemoteRemoved);
            if (object.ctime != null) {
                if (!$util.isObject(object.ctime))
                    throw TypeError(".fs.FolderDiff.ctime: object expected");
                message.ctime = $root.file.TimeStampsDiff.fromObject(object.ctime, long + 1);
            }
            if (object.mtime != null) {
                if (!$util.isObject(object.mtime))
                    throw TypeError(".fs.FolderDiff.mtime: object expected");
                message.mtime = $root.file.TimeStampsDiff.fromObject(object.mtime, long + 1);
            }
            if (object.xattrs) {
                if (!Array.isArray(object.xattrs))
                    throw TypeError(".fs.FolderDiff.xattrs: array expected");
                message.xattrs = [];
                for (var i = 0; i < object.xattrs.length; ++i) {
                    if (!$util.isObject(object.xattrs[i]))
                        throw TypeError(".fs.FolderDiff.xattrs: object expected");
                    message.xattrs[i] = $root.file.XAttrDiff.fromObject(object.xattrs[i], long + 1);
                }
            }
            if (object.removed != null) {
                if (!$util.isObject(object.removed))
                    throw TypeError(".fs.FolderDiff.removed: object expected");
                message.removed = $root.fs.FolderDiff.ItemsByBranches.fromObject(object.removed, long + 1);
            }
            if (object.renamed) {
                if (!Array.isArray(object.renamed))
                    throw TypeError(".fs.FolderDiff.renamed: array expected");
                message.renamed = [];
                for (var i = 0; i < object.renamed.length; ++i) {
                    if (!$util.isObject(object.renamed[i]))
                        throw TypeError(".fs.FolderDiff.renamed: object expected");
                    message.renamed[i] = $root.fs.FolderDiff.Renamed.fromObject(object.renamed[i], long + 1);
                }
            }
            if (object.added != null) {
                if (!$util.isObject(object.added))
                    throw TypeError(".fs.FolderDiff.added: object expected");
                message.added = $root.fs.FolderDiff.ItemsByBranches.fromObject(object.added, long + 1);
            }
            if (object.rekeyed) {
                if (!Array.isArray(object.rekeyed))
                    throw TypeError(".fs.FolderDiff.rekeyed: array expected");
                message.rekeyed = [];
                for (var i = 0; i < object.rekeyed.length; ++i) {
                    if (!$util.isObject(object.rekeyed[i]))
                        throw TypeError(".fs.FolderDiff.rekeyed: object expected");
                    message.rekeyed[i] = $root.fs.FolderDiff.Rekeyed.fromObject(object.rekeyed[i], long + 1);
                }
            }
            if (object.nameOverlaps) {
                if (!Array.isArray(object.nameOverlaps))
                    throw TypeError(".fs.FolderDiff.nameOverlaps: array expected");
                message.nameOverlaps = [];
                for (var i = 0; i < object.nameOverlaps.length; ++i)
                    message.nameOverlaps[i] = String(object.nameOverlaps[i]);
            }
            return message;
        };

        /**
         * Creates a plain object from a FolderDiff message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FolderDiff
         * @static
         * @param {fs.FolderDiff} message FolderDiff
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FolderDiff.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults) {
                object.xattrs = [];
                object.renamed = [];
                object.rekeyed = [];
                object.nameOverlaps = [];
            }
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.currentVersion = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.currentVersion = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.isCurrentLocal = false;
                object.remoteVersion = null;
                object.syncedVersion = null;
                object.isRemoteRemoved = false;
                object.ctime = null;
                object.mtime = null;
                object.removed = null;
                object.added = null;
            }
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.currentVersion = typeof message.currentVersion === "number" ? BigInt(message.currentVersion) : $util.Long.fromBits(message.currentVersion.low >>> 0, message.currentVersion.high >>> 0, true).toBigInt();
                else if (typeof message.currentVersion === "number")
                    object.currentVersion = options.longs === String ? String(message.currentVersion) : message.currentVersion;
                else
                    object.currentVersion = options.longs === String ? $util.Long.prototype.toString.call(message.currentVersion) : options.longs === Number ? new $util.LongBits(message.currentVersion.low >>> 0, message.currentVersion.high >>> 0).toNumber(true) : message.currentVersion;
            if (message.isCurrentLocal != null && Object.hasOwnProperty.call(message, "isCurrentLocal"))
                object.isCurrentLocal = message.isCurrentLocal;
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options, q + 1);
            if (message.syncedVersion != null && Object.hasOwnProperty.call(message, "syncedVersion"))
                object.syncedVersion = $root.common.UInt64Value.toObject(message.syncedVersion, options, q + 1);
            if (message.isRemoteRemoved != null && Object.hasOwnProperty.call(message, "isRemoteRemoved"))
                object.isRemoteRemoved = message.isRemoteRemoved;
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime"))
                object.ctime = $root.file.TimeStampsDiff.toObject(message.ctime, options, q + 1);
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime"))
                object.mtime = $root.file.TimeStampsDiff.toObject(message.mtime, options, q + 1);
            if (message.xattrs && message.xattrs.length) {
                object.xattrs = [];
                for (var j = 0; j < message.xattrs.length; ++j)
                    object.xattrs[j] = $root.file.XAttrDiff.toObject(message.xattrs[j], options, q + 1);
            }
            if (message.removed != null && Object.hasOwnProperty.call(message, "removed"))
                object.removed = $root.fs.FolderDiff.ItemsByBranches.toObject(message.removed, options, q + 1);
            if (message.renamed && message.renamed.length) {
                object.renamed = [];
                for (var j = 0; j < message.renamed.length; ++j)
                    object.renamed[j] = $root.fs.FolderDiff.Renamed.toObject(message.renamed[j], options, q + 1);
            }
            if (message.added != null && Object.hasOwnProperty.call(message, "added"))
                object.added = $root.fs.FolderDiff.ItemsByBranches.toObject(message.added, options, q + 1);
            if (message.rekeyed && message.rekeyed.length) {
                object.rekeyed = [];
                for (var j = 0; j < message.rekeyed.length; ++j)
                    object.rekeyed[j] = $root.fs.FolderDiff.Rekeyed.toObject(message.rekeyed[j], options, q + 1);
            }
            if (message.nameOverlaps && message.nameOverlaps.length) {
                object.nameOverlaps = [];
                for (var j = 0; j < message.nameOverlaps.length; ++j)
                    object.nameOverlaps[j] = message.nameOverlaps[j];
            }
            return object;
        };

        /**
         * Converts this FolderDiff to JSON.
         * @function toJSON
         * @memberof fs.FolderDiff
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FolderDiff.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FolderDiff
         * @function getTypeUrl
         * @memberof fs.FolderDiff
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FolderDiff.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FolderDiff";
        };

        FolderDiff.ItemsByBranches = (function() {

            /**
             * Properties of an ItemsByBranches.
             * @memberof fs.FolderDiff
             * @interface IItemsByBranches
             * @property {Array.<string>|null} [inLocal] ItemsByBranches inLocal
             * @property {Array.<string>|null} [inRemote] ItemsByBranches inRemote
             */

            /**
             * Constructs a new ItemsByBranches.
             * @memberof fs.FolderDiff
             * @classdesc Represents an ItemsByBranches.
             * @implements IItemsByBranches
             * @constructor
             * @param {fs.FolderDiff.IItemsByBranches=} [properties] Properties to set
             */
            function ItemsByBranches(properties) {
                this.inLocal = [];
                this.inRemote = [];
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * ItemsByBranches inLocal.
             * @member {Array.<string>} inLocal
             * @memberof fs.FolderDiff.ItemsByBranches
             * @instance
             */
            ItemsByBranches.prototype.inLocal = $util.emptyArray;

            /**
             * ItemsByBranches inRemote.
             * @member {Array.<string>} inRemote
             * @memberof fs.FolderDiff.ItemsByBranches
             * @instance
             */
            ItemsByBranches.prototype.inRemote = $util.emptyArray;

            /**
             * Creates a new ItemsByBranches instance using the specified properties.
             * @function create
             * @memberof fs.FolderDiff.ItemsByBranches
             * @static
             * @param {fs.FolderDiff.IItemsByBranches=} [properties] Properties to set
             * @returns {fs.FolderDiff.ItemsByBranches} ItemsByBranches instance
             */
            ItemsByBranches.create = function create(properties) {
                return new ItemsByBranches(properties);
            };

            /**
             * Encodes the specified ItemsByBranches message. Does not implicitly {@link fs.FolderDiff.ItemsByBranches.verify|verify} messages.
             * @function encode
             * @memberof fs.FolderDiff.ItemsByBranches
             * @static
             * @param {fs.FolderDiff.IItemsByBranches} message ItemsByBranches message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            ItemsByBranches.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.inLocal != null && message.inLocal.length)
                    for (var i = 0; i < message.inLocal.length; ++i)
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.inLocal[i]);
                if (message.inRemote != null && message.inRemote.length)
                    for (var i = 0; i < message.inRemote.length; ++i)
                        writer.uint32(/* id 2, wireType 2 =*/18).string(message.inRemote[i]);
                return writer;
            };

            /**
             * Encodes the specified ItemsByBranches message, length delimited. Does not implicitly {@link fs.FolderDiff.ItemsByBranches.verify|verify} messages.
             * @function encodeDelimited
             * @memberof fs.FolderDiff.ItemsByBranches
             * @static
             * @param {fs.FolderDiff.IItemsByBranches} message ItemsByBranches message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            ItemsByBranches.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes an ItemsByBranches message from the specified reader or buffer.
             * @function decode
             * @memberof fs.FolderDiff.ItemsByBranches
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {fs.FolderDiff.ItemsByBranches} ItemsByBranches
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            ItemsByBranches.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FolderDiff.ItemsByBranches();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            if (!(message.inLocal && message.inLocal.length))
                                message.inLocal = [];
                            message.inLocal.push(reader.string());
                            break;
                        }
                    case 2: {
                            if (!(message.inRemote && message.inRemote.length))
                                message.inRemote = [];
                            message.inRemote.push(reader.string());
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes an ItemsByBranches message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof fs.FolderDiff.ItemsByBranches
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {fs.FolderDiff.ItemsByBranches} ItemsByBranches
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            ItemsByBranches.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies an ItemsByBranches message.
             * @function verify
             * @memberof fs.FolderDiff.ItemsByBranches
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            ItemsByBranches.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.inLocal != null && Object.hasOwnProperty.call(message, "inLocal")) {
                    if (!Array.isArray(message.inLocal))
                        return "inLocal: array expected";
                    for (var i = 0; i < message.inLocal.length; ++i)
                        if (!$util.isString(message.inLocal[i]))
                            return "inLocal: string[] expected";
                }
                if (message.inRemote != null && Object.hasOwnProperty.call(message, "inRemote")) {
                    if (!Array.isArray(message.inRemote))
                        return "inRemote: array expected";
                    for (var i = 0; i < message.inRemote.length; ++i)
                        if (!$util.isString(message.inRemote[i]))
                            return "inRemote: string[] expected";
                }
                return null;
            };

            /**
             * Creates an ItemsByBranches message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof fs.FolderDiff.ItemsByBranches
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {fs.FolderDiff.ItemsByBranches} ItemsByBranches
             */
            ItemsByBranches.fromObject = function fromObject(object, long) {
                if (object instanceof $root.fs.FolderDiff.ItemsByBranches)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".fs.FolderDiff.ItemsByBranches: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.fs.FolderDiff.ItemsByBranches();
                if (object.inLocal) {
                    if (!Array.isArray(object.inLocal))
                        throw TypeError(".fs.FolderDiff.ItemsByBranches.inLocal: array expected");
                    message.inLocal = [];
                    for (var i = 0; i < object.inLocal.length; ++i)
                        message.inLocal[i] = String(object.inLocal[i]);
                }
                if (object.inRemote) {
                    if (!Array.isArray(object.inRemote))
                        throw TypeError(".fs.FolderDiff.ItemsByBranches.inRemote: array expected");
                    message.inRemote = [];
                    for (var i = 0; i < object.inRemote.length; ++i)
                        message.inRemote[i] = String(object.inRemote[i]);
                }
                return message;
            };

            /**
             * Creates a plain object from an ItemsByBranches message. Also converts values to other types if specified.
             * @function toObject
             * @memberof fs.FolderDiff.ItemsByBranches
             * @static
             * @param {fs.FolderDiff.ItemsByBranches} message ItemsByBranches
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            ItemsByBranches.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.arrays || options.defaults) {
                    object.inLocal = [];
                    object.inRemote = [];
                }
                if (message.inLocal && message.inLocal.length) {
                    object.inLocal = [];
                    for (var j = 0; j < message.inLocal.length; ++j)
                        object.inLocal[j] = message.inLocal[j];
                }
                if (message.inRemote && message.inRemote.length) {
                    object.inRemote = [];
                    for (var j = 0; j < message.inRemote.length; ++j)
                        object.inRemote[j] = message.inRemote[j];
                }
                return object;
            };

            /**
             * Converts this ItemsByBranches to JSON.
             * @function toJSON
             * @memberof fs.FolderDiff.ItemsByBranches
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            ItemsByBranches.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for ItemsByBranches
             * @function getTypeUrl
             * @memberof fs.FolderDiff.ItemsByBranches
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            ItemsByBranches.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/fs.FolderDiff.ItemsByBranches";
            };

            return ItemsByBranches;
        })();

        FolderDiff.Renamed = (function() {

            /**
             * Properties of a Renamed.
             * @memberof fs.FolderDiff
             * @interface IRenamed
             * @property {string|null} [local] Renamed local
             * @property {string|null} [remote] Renamed remote
             * @property {string|null} [renamedIn] Renamed renamedIn
             */

            /**
             * Constructs a new Renamed.
             * @memberof fs.FolderDiff
             * @classdesc Represents a Renamed.
             * @implements IRenamed
             * @constructor
             * @param {fs.FolderDiff.IRenamed=} [properties] Properties to set
             */
            function Renamed(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * Renamed local.
             * @member {string} local
             * @memberof fs.FolderDiff.Renamed
             * @instance
             */
            Renamed.prototype.local = "";

            /**
             * Renamed remote.
             * @member {string} remote
             * @memberof fs.FolderDiff.Renamed
             * @instance
             */
            Renamed.prototype.remote = "";

            /**
             * Renamed renamedIn.
             * @member {string} renamedIn
             * @memberof fs.FolderDiff.Renamed
             * @instance
             */
            Renamed.prototype.renamedIn = "";

            /**
             * Creates a new Renamed instance using the specified properties.
             * @function create
             * @memberof fs.FolderDiff.Renamed
             * @static
             * @param {fs.FolderDiff.IRenamed=} [properties] Properties to set
             * @returns {fs.FolderDiff.Renamed} Renamed instance
             */
            Renamed.create = function create(properties) {
                return new Renamed(properties);
            };

            /**
             * Encodes the specified Renamed message. Does not implicitly {@link fs.FolderDiff.Renamed.verify|verify} messages.
             * @function encode
             * @memberof fs.FolderDiff.Renamed
             * @static
             * @param {fs.FolderDiff.IRenamed} message Renamed message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Renamed.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.local != null && Object.hasOwnProperty.call(message, "local"))
                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.local);
                if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.remote);
                if (message.renamedIn != null && Object.hasOwnProperty.call(message, "renamedIn"))
                    writer.uint32(/* id 3, wireType 2 =*/26).string(message.renamedIn);
                return writer;
            };

            /**
             * Encodes the specified Renamed message, length delimited. Does not implicitly {@link fs.FolderDiff.Renamed.verify|verify} messages.
             * @function encodeDelimited
             * @memberof fs.FolderDiff.Renamed
             * @static
             * @param {fs.FolderDiff.IRenamed} message Renamed message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Renamed.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes a Renamed message from the specified reader or buffer.
             * @function decode
             * @memberof fs.FolderDiff.Renamed
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {fs.FolderDiff.Renamed} Renamed
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Renamed.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FolderDiff.Renamed();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.local = reader.string();
                            break;
                        }
                    case 2: {
                            message.remote = reader.string();
                            break;
                        }
                    case 3: {
                            message.renamedIn = reader.string();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a Renamed message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof fs.FolderDiff.Renamed
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {fs.FolderDiff.Renamed} Renamed
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Renamed.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a Renamed message.
             * @function verify
             * @memberof fs.FolderDiff.Renamed
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            Renamed.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.local != null && Object.hasOwnProperty.call(message, "local"))
                    if (!$util.isString(message.local))
                        return "local: string expected";
                if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                    if (!$util.isString(message.remote))
                        return "remote: string expected";
                if (message.renamedIn != null && Object.hasOwnProperty.call(message, "renamedIn"))
                    if (!$util.isString(message.renamedIn))
                        return "renamedIn: string expected";
                return null;
            };

            /**
             * Creates a Renamed message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof fs.FolderDiff.Renamed
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {fs.FolderDiff.Renamed} Renamed
             */
            Renamed.fromObject = function fromObject(object, long) {
                if (object instanceof $root.fs.FolderDiff.Renamed)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".fs.FolderDiff.Renamed: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.fs.FolderDiff.Renamed();
                if (object.local != null)
                    message.local = String(object.local);
                if (object.remote != null)
                    message.remote = String(object.remote);
                if (object.renamedIn != null)
                    message.renamedIn = String(object.renamedIn);
                return message;
            };

            /**
             * Creates a plain object from a Renamed message. Also converts values to other types if specified.
             * @function toObject
             * @memberof fs.FolderDiff.Renamed
             * @static
             * @param {fs.FolderDiff.Renamed} message Renamed
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            Renamed.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults) {
                    object.local = "";
                    object.remote = "";
                    object.renamedIn = "";
                }
                if (message.local != null && Object.hasOwnProperty.call(message, "local"))
                    object.local = message.local;
                if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                    object.remote = message.remote;
                if (message.renamedIn != null && Object.hasOwnProperty.call(message, "renamedIn"))
                    object.renamedIn = message.renamedIn;
                return object;
            };

            /**
             * Converts this Renamed to JSON.
             * @function toJSON
             * @memberof fs.FolderDiff.Renamed
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            Renamed.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for Renamed
             * @function getTypeUrl
             * @memberof fs.FolderDiff.Renamed
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            Renamed.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/fs.FolderDiff.Renamed";
            };

            return Renamed;
        })();

        FolderDiff.Rekeyed = (function() {

            /**
             * Properties of a Rekeyed.
             * @memberof fs.FolderDiff
             * @interface IRekeyed
             * @property {string|null} [local] Rekeyed local
             * @property {string|null} [remote] Rekeyed remote
             * @property {string|null} [rekeyedIn] Rekeyed rekeyedIn
             */

            /**
             * Constructs a new Rekeyed.
             * @memberof fs.FolderDiff
             * @classdesc Represents a Rekeyed.
             * @implements IRekeyed
             * @constructor
             * @param {fs.FolderDiff.IRekeyed=} [properties] Properties to set
             */
            function Rekeyed(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * Rekeyed local.
             * @member {string} local
             * @memberof fs.FolderDiff.Rekeyed
             * @instance
             */
            Rekeyed.prototype.local = "";

            /**
             * Rekeyed remote.
             * @member {string} remote
             * @memberof fs.FolderDiff.Rekeyed
             * @instance
             */
            Rekeyed.prototype.remote = "";

            /**
             * Rekeyed rekeyedIn.
             * @member {string} rekeyedIn
             * @memberof fs.FolderDiff.Rekeyed
             * @instance
             */
            Rekeyed.prototype.rekeyedIn = "";

            /**
             * Creates a new Rekeyed instance using the specified properties.
             * @function create
             * @memberof fs.FolderDiff.Rekeyed
             * @static
             * @param {fs.FolderDiff.IRekeyed=} [properties] Properties to set
             * @returns {fs.FolderDiff.Rekeyed} Rekeyed instance
             */
            Rekeyed.create = function create(properties) {
                return new Rekeyed(properties);
            };

            /**
             * Encodes the specified Rekeyed message. Does not implicitly {@link fs.FolderDiff.Rekeyed.verify|verify} messages.
             * @function encode
             * @memberof fs.FolderDiff.Rekeyed
             * @static
             * @param {fs.FolderDiff.IRekeyed} message Rekeyed message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Rekeyed.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.local != null && Object.hasOwnProperty.call(message, "local"))
                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.local);
                if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.remote);
                if (message.rekeyedIn != null && Object.hasOwnProperty.call(message, "rekeyedIn"))
                    writer.uint32(/* id 3, wireType 2 =*/26).string(message.rekeyedIn);
                return writer;
            };

            /**
             * Encodes the specified Rekeyed message, length delimited. Does not implicitly {@link fs.FolderDiff.Rekeyed.verify|verify} messages.
             * @function encodeDelimited
             * @memberof fs.FolderDiff.Rekeyed
             * @static
             * @param {fs.FolderDiff.IRekeyed} message Rekeyed message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Rekeyed.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes a Rekeyed message from the specified reader or buffer.
             * @function decode
             * @memberof fs.FolderDiff.Rekeyed
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {fs.FolderDiff.Rekeyed} Rekeyed
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Rekeyed.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FolderDiff.Rekeyed();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.local = reader.string();
                            break;
                        }
                    case 2: {
                            message.remote = reader.string();
                            break;
                        }
                    case 3: {
                            message.rekeyedIn = reader.string();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a Rekeyed message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof fs.FolderDiff.Rekeyed
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {fs.FolderDiff.Rekeyed} Rekeyed
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Rekeyed.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a Rekeyed message.
             * @function verify
             * @memberof fs.FolderDiff.Rekeyed
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            Rekeyed.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.local != null && Object.hasOwnProperty.call(message, "local"))
                    if (!$util.isString(message.local))
                        return "local: string expected";
                if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                    if (!$util.isString(message.remote))
                        return "remote: string expected";
                if (message.rekeyedIn != null && Object.hasOwnProperty.call(message, "rekeyedIn"))
                    if (!$util.isString(message.rekeyedIn))
                        return "rekeyedIn: string expected";
                return null;
            };

            /**
             * Creates a Rekeyed message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof fs.FolderDiff.Rekeyed
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {fs.FolderDiff.Rekeyed} Rekeyed
             */
            Rekeyed.fromObject = function fromObject(object, long) {
                if (object instanceof $root.fs.FolderDiff.Rekeyed)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".fs.FolderDiff.Rekeyed: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.fs.FolderDiff.Rekeyed();
                if (object.local != null)
                    message.local = String(object.local);
                if (object.remote != null)
                    message.remote = String(object.remote);
                if (object.rekeyedIn != null)
                    message.rekeyedIn = String(object.rekeyedIn);
                return message;
            };

            /**
             * Creates a plain object from a Rekeyed message. Also converts values to other types if specified.
             * @function toObject
             * @memberof fs.FolderDiff.Rekeyed
             * @static
             * @param {fs.FolderDiff.Rekeyed} message Rekeyed
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            Rekeyed.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults) {
                    object.local = "";
                    object.remote = "";
                    object.rekeyedIn = "";
                }
                if (message.local != null && Object.hasOwnProperty.call(message, "local"))
                    object.local = message.local;
                if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                    object.remote = message.remote;
                if (message.rekeyedIn != null && Object.hasOwnProperty.call(message, "rekeyedIn"))
                    object.rekeyedIn = message.rekeyedIn;
                return object;
            };

            /**
             * Converts this Rekeyed to JSON.
             * @function toJSON
             * @memberof fs.FolderDiff.Rekeyed
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            Rekeyed.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for Rekeyed
             * @function getTypeUrl
             * @memberof fs.FolderDiff.Rekeyed
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            Rekeyed.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/fs.FolderDiff.Rekeyed";
            };

            return Rekeyed;
        })();

        return FolderDiff;
    })();

    fs.RemoteChildRequestBody = (function() {

        /**
         * Properties of a RemoteChildRequestBody.
         * @memberof fs
         * @interface IRemoteChildRequestBody
         * @property {string|null} [path] RemoteChildRequestBody path
         * @property {string|null} [remoteItemName] RemoteChildRequestBody remoteItemName
         * @property {common.IUInt64Value|null} [remoteVersion] RemoteChildRequestBody remoteVersion
         */

        /**
         * Constructs a new RemoteChildRequestBody.
         * @memberof fs
         * @classdesc Represents a RemoteChildRequestBody.
         * @implements IRemoteChildRequestBody
         * @constructor
         * @param {fs.IRemoteChildRequestBody=} [properties] Properties to set
         */
        function RemoteChildRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * RemoteChildRequestBody path.
         * @member {string} path
         * @memberof fs.RemoteChildRequestBody
         * @instance
         */
        RemoteChildRequestBody.prototype.path = "";

        /**
         * RemoteChildRequestBody remoteItemName.
         * @member {string} remoteItemName
         * @memberof fs.RemoteChildRequestBody
         * @instance
         */
        RemoteChildRequestBody.prototype.remoteItemName = "";

        /**
         * RemoteChildRequestBody remoteVersion.
         * @member {common.IUInt64Value|null|undefined} remoteVersion
         * @memberof fs.RemoteChildRequestBody
         * @instance
         */
        RemoteChildRequestBody.prototype.remoteVersion = null;

        /**
         * Creates a new RemoteChildRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.RemoteChildRequestBody
         * @static
         * @param {fs.IRemoteChildRequestBody=} [properties] Properties to set
         * @returns {fs.RemoteChildRequestBody} RemoteChildRequestBody instance
         */
        RemoteChildRequestBody.create = function create(properties) {
            return new RemoteChildRequestBody(properties);
        };

        /**
         * Encodes the specified RemoteChildRequestBody message. Does not implicitly {@link fs.RemoteChildRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.RemoteChildRequestBody
         * @static
         * @param {fs.IRemoteChildRequestBody} message RemoteChildRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        RemoteChildRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.remoteItemName != null && Object.hasOwnProperty.call(message, "remoteItemName"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.remoteItemName);
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified RemoteChildRequestBody message, length delimited. Does not implicitly {@link fs.RemoteChildRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.RemoteChildRequestBody
         * @static
         * @param {fs.IRemoteChildRequestBody} message RemoteChildRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        RemoteChildRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a RemoteChildRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.RemoteChildRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.RemoteChildRequestBody} RemoteChildRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        RemoteChildRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.RemoteChildRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.remoteItemName = reader.string();
                        break;
                    }
                case 3: {
                        message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a RemoteChildRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.RemoteChildRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.RemoteChildRequestBody} RemoteChildRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        RemoteChildRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a RemoteChildRequestBody message.
         * @function verify
         * @memberof fs.RemoteChildRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        RemoteChildRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.remoteItemName != null && Object.hasOwnProperty.call(message, "remoteItemName"))
                if (!$util.isString(message.remoteItemName))
                    return "remoteItemName: string expected";
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion, long + 1);
                if (error)
                    return "remoteVersion." + error;
            }
            return null;
        };

        /**
         * Creates a RemoteChildRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.RemoteChildRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.RemoteChildRequestBody} RemoteChildRequestBody
         */
        RemoteChildRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.RemoteChildRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.RemoteChildRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.RemoteChildRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.remoteItemName != null)
                message.remoteItemName = String(object.remoteItemName);
            if (object.remoteVersion != null) {
                if (!$util.isObject(object.remoteVersion))
                    throw TypeError(".fs.RemoteChildRequestBody.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a RemoteChildRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.RemoteChildRequestBody
         * @static
         * @param {fs.RemoteChildRequestBody} message RemoteChildRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        RemoteChildRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.remoteItemName = "";
                object.remoteVersion = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.remoteItemName != null && Object.hasOwnProperty.call(message, "remoteItemName"))
                object.remoteItemName = message.remoteItemName;
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options, q + 1);
            return object;
        };

        /**
         * Converts this RemoteChildRequestBody to JSON.
         * @function toJSON
         * @memberof fs.RemoteChildRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        RemoteChildRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for RemoteChildRequestBody
         * @function getTypeUrl
         * @memberof fs.RemoteChildRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        RemoteChildRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.RemoteChildRequestBody";
        };

        return RemoteChildRequestBody;
    })();

    fs.FSSyncUploadRequestBody = (function() {

        /**
         * Properties of a FSSyncUploadRequestBody.
         * @memberof fs
         * @interface IFSSyncUploadRequestBody
         * @property {string|null} [path] FSSyncUploadRequestBody path
         * @property {file.IOptionsToUploadLocal|null} [opts] FSSyncUploadRequestBody opts
         */

        /**
         * Constructs a new FSSyncUploadRequestBody.
         * @memberof fs
         * @classdesc Represents a FSSyncUploadRequestBody.
         * @implements IFSSyncUploadRequestBody
         * @constructor
         * @param {fs.IFSSyncUploadRequestBody=} [properties] Properties to set
         */
        function FSSyncUploadRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FSSyncUploadRequestBody path.
         * @member {string} path
         * @memberof fs.FSSyncUploadRequestBody
         * @instance
         */
        FSSyncUploadRequestBody.prototype.path = "";

        /**
         * FSSyncUploadRequestBody opts.
         * @member {file.IOptionsToUploadLocal|null|undefined} opts
         * @memberof fs.FSSyncUploadRequestBody
         * @instance
         */
        FSSyncUploadRequestBody.prototype.opts = null;

        /**
         * Creates a new FSSyncUploadRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.FSSyncUploadRequestBody
         * @static
         * @param {fs.IFSSyncUploadRequestBody=} [properties] Properties to set
         * @returns {fs.FSSyncUploadRequestBody} FSSyncUploadRequestBody instance
         */
        FSSyncUploadRequestBody.create = function create(properties) {
            return new FSSyncUploadRequestBody(properties);
        };

        /**
         * Encodes the specified FSSyncUploadRequestBody message. Does not implicitly {@link fs.FSSyncUploadRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.FSSyncUploadRequestBody
         * @static
         * @param {fs.IFSSyncUploadRequestBody} message FSSyncUploadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncUploadRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.file.OptionsToUploadLocal.encode(message.opts, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FSSyncUploadRequestBody message, length delimited. Does not implicitly {@link fs.FSSyncUploadRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FSSyncUploadRequestBody
         * @static
         * @param {fs.IFSSyncUploadRequestBody} message FSSyncUploadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncUploadRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FSSyncUploadRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FSSyncUploadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FSSyncUploadRequestBody} FSSyncUploadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSSyncUploadRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSSyncUploadRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.opts = $root.file.OptionsToUploadLocal.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FSSyncUploadRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FSSyncUploadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FSSyncUploadRequestBody} FSSyncUploadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSSyncUploadRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FSSyncUploadRequestBody message.
         * @function verify
         * @memberof fs.FSSyncUploadRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSSyncUploadRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts")) {
                var error = $root.file.OptionsToUploadLocal.verify(message.opts, long + 1);
                if (error)
                    return "opts." + error;
            }
            return null;
        };

        /**
         * Creates a FSSyncUploadRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSSyncUploadRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSSyncUploadRequestBody} FSSyncUploadRequestBody
         */
        FSSyncUploadRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FSSyncUploadRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FSSyncUploadRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FSSyncUploadRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.opts != null) {
                if (!$util.isObject(object.opts))
                    throw TypeError(".fs.FSSyncUploadRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToUploadLocal.fromObject(object.opts, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a FSSyncUploadRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSSyncUploadRequestBody
         * @static
         * @param {fs.FSSyncUploadRequestBody} message FSSyncUploadRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSSyncUploadRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.opts = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                object.opts = $root.file.OptionsToUploadLocal.toObject(message.opts, options, q + 1);
            return object;
        };

        /**
         * Converts this FSSyncUploadRequestBody to JSON.
         * @function toJSON
         * @memberof fs.FSSyncUploadRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FSSyncUploadRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FSSyncUploadRequestBody
         * @function getTypeUrl
         * @memberof fs.FSSyncUploadRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FSSyncUploadRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FSSyncUploadRequestBody";
        };

        return FSSyncUploadRequestBody;
    })();

    fs.AdoptRemoteFolderItemRequestBody = (function() {

        /**
         * Properties of an AdoptRemoteFolderItemRequestBody.
         * @memberof fs
         * @interface IAdoptRemoteFolderItemRequestBody
         * @property {string|null} [path] AdoptRemoteFolderItemRequestBody path
         * @property {string|null} [itemName] AdoptRemoteFolderItemRequestBody itemName
         * @property {fs.AdoptRemoteFolderItemRequestBody.IOptions|null} [opts] AdoptRemoteFolderItemRequestBody opts
         */

        /**
         * Constructs a new AdoptRemoteFolderItemRequestBody.
         * @memberof fs
         * @classdesc Represents an AdoptRemoteFolderItemRequestBody.
         * @implements IAdoptRemoteFolderItemRequestBody
         * @constructor
         * @param {fs.IAdoptRemoteFolderItemRequestBody=} [properties] Properties to set
         */
        function AdoptRemoteFolderItemRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * AdoptRemoteFolderItemRequestBody path.
         * @member {string} path
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @instance
         */
        AdoptRemoteFolderItemRequestBody.prototype.path = "";

        /**
         * AdoptRemoteFolderItemRequestBody itemName.
         * @member {string} itemName
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @instance
         */
        AdoptRemoteFolderItemRequestBody.prototype.itemName = "";

        /**
         * AdoptRemoteFolderItemRequestBody opts.
         * @member {fs.AdoptRemoteFolderItemRequestBody.IOptions|null|undefined} opts
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @instance
         */
        AdoptRemoteFolderItemRequestBody.prototype.opts = null;

        /**
         * Creates a new AdoptRemoteFolderItemRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @static
         * @param {fs.IAdoptRemoteFolderItemRequestBody=} [properties] Properties to set
         * @returns {fs.AdoptRemoteFolderItemRequestBody} AdoptRemoteFolderItemRequestBody instance
         */
        AdoptRemoteFolderItemRequestBody.create = function create(properties) {
            return new AdoptRemoteFolderItemRequestBody(properties);
        };

        /**
         * Encodes the specified AdoptRemoteFolderItemRequestBody message. Does not implicitly {@link fs.AdoptRemoteFolderItemRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @static
         * @param {fs.IAdoptRemoteFolderItemRequestBody} message AdoptRemoteFolderItemRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AdoptRemoteFolderItemRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.itemName != null && Object.hasOwnProperty.call(message, "itemName"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.itemName);
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.fs.AdoptRemoteFolderItemRequestBody.Options.encode(message.opts, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified AdoptRemoteFolderItemRequestBody message, length delimited. Does not implicitly {@link fs.AdoptRemoteFolderItemRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @static
         * @param {fs.IAdoptRemoteFolderItemRequestBody} message AdoptRemoteFolderItemRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AdoptRemoteFolderItemRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an AdoptRemoteFolderItemRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.AdoptRemoteFolderItemRequestBody} AdoptRemoteFolderItemRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AdoptRemoteFolderItemRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.AdoptRemoteFolderItemRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.itemName = reader.string();
                        break;
                    }
                case 3: {
                        message.opts = $root.fs.AdoptRemoteFolderItemRequestBody.Options.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an AdoptRemoteFolderItemRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.AdoptRemoteFolderItemRequestBody} AdoptRemoteFolderItemRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AdoptRemoteFolderItemRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an AdoptRemoteFolderItemRequestBody message.
         * @function verify
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        AdoptRemoteFolderItemRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.itemName != null && Object.hasOwnProperty.call(message, "itemName"))
                if (!$util.isString(message.itemName))
                    return "itemName: string expected";
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts")) {
                var error = $root.fs.AdoptRemoteFolderItemRequestBody.Options.verify(message.opts, long + 1);
                if (error)
                    return "opts." + error;
            }
            return null;
        };

        /**
         * Creates an AdoptRemoteFolderItemRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.AdoptRemoteFolderItemRequestBody} AdoptRemoteFolderItemRequestBody
         */
        AdoptRemoteFolderItemRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.AdoptRemoteFolderItemRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.AdoptRemoteFolderItemRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.AdoptRemoteFolderItemRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.itemName != null)
                message.itemName = String(object.itemName);
            if (object.opts != null) {
                if (!$util.isObject(object.opts))
                    throw TypeError(".fs.AdoptRemoteFolderItemRequestBody.opts: object expected");
                message.opts = $root.fs.AdoptRemoteFolderItemRequestBody.Options.fromObject(object.opts, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an AdoptRemoteFolderItemRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @static
         * @param {fs.AdoptRemoteFolderItemRequestBody} message AdoptRemoteFolderItemRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        AdoptRemoteFolderItemRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.itemName = "";
                object.opts = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.itemName != null && Object.hasOwnProperty.call(message, "itemName"))
                object.itemName = message.itemName;
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                object.opts = $root.fs.AdoptRemoteFolderItemRequestBody.Options.toObject(message.opts, options, q + 1);
            return object;
        };

        /**
         * Converts this AdoptRemoteFolderItemRequestBody to JSON.
         * @function toJSON
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        AdoptRemoteFolderItemRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for AdoptRemoteFolderItemRequestBody
         * @function getTypeUrl
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        AdoptRemoteFolderItemRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.AdoptRemoteFolderItemRequestBody";
        };

        AdoptRemoteFolderItemRequestBody.Options = (function() {

            /**
             * Properties of an Options.
             * @memberof fs.AdoptRemoteFolderItemRequestBody
             * @interface IOptions
             * @property {common.IUInt64Value|null} [localVersion] Options localVersion
             * @property {common.IUInt64Value|null} [uploadVersion] Options uploadVersion
             * @property {common.IBooleanValue|null} [replaceLocalItem] Options replaceLocalItem
             * @property {common.IStringValue|null} [newItemName] Options newItemName
             */

            /**
             * Constructs a new Options.
             * @memberof fs.AdoptRemoteFolderItemRequestBody
             * @classdesc Represents an Options.
             * @implements IOptions
             * @constructor
             * @param {fs.AdoptRemoteFolderItemRequestBody.IOptions=} [properties] Properties to set
             */
            function Options(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * Options localVersion.
             * @member {common.IUInt64Value|null|undefined} localVersion
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @instance
             */
            Options.prototype.localVersion = null;

            /**
             * Options uploadVersion.
             * @member {common.IUInt64Value|null|undefined} uploadVersion
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @instance
             */
            Options.prototype.uploadVersion = null;

            /**
             * Options replaceLocalItem.
             * @member {common.IBooleanValue|null|undefined} replaceLocalItem
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @instance
             */
            Options.prototype.replaceLocalItem = null;

            /**
             * Options newItemName.
             * @member {common.IStringValue|null|undefined} newItemName
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @instance
             */
            Options.prototype.newItemName = null;

            /**
             * Creates a new Options instance using the specified properties.
             * @function create
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @static
             * @param {fs.AdoptRemoteFolderItemRequestBody.IOptions=} [properties] Properties to set
             * @returns {fs.AdoptRemoteFolderItemRequestBody.Options} Options instance
             */
            Options.create = function create(properties) {
                return new Options(properties);
            };

            /**
             * Encodes the specified Options message. Does not implicitly {@link fs.AdoptRemoteFolderItemRequestBody.Options.verify|verify} messages.
             * @function encode
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @static
             * @param {fs.AdoptRemoteFolderItemRequestBody.IOptions} message Options message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Options.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                    $root.common.UInt64Value.encode(message.localVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
                if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                    $root.common.UInt64Value.encode(message.uploadVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
                if (message.replaceLocalItem != null && Object.hasOwnProperty.call(message, "replaceLocalItem"))
                    $root.common.BooleanValue.encode(message.replaceLocalItem, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
                if (message.newItemName != null && Object.hasOwnProperty.call(message, "newItemName"))
                    $root.common.StringValue.encode(message.newItemName, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
                return writer;
            };

            /**
             * Encodes the specified Options message, length delimited. Does not implicitly {@link fs.AdoptRemoteFolderItemRequestBody.Options.verify|verify} messages.
             * @function encodeDelimited
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @static
             * @param {fs.AdoptRemoteFolderItemRequestBody.IOptions} message Options message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Options.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes an Options message from the specified reader or buffer.
             * @function decode
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {fs.AdoptRemoteFolderItemRequestBody.Options} Options
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Options.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.AdoptRemoteFolderItemRequestBody.Options();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.localVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 2: {
                            message.uploadVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 3: {
                            message.replaceLocalItem = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 4: {
                            message.newItemName = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes an Options message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {fs.AdoptRemoteFolderItemRequestBody.Options} Options
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Options.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies an Options message.
             * @function verify
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            Options.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion")) {
                    var error = $root.common.UInt64Value.verify(message.localVersion, long + 1);
                    if (error)
                        return "localVersion." + error;
                }
                if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion")) {
                    var error = $root.common.UInt64Value.verify(message.uploadVersion, long + 1);
                    if (error)
                        return "uploadVersion." + error;
                }
                if (message.replaceLocalItem != null && Object.hasOwnProperty.call(message, "replaceLocalItem")) {
                    var error = $root.common.BooleanValue.verify(message.replaceLocalItem, long + 1);
                    if (error)
                        return "replaceLocalItem." + error;
                }
                if (message.newItemName != null && Object.hasOwnProperty.call(message, "newItemName")) {
                    var error = $root.common.StringValue.verify(message.newItemName, long + 1);
                    if (error)
                        return "newItemName." + error;
                }
                return null;
            };

            /**
             * Creates an Options message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {fs.AdoptRemoteFolderItemRequestBody.Options} Options
             */
            Options.fromObject = function fromObject(object, long) {
                if (object instanceof $root.fs.AdoptRemoteFolderItemRequestBody.Options)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".fs.AdoptRemoteFolderItemRequestBody.Options: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.fs.AdoptRemoteFolderItemRequestBody.Options();
                if (object.localVersion != null) {
                    if (!$util.isObject(object.localVersion))
                        throw TypeError(".fs.AdoptRemoteFolderItemRequestBody.Options.localVersion: object expected");
                    message.localVersion = $root.common.UInt64Value.fromObject(object.localVersion, long + 1);
                }
                if (object.uploadVersion != null) {
                    if (!$util.isObject(object.uploadVersion))
                        throw TypeError(".fs.AdoptRemoteFolderItemRequestBody.Options.uploadVersion: object expected");
                    message.uploadVersion = $root.common.UInt64Value.fromObject(object.uploadVersion, long + 1);
                }
                if (object.replaceLocalItem != null) {
                    if (!$util.isObject(object.replaceLocalItem))
                        throw TypeError(".fs.AdoptRemoteFolderItemRequestBody.Options.replaceLocalItem: object expected");
                    message.replaceLocalItem = $root.common.BooleanValue.fromObject(object.replaceLocalItem, long + 1);
                }
                if (object.newItemName != null) {
                    if (!$util.isObject(object.newItemName))
                        throw TypeError(".fs.AdoptRemoteFolderItemRequestBody.Options.newItemName: object expected");
                    message.newItemName = $root.common.StringValue.fromObject(object.newItemName, long + 1);
                }
                return message;
            };

            /**
             * Creates a plain object from an Options message. Also converts values to other types if specified.
             * @function toObject
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @static
             * @param {fs.AdoptRemoteFolderItemRequestBody.Options} message Options
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            Options.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults) {
                    object.localVersion = null;
                    object.uploadVersion = null;
                    object.replaceLocalItem = null;
                    object.newItemName = null;
                }
                if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                    object.localVersion = $root.common.UInt64Value.toObject(message.localVersion, options, q + 1);
                if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                    object.uploadVersion = $root.common.UInt64Value.toObject(message.uploadVersion, options, q + 1);
                if (message.replaceLocalItem != null && Object.hasOwnProperty.call(message, "replaceLocalItem"))
                    object.replaceLocalItem = $root.common.BooleanValue.toObject(message.replaceLocalItem, options, q + 1);
                if (message.newItemName != null && Object.hasOwnProperty.call(message, "newItemName"))
                    object.newItemName = $root.common.StringValue.toObject(message.newItemName, options, q + 1);
                return object;
            };

            /**
             * Converts this Options to JSON.
             * @function toJSON
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            Options.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for Options
             * @function getTypeUrl
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            Options.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/fs.AdoptRemoteFolderItemRequestBody.Options";
            };

            return Options;
        })();

        return AdoptRemoteFolderItemRequestBody;
    })();

    fs.AbsorbRemoteFolderChangesRequestBody = (function() {

        /**
         * Properties of an AbsorbRemoteFolderChangesRequestBody.
         * @memberof fs
         * @interface IAbsorbRemoteFolderChangesRequestBody
         * @property {string|null} [path] AbsorbRemoteFolderChangesRequestBody path
         * @property {fs.AbsorbRemoteFolderChangesRequestBody.IOptions|null} [opts] AbsorbRemoteFolderChangesRequestBody opts
         */

        /**
         * Constructs a new AbsorbRemoteFolderChangesRequestBody.
         * @memberof fs
         * @classdesc Represents an AbsorbRemoteFolderChangesRequestBody.
         * @implements IAbsorbRemoteFolderChangesRequestBody
         * @constructor
         * @param {fs.IAbsorbRemoteFolderChangesRequestBody=} [properties] Properties to set
         */
        function AbsorbRemoteFolderChangesRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * AbsorbRemoteFolderChangesRequestBody path.
         * @member {string} path
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @instance
         */
        AbsorbRemoteFolderChangesRequestBody.prototype.path = "";

        /**
         * AbsorbRemoteFolderChangesRequestBody opts.
         * @member {fs.AbsorbRemoteFolderChangesRequestBody.IOptions|null|undefined} opts
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @instance
         */
        AbsorbRemoteFolderChangesRequestBody.prototype.opts = null;

        /**
         * Creates a new AbsorbRemoteFolderChangesRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @static
         * @param {fs.IAbsorbRemoteFolderChangesRequestBody=} [properties] Properties to set
         * @returns {fs.AbsorbRemoteFolderChangesRequestBody} AbsorbRemoteFolderChangesRequestBody instance
         */
        AbsorbRemoteFolderChangesRequestBody.create = function create(properties) {
            return new AbsorbRemoteFolderChangesRequestBody(properties);
        };

        /**
         * Encodes the specified AbsorbRemoteFolderChangesRequestBody message. Does not implicitly {@link fs.AbsorbRemoteFolderChangesRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @static
         * @param {fs.IAbsorbRemoteFolderChangesRequestBody} message AbsorbRemoteFolderChangesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AbsorbRemoteFolderChangesRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.fs.AbsorbRemoteFolderChangesRequestBody.Options.encode(message.opts, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified AbsorbRemoteFolderChangesRequestBody message, length delimited. Does not implicitly {@link fs.AbsorbRemoteFolderChangesRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @static
         * @param {fs.IAbsorbRemoteFolderChangesRequestBody} message AbsorbRemoteFolderChangesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AbsorbRemoteFolderChangesRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an AbsorbRemoteFolderChangesRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.AbsorbRemoteFolderChangesRequestBody} AbsorbRemoteFolderChangesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AbsorbRemoteFolderChangesRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.AbsorbRemoteFolderChangesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.opts = $root.fs.AbsorbRemoteFolderChangesRequestBody.Options.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an AbsorbRemoteFolderChangesRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.AbsorbRemoteFolderChangesRequestBody} AbsorbRemoteFolderChangesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AbsorbRemoteFolderChangesRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an AbsorbRemoteFolderChangesRequestBody message.
         * @function verify
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        AbsorbRemoteFolderChangesRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts")) {
                var error = $root.fs.AbsorbRemoteFolderChangesRequestBody.Options.verify(message.opts, long + 1);
                if (error)
                    return "opts." + error;
            }
            return null;
        };

        /**
         * Creates an AbsorbRemoteFolderChangesRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.AbsorbRemoteFolderChangesRequestBody} AbsorbRemoteFolderChangesRequestBody
         */
        AbsorbRemoteFolderChangesRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.AbsorbRemoteFolderChangesRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.AbsorbRemoteFolderChangesRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.AbsorbRemoteFolderChangesRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.opts != null) {
                if (!$util.isObject(object.opts))
                    throw TypeError(".fs.AbsorbRemoteFolderChangesRequestBody.opts: object expected");
                message.opts = $root.fs.AbsorbRemoteFolderChangesRequestBody.Options.fromObject(object.opts, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an AbsorbRemoteFolderChangesRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @static
         * @param {fs.AbsorbRemoteFolderChangesRequestBody} message AbsorbRemoteFolderChangesRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        AbsorbRemoteFolderChangesRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.opts = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                object.opts = $root.fs.AbsorbRemoteFolderChangesRequestBody.Options.toObject(message.opts, options, q + 1);
            return object;
        };

        /**
         * Converts this AbsorbRemoteFolderChangesRequestBody to JSON.
         * @function toJSON
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        AbsorbRemoteFolderChangesRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for AbsorbRemoteFolderChangesRequestBody
         * @function getTypeUrl
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        AbsorbRemoteFolderChangesRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.AbsorbRemoteFolderChangesRequestBody";
        };

        AbsorbRemoteFolderChangesRequestBody.Options = (function() {

            /**
             * Properties of an Options.
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody
             * @interface IOptions
             * @property {common.IUInt64Value|null} [localVersion] Options localVersion
             * @property {common.IStringValue|null} [postfixForNameOverlaps] Options postfixForNameOverlaps
             * @property {common.IUInt64Value|null} [remoteVersion] Options remoteVersion
             */

            /**
             * Constructs a new Options.
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody
             * @classdesc Represents an Options.
             * @implements IOptions
             * @constructor
             * @param {fs.AbsorbRemoteFolderChangesRequestBody.IOptions=} [properties] Properties to set
             */
            function Options(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * Options localVersion.
             * @member {common.IUInt64Value|null|undefined} localVersion
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @instance
             */
            Options.prototype.localVersion = null;

            /**
             * Options postfixForNameOverlaps.
             * @member {common.IStringValue|null|undefined} postfixForNameOverlaps
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @instance
             */
            Options.prototype.postfixForNameOverlaps = null;

            /**
             * Options remoteVersion.
             * @member {common.IUInt64Value|null|undefined} remoteVersion
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @instance
             */
            Options.prototype.remoteVersion = null;

            /**
             * Creates a new Options instance using the specified properties.
             * @function create
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @static
             * @param {fs.AbsorbRemoteFolderChangesRequestBody.IOptions=} [properties] Properties to set
             * @returns {fs.AbsorbRemoteFolderChangesRequestBody.Options} Options instance
             */
            Options.create = function create(properties) {
                return new Options(properties);
            };

            /**
             * Encodes the specified Options message. Does not implicitly {@link fs.AbsorbRemoteFolderChangesRequestBody.Options.verify|verify} messages.
             * @function encode
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @static
             * @param {fs.AbsorbRemoteFolderChangesRequestBody.IOptions} message Options message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Options.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                    $root.common.UInt64Value.encode(message.localVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
                if (message.postfixForNameOverlaps != null && Object.hasOwnProperty.call(message, "postfixForNameOverlaps"))
                    $root.common.StringValue.encode(message.postfixForNameOverlaps, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
                if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                    $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
                return writer;
            };

            /**
             * Encodes the specified Options message, length delimited. Does not implicitly {@link fs.AbsorbRemoteFolderChangesRequestBody.Options.verify|verify} messages.
             * @function encodeDelimited
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @static
             * @param {fs.AbsorbRemoteFolderChangesRequestBody.IOptions} message Options message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Options.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes an Options message from the specified reader or buffer.
             * @function decode
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {fs.AbsorbRemoteFolderChangesRequestBody.Options} Options
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Options.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.AbsorbRemoteFolderChangesRequestBody.Options();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.localVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 2: {
                            message.postfixForNameOverlaps = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 3: {
                            message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes an Options message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {fs.AbsorbRemoteFolderChangesRequestBody.Options} Options
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Options.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies an Options message.
             * @function verify
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            Options.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion")) {
                    var error = $root.common.UInt64Value.verify(message.localVersion, long + 1);
                    if (error)
                        return "localVersion." + error;
                }
                if (message.postfixForNameOverlaps != null && Object.hasOwnProperty.call(message, "postfixForNameOverlaps")) {
                    var error = $root.common.StringValue.verify(message.postfixForNameOverlaps, long + 1);
                    if (error)
                        return "postfixForNameOverlaps." + error;
                }
                if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion")) {
                    var error = $root.common.UInt64Value.verify(message.remoteVersion, long + 1);
                    if (error)
                        return "remoteVersion." + error;
                }
                return null;
            };

            /**
             * Creates an Options message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {fs.AbsorbRemoteFolderChangesRequestBody.Options} Options
             */
            Options.fromObject = function fromObject(object, long) {
                if (object instanceof $root.fs.AbsorbRemoteFolderChangesRequestBody.Options)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".fs.AbsorbRemoteFolderChangesRequestBody.Options: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.fs.AbsorbRemoteFolderChangesRequestBody.Options();
                if (object.localVersion != null) {
                    if (!$util.isObject(object.localVersion))
                        throw TypeError(".fs.AbsorbRemoteFolderChangesRequestBody.Options.localVersion: object expected");
                    message.localVersion = $root.common.UInt64Value.fromObject(object.localVersion, long + 1);
                }
                if (object.postfixForNameOverlaps != null) {
                    if (!$util.isObject(object.postfixForNameOverlaps))
                        throw TypeError(".fs.AbsorbRemoteFolderChangesRequestBody.Options.postfixForNameOverlaps: object expected");
                    message.postfixForNameOverlaps = $root.common.StringValue.fromObject(object.postfixForNameOverlaps, long + 1);
                }
                if (object.remoteVersion != null) {
                    if (!$util.isObject(object.remoteVersion))
                        throw TypeError(".fs.AbsorbRemoteFolderChangesRequestBody.Options.remoteVersion: object expected");
                    message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion, long + 1);
                }
                return message;
            };

            /**
             * Creates a plain object from an Options message. Also converts values to other types if specified.
             * @function toObject
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @static
             * @param {fs.AbsorbRemoteFolderChangesRequestBody.Options} message Options
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            Options.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults) {
                    object.localVersion = null;
                    object.postfixForNameOverlaps = null;
                    object.remoteVersion = null;
                }
                if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                    object.localVersion = $root.common.UInt64Value.toObject(message.localVersion, options, q + 1);
                if (message.postfixForNameOverlaps != null && Object.hasOwnProperty.call(message, "postfixForNameOverlaps"))
                    object.postfixForNameOverlaps = $root.common.StringValue.toObject(message.postfixForNameOverlaps, options, q + 1);
                if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                    object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options, q + 1);
                return object;
            };

            /**
             * Converts this Options to JSON.
             * @function toJSON
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            Options.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for Options
             * @function getTypeUrl
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            Options.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/fs.AbsorbRemoteFolderChangesRequestBody.Options";
            };

            return Options;
        })();

        return AbsorbRemoteFolderChangesRequestBody;
    })();

    fs.AbsorbRemoteFolderChangesReplyBody = (function() {

        /**
         * Properties of an AbsorbRemoteFolderChangesReplyBody.
         * @memberof fs
         * @interface IAbsorbRemoteFolderChangesReplyBody
         * @property {common.IUInt64Value|null} [newVersion] AbsorbRemoteFolderChangesReplyBody newVersion
         */

        /**
         * Constructs a new AbsorbRemoteFolderChangesReplyBody.
         * @memberof fs
         * @classdesc Represents an AbsorbRemoteFolderChangesReplyBody.
         * @implements IAbsorbRemoteFolderChangesReplyBody
         * @constructor
         * @param {fs.IAbsorbRemoteFolderChangesReplyBody=} [properties] Properties to set
         */
        function AbsorbRemoteFolderChangesReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * AbsorbRemoteFolderChangesReplyBody newVersion.
         * @member {common.IUInt64Value|null|undefined} newVersion
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @instance
         */
        AbsorbRemoteFolderChangesReplyBody.prototype.newVersion = null;

        /**
         * Creates a new AbsorbRemoteFolderChangesReplyBody instance using the specified properties.
         * @function create
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @static
         * @param {fs.IAbsorbRemoteFolderChangesReplyBody=} [properties] Properties to set
         * @returns {fs.AbsorbRemoteFolderChangesReplyBody} AbsorbRemoteFolderChangesReplyBody instance
         */
        AbsorbRemoteFolderChangesReplyBody.create = function create(properties) {
            return new AbsorbRemoteFolderChangesReplyBody(properties);
        };

        /**
         * Encodes the specified AbsorbRemoteFolderChangesReplyBody message. Does not implicitly {@link fs.AbsorbRemoteFolderChangesReplyBody.verify|verify} messages.
         * @function encode
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @static
         * @param {fs.IAbsorbRemoteFolderChangesReplyBody} message AbsorbRemoteFolderChangesReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AbsorbRemoteFolderChangesReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.newVersion != null && Object.hasOwnProperty.call(message, "newVersion"))
                $root.common.UInt64Value.encode(message.newVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified AbsorbRemoteFolderChangesReplyBody message, length delimited. Does not implicitly {@link fs.AbsorbRemoteFolderChangesReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @static
         * @param {fs.IAbsorbRemoteFolderChangesReplyBody} message AbsorbRemoteFolderChangesReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AbsorbRemoteFolderChangesReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an AbsorbRemoteFolderChangesReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.AbsorbRemoteFolderChangesReplyBody} AbsorbRemoteFolderChangesReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AbsorbRemoteFolderChangesReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.AbsorbRemoteFolderChangesReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.newVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an AbsorbRemoteFolderChangesReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.AbsorbRemoteFolderChangesReplyBody} AbsorbRemoteFolderChangesReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AbsorbRemoteFolderChangesReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an AbsorbRemoteFolderChangesReplyBody message.
         * @function verify
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        AbsorbRemoteFolderChangesReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.newVersion != null && Object.hasOwnProperty.call(message, "newVersion")) {
                var error = $root.common.UInt64Value.verify(message.newVersion, long + 1);
                if (error)
                    return "newVersion." + error;
            }
            return null;
        };

        /**
         * Creates an AbsorbRemoteFolderChangesReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.AbsorbRemoteFolderChangesReplyBody} AbsorbRemoteFolderChangesReplyBody
         */
        AbsorbRemoteFolderChangesReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.AbsorbRemoteFolderChangesReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.AbsorbRemoteFolderChangesReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.AbsorbRemoteFolderChangesReplyBody();
            if (object.newVersion != null) {
                if (!$util.isObject(object.newVersion))
                    throw TypeError(".fs.AbsorbRemoteFolderChangesReplyBody.newVersion: object expected");
                message.newVersion = $root.common.UInt64Value.fromObject(object.newVersion, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an AbsorbRemoteFolderChangesReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @static
         * @param {fs.AbsorbRemoteFolderChangesReplyBody} message AbsorbRemoteFolderChangesReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        AbsorbRemoteFolderChangesReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.newVersion = null;
            if (message.newVersion != null && Object.hasOwnProperty.call(message, "newVersion"))
                object.newVersion = $root.common.UInt64Value.toObject(message.newVersion, options, q + 1);
            return object;
        };

        /**
         * Converts this AbsorbRemoteFolderChangesReplyBody to JSON.
         * @function toJSON
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        AbsorbRemoteFolderChangesReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for AbsorbRemoteFolderChangesReplyBody
         * @function getTypeUrl
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        AbsorbRemoteFolderChangesReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.AbsorbRemoteFolderChangesReplyBody";
        };

        return AbsorbRemoteFolderChangesReplyBody;
    })();

    return fs;
})();

module.exports = $root;

},{"protobufjs/minimal":84}],31:[function(require,module,exports){
/*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.shell_fs_resource = (function() {

    /**
     * Namespace shell_fs_resource.
     * @exports shell_fs_resource
     * @namespace
     */
    var shell_fs_resource = {};

    shell_fs_resource.GetFSResourceRequestBody = (function() {

        /**
         * Properties of a GetFSResourceRequestBody.
         * @memberof shell_fs_resource
         * @interface IGetFSResourceRequestBody
         * @property {common.IStringValue|null} [appDomain] GetFSResourceRequestBody appDomain
         * @property {string|null} [resourceName] GetFSResourceRequestBody resourceName
         */

        /**
         * Constructs a new GetFSResourceRequestBody.
         * @memberof shell_fs_resource
         * @classdesc Represents a GetFSResourceRequestBody.
         * @implements IGetFSResourceRequestBody
         * @constructor
         * @param {shell_fs_resource.IGetFSResourceRequestBody=} [properties] Properties to set
         */
        function GetFSResourceRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * GetFSResourceRequestBody appDomain.
         * @member {common.IStringValue|null|undefined} appDomain
         * @memberof shell_fs_resource.GetFSResourceRequestBody
         * @instance
         */
        GetFSResourceRequestBody.prototype.appDomain = null;

        /**
         * GetFSResourceRequestBody resourceName.
         * @member {string} resourceName
         * @memberof shell_fs_resource.GetFSResourceRequestBody
         * @instance
         */
        GetFSResourceRequestBody.prototype.resourceName = "";

        /**
         * Creates a new GetFSResourceRequestBody instance using the specified properties.
         * @function create
         * @memberof shell_fs_resource.GetFSResourceRequestBody
         * @static
         * @param {shell_fs_resource.IGetFSResourceRequestBody=} [properties] Properties to set
         * @returns {shell_fs_resource.GetFSResourceRequestBody} GetFSResourceRequestBody instance
         */
        GetFSResourceRequestBody.create = function create(properties) {
            return new GetFSResourceRequestBody(properties);
        };

        /**
         * Encodes the specified GetFSResourceRequestBody message. Does not implicitly {@link shell_fs_resource.GetFSResourceRequestBody.verify|verify} messages.
         * @function encode
         * @memberof shell_fs_resource.GetFSResourceRequestBody
         * @static
         * @param {shell_fs_resource.IGetFSResourceRequestBody} message GetFSResourceRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        GetFSResourceRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.appDomain != null && Object.hasOwnProperty.call(message, "appDomain"))
                $root.common.StringValue.encode(message.appDomain, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.resourceName != null && Object.hasOwnProperty.call(message, "resourceName"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.resourceName);
            return writer;
        };

        /**
         * Encodes the specified GetFSResourceRequestBody message, length delimited. Does not implicitly {@link shell_fs_resource.GetFSResourceRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof shell_fs_resource.GetFSResourceRequestBody
         * @static
         * @param {shell_fs_resource.IGetFSResourceRequestBody} message GetFSResourceRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        GetFSResourceRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a GetFSResourceRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof shell_fs_resource.GetFSResourceRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {shell_fs_resource.GetFSResourceRequestBody} GetFSResourceRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        GetFSResourceRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.shell_fs_resource.GetFSResourceRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.appDomain = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.resourceName = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a GetFSResourceRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof shell_fs_resource.GetFSResourceRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {shell_fs_resource.GetFSResourceRequestBody} GetFSResourceRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        GetFSResourceRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a GetFSResourceRequestBody message.
         * @function verify
         * @memberof shell_fs_resource.GetFSResourceRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        GetFSResourceRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.appDomain != null && Object.hasOwnProperty.call(message, "appDomain")) {
                var error = $root.common.StringValue.verify(message.appDomain, long + 1);
                if (error)
                    return "appDomain." + error;
            }
            if (message.resourceName != null && Object.hasOwnProperty.call(message, "resourceName"))
                if (!$util.isString(message.resourceName))
                    return "resourceName: string expected";
            return null;
        };

        /**
         * Creates a GetFSResourceRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof shell_fs_resource.GetFSResourceRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {shell_fs_resource.GetFSResourceRequestBody} GetFSResourceRequestBody
         */
        GetFSResourceRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.shell_fs_resource.GetFSResourceRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".shell_fs_resource.GetFSResourceRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.shell_fs_resource.GetFSResourceRequestBody();
            if (object.appDomain != null) {
                if (!$util.isObject(object.appDomain))
                    throw TypeError(".shell_fs_resource.GetFSResourceRequestBody.appDomain: object expected");
                message.appDomain = $root.common.StringValue.fromObject(object.appDomain, long + 1);
            }
            if (object.resourceName != null)
                message.resourceName = String(object.resourceName);
            return message;
        };

        /**
         * Creates a plain object from a GetFSResourceRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof shell_fs_resource.GetFSResourceRequestBody
         * @static
         * @param {shell_fs_resource.GetFSResourceRequestBody} message GetFSResourceRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        GetFSResourceRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.appDomain = null;
                object.resourceName = "";
            }
            if (message.appDomain != null && Object.hasOwnProperty.call(message, "appDomain"))
                object.appDomain = $root.common.StringValue.toObject(message.appDomain, options, q + 1);
            if (message.resourceName != null && Object.hasOwnProperty.call(message, "resourceName"))
                object.resourceName = message.resourceName;
            return object;
        };

        /**
         * Converts this GetFSResourceRequestBody to JSON.
         * @function toJSON
         * @memberof shell_fs_resource.GetFSResourceRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        GetFSResourceRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for GetFSResourceRequestBody
         * @function getTypeUrl
         * @memberof shell_fs_resource.GetFSResourceRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        GetFSResourceRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/shell_fs_resource.GetFSResourceRequestBody";
        };

        return GetFSResourceRequestBody;
    })();

    shell_fs_resource.GetFSResourceReplyBody = (function() {

        /**
         * Properties of a GetFSResourceReplyBody.
         * @memberof shell_fs_resource
         * @interface IGetFSResourceReplyBody
         * @property {fs.IFS|null} [folder] GetFSResourceReplyBody folder
         * @property {file.IFile|null} [file] GetFSResourceReplyBody file
         */

        /**
         * Constructs a new GetFSResourceReplyBody.
         * @memberof shell_fs_resource
         * @classdesc Represents a GetFSResourceReplyBody.
         * @implements IGetFSResourceReplyBody
         * @constructor
         * @param {shell_fs_resource.IGetFSResourceReplyBody=} [properties] Properties to set
         */
        function GetFSResourceReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * GetFSResourceReplyBody folder.
         * @member {fs.IFS|null|undefined} folder
         * @memberof shell_fs_resource.GetFSResourceReplyBody
         * @instance
         */
        GetFSResourceReplyBody.prototype.folder = null;

        /**
         * GetFSResourceReplyBody file.
         * @member {file.IFile|null|undefined} file
         * @memberof shell_fs_resource.GetFSResourceReplyBody
         * @instance
         */
        GetFSResourceReplyBody.prototype.file = null;

        /**
         * Creates a new GetFSResourceReplyBody instance using the specified properties.
         * @function create
         * @memberof shell_fs_resource.GetFSResourceReplyBody
         * @static
         * @param {shell_fs_resource.IGetFSResourceReplyBody=} [properties] Properties to set
         * @returns {shell_fs_resource.GetFSResourceReplyBody} GetFSResourceReplyBody instance
         */
        GetFSResourceReplyBody.create = function create(properties) {
            return new GetFSResourceReplyBody(properties);
        };

        /**
         * Encodes the specified GetFSResourceReplyBody message. Does not implicitly {@link shell_fs_resource.GetFSResourceReplyBody.verify|verify} messages.
         * @function encode
         * @memberof shell_fs_resource.GetFSResourceReplyBody
         * @static
         * @param {shell_fs_resource.IGetFSResourceReplyBody} message GetFSResourceReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        GetFSResourceReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.folder != null && Object.hasOwnProperty.call(message, "folder"))
                $root.fs.FS.encode(message.folder, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                $root.file.File.encode(message.file, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified GetFSResourceReplyBody message, length delimited. Does not implicitly {@link shell_fs_resource.GetFSResourceReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof shell_fs_resource.GetFSResourceReplyBody
         * @static
         * @param {shell_fs_resource.IGetFSResourceReplyBody} message GetFSResourceReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        GetFSResourceReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a GetFSResourceReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof shell_fs_resource.GetFSResourceReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {shell_fs_resource.GetFSResourceReplyBody} GetFSResourceReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        GetFSResourceReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.shell_fs_resource.GetFSResourceReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.folder = $root.fs.FS.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.file = $root.file.File.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a GetFSResourceReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof shell_fs_resource.GetFSResourceReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {shell_fs_resource.GetFSResourceReplyBody} GetFSResourceReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        GetFSResourceReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a GetFSResourceReplyBody message.
         * @function verify
         * @memberof shell_fs_resource.GetFSResourceReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        GetFSResourceReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.folder != null && Object.hasOwnProperty.call(message, "folder")) {
                var error = $root.fs.FS.verify(message.folder, long + 1);
                if (error)
                    return "folder." + error;
            }
            if (message.file != null && Object.hasOwnProperty.call(message, "file")) {
                var error = $root.file.File.verify(message.file, long + 1);
                if (error)
                    return "file." + error;
            }
            return null;
        };

        /**
         * Creates a GetFSResourceReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof shell_fs_resource.GetFSResourceReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {shell_fs_resource.GetFSResourceReplyBody} GetFSResourceReplyBody
         */
        GetFSResourceReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.shell_fs_resource.GetFSResourceReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".shell_fs_resource.GetFSResourceReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.shell_fs_resource.GetFSResourceReplyBody();
            if (object.folder != null) {
                if (!$util.isObject(object.folder))
                    throw TypeError(".shell_fs_resource.GetFSResourceReplyBody.folder: object expected");
                message.folder = $root.fs.FS.fromObject(object.folder, long + 1);
            }
            if (object.file != null) {
                if (!$util.isObject(object.file))
                    throw TypeError(".shell_fs_resource.GetFSResourceReplyBody.file: object expected");
                message.file = $root.file.File.fromObject(object.file, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a GetFSResourceReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof shell_fs_resource.GetFSResourceReplyBody
         * @static
         * @param {shell_fs_resource.GetFSResourceReplyBody} message GetFSResourceReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        GetFSResourceReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.folder = null;
                object.file = null;
            }
            if (message.folder != null && Object.hasOwnProperty.call(message, "folder"))
                object.folder = $root.fs.FS.toObject(message.folder, options, q + 1);
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                object.file = $root.file.File.toObject(message.file, options, q + 1);
            return object;
        };

        /**
         * Converts this GetFSResourceReplyBody to JSON.
         * @function toJSON
         * @memberof shell_fs_resource.GetFSResourceReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        GetFSResourceReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for GetFSResourceReplyBody
         * @function getTypeUrl
         * @memberof shell_fs_resource.GetFSResourceReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        GetFSResourceReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/shell_fs_resource.GetFSResourceReplyBody";
        };

        return GetFSResourceReplyBody;
    })();

    return shell_fs_resource;
})();

$root.common = (function() {

    /**
     * Namespace common.
     * @exports common
     * @namespace
     */
    var common = {};

    common.ObjectReference = (function() {

        /**
         * Properties of an ObjectReference.
         * @memberof common
         * @interface IObjectReference
         * @property {string|null} [objType] ObjectReference objType
         * @property {Array.<string>|null} [path] ObjectReference path
         */

        /**
         * Constructs a new ObjectReference.
         * @memberof common
         * @classdesc Represents an ObjectReference.
         * @implements IObjectReference
         * @constructor
         * @param {common.IObjectReference=} [properties] Properties to set
         */
        function ObjectReference(properties) {
            this.path = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ObjectReference objType.
         * @member {string} objType
         * @memberof common.ObjectReference
         * @instance
         */
        ObjectReference.prototype.objType = "";

        /**
         * ObjectReference path.
         * @member {Array.<string>} path
         * @memberof common.ObjectReference
         * @instance
         */
        ObjectReference.prototype.path = $util.emptyArray;

        /**
         * Creates a new ObjectReference instance using the specified properties.
         * @function create
         * @memberof common.ObjectReference
         * @static
         * @param {common.IObjectReference=} [properties] Properties to set
         * @returns {common.ObjectReference} ObjectReference instance
         */
        ObjectReference.create = function create(properties) {
            return new ObjectReference(properties);
        };

        /**
         * Encodes the specified ObjectReference message. Does not implicitly {@link common.ObjectReference.verify|verify} messages.
         * @function encode
         * @memberof common.ObjectReference
         * @static
         * @param {common.IObjectReference} message ObjectReference message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ObjectReference.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.objType != null && Object.hasOwnProperty.call(message, "objType"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.objType);
            if (message.path != null && message.path.length)
                for (var i = 0; i < message.path.length; ++i)
                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.path[i]);
            return writer;
        };

        /**
         * Encodes the specified ObjectReference message, length delimited. Does not implicitly {@link common.ObjectReference.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.ObjectReference
         * @static
         * @param {common.IObjectReference} message ObjectReference message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ObjectReference.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an ObjectReference message from the specified reader or buffer.
         * @function decode
         * @memberof common.ObjectReference
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.ObjectReference} ObjectReference
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ObjectReference.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ObjectReference();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.objType = reader.string();
                        break;
                    }
                case 2: {
                        if (!(message.path && message.path.length))
                            message.path = [];
                        message.path.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an ObjectReference message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.ObjectReference
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.ObjectReference} ObjectReference
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ObjectReference.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an ObjectReference message.
         * @function verify
         * @memberof common.ObjectReference
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ObjectReference.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.objType != null && Object.hasOwnProperty.call(message, "objType"))
                if (!$util.isString(message.objType))
                    return "objType: string expected";
            if (message.path != null && Object.hasOwnProperty.call(message, "path")) {
                if (!Array.isArray(message.path))
                    return "path: array expected";
                for (var i = 0; i < message.path.length; ++i)
                    if (!$util.isString(message.path[i]))
                        return "path: string[] expected";
            }
            return null;
        };

        /**
         * Creates an ObjectReference message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.ObjectReference
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.ObjectReference} ObjectReference
         */
        ObjectReference.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.ObjectReference)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.ObjectReference: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.ObjectReference();
            if (object.objType != null)
                message.objType = String(object.objType);
            if (object.path) {
                if (!Array.isArray(object.path))
                    throw TypeError(".common.ObjectReference.path: array expected");
                message.path = [];
                for (var i = 0; i < object.path.length; ++i)
                    message.path[i] = String(object.path[i]);
            }
            return message;
        };

        /**
         * Creates a plain object from an ObjectReference message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.ObjectReference
         * @static
         * @param {common.ObjectReference} message ObjectReference
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ObjectReference.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.path = [];
            if (options.defaults)
                object.objType = "";
            if (message.objType != null && Object.hasOwnProperty.call(message, "objType"))
                object.objType = message.objType;
            if (message.path && message.path.length) {
                object.path = [];
                for (var j = 0; j < message.path.length; ++j)
                    object.path[j] = message.path[j];
            }
            return object;
        };

        /**
         * Converts this ObjectReference to JSON.
         * @function toJSON
         * @memberof common.ObjectReference
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ObjectReference.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ObjectReference
         * @function getTypeUrl
         * @memberof common.ObjectReference
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ObjectReference.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.ObjectReference";
        };

        return ObjectReference;
    })();

    common.BooleanValue = (function() {

        /**
         * Properties of a BooleanValue.
         * @memberof common
         * @interface IBooleanValue
         * @property {boolean|null} [value] BooleanValue value
         */

        /**
         * Constructs a new BooleanValue.
         * @memberof common
         * @classdesc Represents a BooleanValue.
         * @implements IBooleanValue
         * @constructor
         * @param {common.IBooleanValue=} [properties] Properties to set
         */
        function BooleanValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * BooleanValue value.
         * @member {boolean} value
         * @memberof common.BooleanValue
         * @instance
         */
        BooleanValue.prototype.value = false;

        /**
         * Creates a new BooleanValue instance using the specified properties.
         * @function create
         * @memberof common.BooleanValue
         * @static
         * @param {common.IBooleanValue=} [properties] Properties to set
         * @returns {common.BooleanValue} BooleanValue instance
         */
        BooleanValue.create = function create(properties) {
            return new BooleanValue(properties);
        };

        /**
         * Encodes the specified BooleanValue message. Does not implicitly {@link common.BooleanValue.verify|verify} messages.
         * @function encode
         * @memberof common.BooleanValue
         * @static
         * @param {common.IBooleanValue} message BooleanValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BooleanValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 0 =*/8).bool(message.value);
            return writer;
        };

        /**
         * Encodes the specified BooleanValue message, length delimited. Does not implicitly {@link common.BooleanValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.BooleanValue
         * @static
         * @param {common.IBooleanValue} message BooleanValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BooleanValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a BooleanValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.BooleanValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.BooleanValue} BooleanValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BooleanValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BooleanValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.bool();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a BooleanValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.BooleanValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.BooleanValue} BooleanValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BooleanValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a BooleanValue message.
         * @function verify
         * @memberof common.BooleanValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        BooleanValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (typeof message.value !== "boolean")
                    return "value: boolean expected";
            return null;
        };

        /**
         * Creates a BooleanValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.BooleanValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.BooleanValue} BooleanValue
         */
        BooleanValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.BooleanValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.BooleanValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.BooleanValue();
            if (object.value != null)
                message.value = Boolean(object.value);
            return message;
        };

        /**
         * Creates a plain object from a BooleanValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.BooleanValue
         * @static
         * @param {common.BooleanValue} message BooleanValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        BooleanValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.value = false;
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = message.value;
            return object;
        };

        /**
         * Converts this BooleanValue to JSON.
         * @function toJSON
         * @memberof common.BooleanValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        BooleanValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for BooleanValue
         * @function getTypeUrl
         * @memberof common.BooleanValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        BooleanValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.BooleanValue";
        };

        return BooleanValue;
    })();

    common.StringArrayValue = (function() {

        /**
         * Properties of a StringArrayValue.
         * @memberof common
         * @interface IStringArrayValue
         * @property {Array.<string>|null} [values] StringArrayValue values
         */

        /**
         * Constructs a new StringArrayValue.
         * @memberof common
         * @classdesc Represents a StringArrayValue.
         * @implements IStringArrayValue
         * @constructor
         * @param {common.IStringArrayValue=} [properties] Properties to set
         */
        function StringArrayValue(properties) {
            this.values = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * StringArrayValue values.
         * @member {Array.<string>} values
         * @memberof common.StringArrayValue
         * @instance
         */
        StringArrayValue.prototype.values = $util.emptyArray;

        /**
         * Creates a new StringArrayValue instance using the specified properties.
         * @function create
         * @memberof common.StringArrayValue
         * @static
         * @param {common.IStringArrayValue=} [properties] Properties to set
         * @returns {common.StringArrayValue} StringArrayValue instance
         */
        StringArrayValue.create = function create(properties) {
            return new StringArrayValue(properties);
        };

        /**
         * Encodes the specified StringArrayValue message. Does not implicitly {@link common.StringArrayValue.verify|verify} messages.
         * @function encode
         * @memberof common.StringArrayValue
         * @static
         * @param {common.IStringArrayValue} message StringArrayValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringArrayValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.values != null && message.values.length)
                for (var i = 0; i < message.values.length; ++i)
                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.values[i]);
            return writer;
        };

        /**
         * Encodes the specified StringArrayValue message, length delimited. Does not implicitly {@link common.StringArrayValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.StringArrayValue
         * @static
         * @param {common.IStringArrayValue} message StringArrayValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringArrayValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a StringArrayValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.StringArrayValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.StringArrayValue} StringArrayValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringArrayValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringArrayValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.values && message.values.length))
                            message.values = [];
                        message.values.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a StringArrayValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.StringArrayValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.StringArrayValue} StringArrayValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringArrayValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a StringArrayValue message.
         * @function verify
         * @memberof common.StringArrayValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        StringArrayValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.values != null && Object.hasOwnProperty.call(message, "values")) {
                if (!Array.isArray(message.values))
                    return "values: array expected";
                for (var i = 0; i < message.values.length; ++i)
                    if (!$util.isString(message.values[i]))
                        return "values: string[] expected";
            }
            return null;
        };

        /**
         * Creates a StringArrayValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.StringArrayValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.StringArrayValue} StringArrayValue
         */
        StringArrayValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.StringArrayValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.StringArrayValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.StringArrayValue();
            if (object.values) {
                if (!Array.isArray(object.values))
                    throw TypeError(".common.StringArrayValue.values: array expected");
                message.values = [];
                for (var i = 0; i < object.values.length; ++i)
                    message.values[i] = String(object.values[i]);
            }
            return message;
        };

        /**
         * Creates a plain object from a StringArrayValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.StringArrayValue
         * @static
         * @param {common.StringArrayValue} message StringArrayValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        StringArrayValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.values = [];
            if (message.values && message.values.length) {
                object.values = [];
                for (var j = 0; j < message.values.length; ++j)
                    object.values[j] = message.values[j];
            }
            return object;
        };

        /**
         * Converts this StringArrayValue to JSON.
         * @function toJSON
         * @memberof common.StringArrayValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        StringArrayValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for StringArrayValue
         * @function getTypeUrl
         * @memberof common.StringArrayValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        StringArrayValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.StringArrayValue";
        };

        return StringArrayValue;
    })();

    common.UInt64Value = (function() {

        /**
         * Properties of a UInt64Value.
         * @memberof common
         * @interface IUInt64Value
         * @property {number|Long|null} [value] UInt64Value value
         */

        /**
         * Constructs a new UInt64Value.
         * @memberof common
         * @classdesc Represents a UInt64Value.
         * @implements IUInt64Value
         * @constructor
         * @param {common.IUInt64Value=} [properties] Properties to set
         */
        function UInt64Value(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * UInt64Value value.
         * @member {number|Long} value
         * @memberof common.UInt64Value
         * @instance
         */
        UInt64Value.prototype.value = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new UInt64Value instance using the specified properties.
         * @function create
         * @memberof common.UInt64Value
         * @static
         * @param {common.IUInt64Value=} [properties] Properties to set
         * @returns {common.UInt64Value} UInt64Value instance
         */
        UInt64Value.create = function create(properties) {
            return new UInt64Value(properties);
        };

        /**
         * Encodes the specified UInt64Value message. Does not implicitly {@link common.UInt64Value.verify|verify} messages.
         * @function encode
         * @memberof common.UInt64Value
         * @static
         * @param {common.IUInt64Value} message UInt64Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt64Value.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.value);
            return writer;
        };

        /**
         * Encodes the specified UInt64Value message, length delimited. Does not implicitly {@link common.UInt64Value.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.UInt64Value
         * @static
         * @param {common.IUInt64Value} message UInt64Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt64Value.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a UInt64Value message from the specified reader or buffer.
         * @function decode
         * @memberof common.UInt64Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.UInt64Value} UInt64Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt64Value.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt64Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a UInt64Value message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.UInt64Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.UInt64Value} UInt64Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt64Value.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a UInt64Value message.
         * @function verify
         * @memberof common.UInt64Value
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        UInt64Value.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!$util.isInteger(message.value) && !(message.value && $util.isInteger(message.value.low) && $util.isInteger(message.value.high)))
                    return "value: integer|Long expected";
            return null;
        };

        /**
         * Creates a UInt64Value message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.UInt64Value
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.UInt64Value} UInt64Value
         */
        UInt64Value.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.UInt64Value)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.UInt64Value: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.UInt64Value();
            if (object.value != null)
                if ($util.Long)
                    message.value = $util.Long.fromValue(object.value, true);
                else if (typeof object.value === "string")
                    message.value = parseInt(object.value, 10);
                else if (typeof object.value === "number")
                    message.value = object.value;
                else if (typeof object.value === "object")
                    message.value = new $util.LongBits(object.value.low >>> 0, object.value.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from a UInt64Value message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.UInt64Value
         * @static
         * @param {common.UInt64Value} message UInt64Value
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        UInt64Value.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.value = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.value = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.value = typeof message.value === "number" ? BigInt(message.value) : $util.Long.fromBits(message.value.low >>> 0, message.value.high >>> 0, true).toBigInt();
                else if (typeof message.value === "number")
                    object.value = options.longs === String ? String(message.value) : message.value;
                else
                    object.value = options.longs === String ? $util.Long.prototype.toString.call(message.value) : options.longs === Number ? new $util.LongBits(message.value.low >>> 0, message.value.high >>> 0).toNumber(true) : message.value;
            return object;
        };

        /**
         * Converts this UInt64Value to JSON.
         * @function toJSON
         * @memberof common.UInt64Value
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        UInt64Value.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for UInt64Value
         * @function getTypeUrl
         * @memberof common.UInt64Value
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        UInt64Value.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.UInt64Value";
        };

        return UInt64Value;
    })();

    common.UInt32Value = (function() {

        /**
         * Properties of a UInt32Value.
         * @memberof common
         * @interface IUInt32Value
         * @property {number|null} [value] UInt32Value value
         */

        /**
         * Constructs a new UInt32Value.
         * @memberof common
         * @classdesc Represents a UInt32Value.
         * @implements IUInt32Value
         * @constructor
         * @param {common.IUInt32Value=} [properties] Properties to set
         */
        function UInt32Value(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * UInt32Value value.
         * @member {number} value
         * @memberof common.UInt32Value
         * @instance
         */
        UInt32Value.prototype.value = 0;

        /**
         * Creates a new UInt32Value instance using the specified properties.
         * @function create
         * @memberof common.UInt32Value
         * @static
         * @param {common.IUInt32Value=} [properties] Properties to set
         * @returns {common.UInt32Value} UInt32Value instance
         */
        UInt32Value.create = function create(properties) {
            return new UInt32Value(properties);
        };

        /**
         * Encodes the specified UInt32Value message. Does not implicitly {@link common.UInt32Value.verify|verify} messages.
         * @function encode
         * @memberof common.UInt32Value
         * @static
         * @param {common.IUInt32Value} message UInt32Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt32Value.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.value);
            return writer;
        };

        /**
         * Encodes the specified UInt32Value message, length delimited. Does not implicitly {@link common.UInt32Value.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.UInt32Value
         * @static
         * @param {common.IUInt32Value} message UInt32Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt32Value.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a UInt32Value message from the specified reader or buffer.
         * @function decode
         * @memberof common.UInt32Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.UInt32Value} UInt32Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt32Value.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt32Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.uint32();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a UInt32Value message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.UInt32Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.UInt32Value} UInt32Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt32Value.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a UInt32Value message.
         * @function verify
         * @memberof common.UInt32Value
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        UInt32Value.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!$util.isInteger(message.value))
                    return "value: integer expected";
            return null;
        };

        /**
         * Creates a UInt32Value message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.UInt32Value
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.UInt32Value} UInt32Value
         */
        UInt32Value.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.UInt32Value)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.UInt32Value: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.UInt32Value();
            if (object.value != null)
                message.value = object.value >>> 0;
            return message;
        };

        /**
         * Creates a plain object from a UInt32Value message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.UInt32Value
         * @static
         * @param {common.UInt32Value} message UInt32Value
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        UInt32Value.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.value = 0;
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = message.value;
            return object;
        };

        /**
         * Converts this UInt32Value to JSON.
         * @function toJSON
         * @memberof common.UInt32Value
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        UInt32Value.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for UInt32Value
         * @function getTypeUrl
         * @memberof common.UInt32Value
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        UInt32Value.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.UInt32Value";
        };

        return UInt32Value;
    })();

    common.StringValue = (function() {

        /**
         * Properties of a StringValue.
         * @memberof common
         * @interface IStringValue
         * @property {string|null} [value] StringValue value
         */

        /**
         * Constructs a new StringValue.
         * @memberof common
         * @classdesc Represents a StringValue.
         * @implements IStringValue
         * @constructor
         * @param {common.IStringValue=} [properties] Properties to set
         */
        function StringValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * StringValue value.
         * @member {string} value
         * @memberof common.StringValue
         * @instance
         */
        StringValue.prototype.value = "";

        /**
         * Creates a new StringValue instance using the specified properties.
         * @function create
         * @memberof common.StringValue
         * @static
         * @param {common.IStringValue=} [properties] Properties to set
         * @returns {common.StringValue} StringValue instance
         */
        StringValue.create = function create(properties) {
            return new StringValue(properties);
        };

        /**
         * Encodes the specified StringValue message. Does not implicitly {@link common.StringValue.verify|verify} messages.
         * @function encode
         * @memberof common.StringValue
         * @static
         * @param {common.IStringValue} message StringValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.value);
            return writer;
        };

        /**
         * Encodes the specified StringValue message, length delimited. Does not implicitly {@link common.StringValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.StringValue
         * @static
         * @param {common.IStringValue} message StringValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a StringValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.StringValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.StringValue} StringValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a StringValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.StringValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.StringValue} StringValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a StringValue message.
         * @function verify
         * @memberof common.StringValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        StringValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!$util.isString(message.value))
                    return "value: string expected";
            return null;
        };

        /**
         * Creates a StringValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.StringValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.StringValue} StringValue
         */
        StringValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.StringValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.StringValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.StringValue();
            if (object.value != null)
                message.value = String(object.value);
            return message;
        };

        /**
         * Creates a plain object from a StringValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.StringValue
         * @static
         * @param {common.StringValue} message StringValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        StringValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.value = "";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = message.value;
            return object;
        };

        /**
         * Converts this StringValue to JSON.
         * @function toJSON
         * @memberof common.StringValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        StringValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for StringValue
         * @function getTypeUrl
         * @memberof common.StringValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        StringValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.StringValue";
        };

        return StringValue;
    })();

    common.BytesValue = (function() {

        /**
         * Properties of a BytesValue.
         * @memberof common
         * @interface IBytesValue
         * @property {Uint8Array|null} [value] BytesValue value
         */

        /**
         * Constructs a new BytesValue.
         * @memberof common
         * @classdesc Represents a BytesValue.
         * @implements IBytesValue
         * @constructor
         * @param {common.IBytesValue=} [properties] Properties to set
         */
        function BytesValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * BytesValue value.
         * @member {Uint8Array} value
         * @memberof common.BytesValue
         * @instance
         */
        BytesValue.prototype.value = $util.newBuffer([]);

        /**
         * Creates a new BytesValue instance using the specified properties.
         * @function create
         * @memberof common.BytesValue
         * @static
         * @param {common.IBytesValue=} [properties] Properties to set
         * @returns {common.BytesValue} BytesValue instance
         */
        BytesValue.create = function create(properties) {
            return new BytesValue(properties);
        };

        /**
         * Encodes the specified BytesValue message. Does not implicitly {@link common.BytesValue.verify|verify} messages.
         * @function encode
         * @memberof common.BytesValue
         * @static
         * @param {common.IBytesValue} message BytesValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BytesValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.value);
            return writer;
        };

        /**
         * Encodes the specified BytesValue message, length delimited. Does not implicitly {@link common.BytesValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.BytesValue
         * @static
         * @param {common.IBytesValue} message BytesValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BytesValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a BytesValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.BytesValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.BytesValue} BytesValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BytesValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BytesValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.bytes();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a BytesValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.BytesValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.BytesValue} BytesValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BytesValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a BytesValue message.
         * @function verify
         * @memberof common.BytesValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        BytesValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!(message.value && typeof message.value.length === "number" || $util.isString(message.value)))
                    return "value: buffer expected";
            return null;
        };

        /**
         * Creates a BytesValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.BytesValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.BytesValue} BytesValue
         */
        BytesValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.BytesValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.BytesValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.BytesValue();
            if (object.value != null)
                if (typeof object.value === "string")
                    $util.base64.decode(object.value, message.value = $util.newBuffer($util.base64.length(object.value)), 0);
                else if (object.value.length >= 0)
                    message.value = object.value;
            return message;
        };

        /**
         * Creates a plain object from a BytesValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.BytesValue
         * @static
         * @param {common.BytesValue} message BytesValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        BytesValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if (options.bytes === String)
                    object.value = "";
                else {
                    object.value = [];
                    if (options.bytes !== Array)
                        object.value = $util.newBuffer(object.value);
                }
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = options.bytes === String ? $util.base64.encode(message.value, 0, message.value.length) : options.bytes === Array ? Array.prototype.slice.call(message.value) : message.value;
            return object;
        };

        /**
         * Converts this BytesValue to JSON.
         * @function toJSON
         * @memberof common.BytesValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        BytesValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for BytesValue
         * @function getTypeUrl
         * @memberof common.BytesValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        BytesValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.BytesValue";
        };

        return BytesValue;
    })();

    common.ErrorValue = (function() {

        /**
         * Properties of an ErrorValue.
         * @memberof common
         * @interface IErrorValue
         * @property {string|null} [runtimeExcJson] ErrorValue runtimeExcJson
         * @property {string|null} [err] ErrorValue err
         */

        /**
         * Constructs a new ErrorValue.
         * @memberof common
         * @classdesc Represents an ErrorValue.
         * @implements IErrorValue
         * @constructor
         * @param {common.IErrorValue=} [properties] Properties to set
         */
        function ErrorValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ErrorValue runtimeExcJson.
         * @member {string} runtimeExcJson
         * @memberof common.ErrorValue
         * @instance
         */
        ErrorValue.prototype.runtimeExcJson = "";

        /**
         * ErrorValue err.
         * @member {string} err
         * @memberof common.ErrorValue
         * @instance
         */
        ErrorValue.prototype.err = "";

        /**
         * Creates a new ErrorValue instance using the specified properties.
         * @function create
         * @memberof common.ErrorValue
         * @static
         * @param {common.IErrorValue=} [properties] Properties to set
         * @returns {common.ErrorValue} ErrorValue instance
         */
        ErrorValue.create = function create(properties) {
            return new ErrorValue(properties);
        };

        /**
         * Encodes the specified ErrorValue message. Does not implicitly {@link common.ErrorValue.verify|verify} messages.
         * @function encode
         * @memberof common.ErrorValue
         * @static
         * @param {common.IErrorValue} message ErrorValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ErrorValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.runtimeExcJson != null && Object.hasOwnProperty.call(message, "runtimeExcJson"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.runtimeExcJson);
            if (message.err != null && Object.hasOwnProperty.call(message, "err"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.err);
            return writer;
        };

        /**
         * Encodes the specified ErrorValue message, length delimited. Does not implicitly {@link common.ErrorValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.ErrorValue
         * @static
         * @param {common.IErrorValue} message ErrorValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ErrorValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an ErrorValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.ErrorValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.ErrorValue} ErrorValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ErrorValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ErrorValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.runtimeExcJson = reader.string();
                        break;
                    }
                case 2: {
                        message.err = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an ErrorValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.ErrorValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.ErrorValue} ErrorValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ErrorValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an ErrorValue message.
         * @function verify
         * @memberof common.ErrorValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ErrorValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.runtimeExcJson != null && Object.hasOwnProperty.call(message, "runtimeExcJson"))
                if (!$util.isString(message.runtimeExcJson))
                    return "runtimeExcJson: string expected";
            if (message.err != null && Object.hasOwnProperty.call(message, "err"))
                if (!$util.isString(message.err))
                    return "err: string expected";
            return null;
        };

        /**
         * Creates an ErrorValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.ErrorValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.ErrorValue} ErrorValue
         */
        ErrorValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.ErrorValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.ErrorValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.ErrorValue();
            if (object.runtimeExcJson != null)
                message.runtimeExcJson = String(object.runtimeExcJson);
            if (object.err != null)
                message.err = String(object.err);
            return message;
        };

        /**
         * Creates a plain object from an ErrorValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.ErrorValue
         * @static
         * @param {common.ErrorValue} message ErrorValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ErrorValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.runtimeExcJson = "";
                object.err = "";
            }
            if (message.runtimeExcJson != null && Object.hasOwnProperty.call(message, "runtimeExcJson"))
                object.runtimeExcJson = message.runtimeExcJson;
            if (message.err != null && Object.hasOwnProperty.call(message, "err"))
                object.err = message.err;
            return object;
        };

        /**
         * Converts this ErrorValue to JSON.
         * @function toJSON
         * @memberof common.ErrorValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ErrorValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ErrorValue
         * @function getTypeUrl
         * @memberof common.ErrorValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ErrorValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.ErrorValue";
        };

        return ErrorValue;
    })();

    common.AnyValue = (function() {

        /**
         * Properties of an AnyValue.
         * @memberof common
         * @interface IAnyValue
         * @property {string|null} [type] AnyValue type
         * @property {common.IStringValue|null} [json] AnyValue json
         * @property {common.IBytesValue|null} [bytes] AnyValue bytes
         */

        /**
         * Constructs a new AnyValue.
         * @memberof common
         * @classdesc Represents an AnyValue.
         * @implements IAnyValue
         * @constructor
         * @param {common.IAnyValue=} [properties] Properties to set
         */
        function AnyValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * AnyValue type.
         * @member {string} type
         * @memberof common.AnyValue
         * @instance
         */
        AnyValue.prototype.type = "";

        /**
         * AnyValue json.
         * @member {common.IStringValue|null|undefined} json
         * @memberof common.AnyValue
         * @instance
         */
        AnyValue.prototype.json = null;

        /**
         * AnyValue bytes.
         * @member {common.IBytesValue|null|undefined} bytes
         * @memberof common.AnyValue
         * @instance
         */
        AnyValue.prototype.bytes = null;

        /**
         * Creates a new AnyValue instance using the specified properties.
         * @function create
         * @memberof common.AnyValue
         * @static
         * @param {common.IAnyValue=} [properties] Properties to set
         * @returns {common.AnyValue} AnyValue instance
         */
        AnyValue.create = function create(properties) {
            return new AnyValue(properties);
        };

        /**
         * Encodes the specified AnyValue message. Does not implicitly {@link common.AnyValue.verify|verify} messages.
         * @function encode
         * @memberof common.AnyValue
         * @static
         * @param {common.IAnyValue} message AnyValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AnyValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.type);
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified AnyValue message, length delimited. Does not implicitly {@link common.AnyValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.AnyValue
         * @static
         * @param {common.IAnyValue} message AnyValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AnyValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an AnyValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.AnyValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.AnyValue} AnyValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AnyValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.AnyValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.type = reader.string();
                        break;
                    }
                case 2: {
                        message.json = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an AnyValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.AnyValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.AnyValue} AnyValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AnyValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an AnyValue message.
         * @function verify
         * @memberof common.AnyValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        AnyValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.json != null && Object.hasOwnProperty.call(message, "json")) {
                var error = $root.common.StringValue.verify(message.json, long + 1);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes, long + 1);
                if (error)
                    return "bytes." + error;
            }
            return null;
        };

        /**
         * Creates an AnyValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.AnyValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.AnyValue} AnyValue
         */
        AnyValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.AnyValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.AnyValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.AnyValue();
            if (object.type != null)
                message.type = String(object.type);
            if (object.json != null) {
                if (!$util.isObject(object.json))
                    throw TypeError(".common.AnyValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json, long + 1);
            }
            if (object.bytes != null) {
                if (!$util.isObject(object.bytes))
                    throw TypeError(".common.AnyValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an AnyValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.AnyValue
         * @static
         * @param {common.AnyValue} message AnyValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        AnyValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.json = null;
                object.bytes = null;
            }
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                object.type = message.type;
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = $root.common.StringValue.toObject(message.json, options, q + 1);
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options, q + 1);
            return object;
        };

        /**
         * Converts this AnyValue to JSON.
         * @function toJSON
         * @memberof common.AnyValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        AnyValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for AnyValue
         * @function getTypeUrl
         * @memberof common.AnyValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        AnyValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.AnyValue";
        };

        return AnyValue;
    })();

    return common;
})();

$root.file = (function() {

    /**
     * Namespace file.
     * @exports file
     * @namespace
     */
    var file = {};

    file.File = (function() {

        /**
         * Properties of a File.
         * @memberof file
         * @interface IFile
         * @property {boolean|null} [writable] File writable
         * @property {boolean|null} [isVersioned] File isVersioned
         * @property {string|null} [name] File name
         * @property {boolean|null} [isNew] File isNew
         * @property {common.IObjectReference|null} [impl] File impl
         * @property {boolean|null} [isSynced] File isSynced
         */

        /**
         * Constructs a new File.
         * @memberof file
         * @classdesc Represents a File.
         * @implements IFile
         * @constructor
         * @param {file.IFile=} [properties] Properties to set
         */
        function File(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * File writable.
         * @member {boolean} writable
         * @memberof file.File
         * @instance
         */
        File.prototype.writable = false;

        /**
         * File isVersioned.
         * @member {boolean} isVersioned
         * @memberof file.File
         * @instance
         */
        File.prototype.isVersioned = false;

        /**
         * File name.
         * @member {string} name
         * @memberof file.File
         * @instance
         */
        File.prototype.name = "";

        /**
         * File isNew.
         * @member {boolean} isNew
         * @memberof file.File
         * @instance
         */
        File.prototype.isNew = false;

        /**
         * File impl.
         * @member {common.IObjectReference|null|undefined} impl
         * @memberof file.File
         * @instance
         */
        File.prototype.impl = null;

        /**
         * File isSynced.
         * @member {boolean} isSynced
         * @memberof file.File
         * @instance
         */
        File.prototype.isSynced = false;

        /**
         * Creates a new File instance using the specified properties.
         * @function create
         * @memberof file.File
         * @static
         * @param {file.IFile=} [properties] Properties to set
         * @returns {file.File} File instance
         */
        File.create = function create(properties) {
            return new File(properties);
        };

        /**
         * Encodes the specified File message. Does not implicitly {@link file.File.verify|verify} messages.
         * @function encode
         * @memberof file.File
         * @static
         * @param {file.IFile} message File message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        File.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.writable != null && Object.hasOwnProperty.call(message, "writable"))
                writer.uint32(/* id 1, wireType 0 =*/8).bool(message.writable);
            if (message.isVersioned != null && Object.hasOwnProperty.call(message, "isVersioned"))
                writer.uint32(/* id 2, wireType 0 =*/16).bool(message.isVersioned);
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                writer.uint32(/* id 3, wireType 2 =*/26).string(message.name);
            if (message.isNew != null && Object.hasOwnProperty.call(message, "isNew"))
                writer.uint32(/* id 4, wireType 0 =*/32).bool(message.isNew);
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl"))
                $root.common.ObjectReference.encode(message.impl, writer.uint32(/* id 5, wireType 2 =*/42).fork(), q + 1).ldelim();
            if (message.isSynced != null && Object.hasOwnProperty.call(message, "isSynced"))
                writer.uint32(/* id 6, wireType 0 =*/48).bool(message.isSynced);
            return writer;
        };

        /**
         * Encodes the specified File message, length delimited. Does not implicitly {@link file.File.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.File
         * @static
         * @param {file.IFile} message File message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        File.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a File message from the specified reader or buffer.
         * @function decode
         * @memberof file.File
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.File} File
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        File.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.File();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.writable = reader.bool();
                        break;
                    }
                case 2: {
                        message.isVersioned = reader.bool();
                        break;
                    }
                case 3: {
                        message.name = reader.string();
                        break;
                    }
                case 4: {
                        message.isNew = reader.bool();
                        break;
                    }
                case 5: {
                        message.impl = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 6: {
                        message.isSynced = reader.bool();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a File message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.File
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.File} File
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        File.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a File message.
         * @function verify
         * @memberof file.File
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        File.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.writable != null && Object.hasOwnProperty.call(message, "writable"))
                if (typeof message.writable !== "boolean")
                    return "writable: boolean expected";
            if (message.isVersioned != null && Object.hasOwnProperty.call(message, "isVersioned"))
                if (typeof message.isVersioned !== "boolean")
                    return "isVersioned: boolean expected";
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.isNew != null && Object.hasOwnProperty.call(message, "isNew"))
                if (typeof message.isNew !== "boolean")
                    return "isNew: boolean expected";
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl")) {
                var error = $root.common.ObjectReference.verify(message.impl, long + 1);
                if (error)
                    return "impl." + error;
            }
            if (message.isSynced != null && Object.hasOwnProperty.call(message, "isSynced"))
                if (typeof message.isSynced !== "boolean")
                    return "isSynced: boolean expected";
            return null;
        };

        /**
         * Creates a File message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.File
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.File} File
         */
        File.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.File)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.File: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.File();
            if (object.writable != null)
                message.writable = Boolean(object.writable);
            if (object.isVersioned != null)
                message.isVersioned = Boolean(object.isVersioned);
            if (object.name != null)
                message.name = String(object.name);
            if (object.isNew != null)
                message.isNew = Boolean(object.isNew);
            if (object.impl != null) {
                if (!$util.isObject(object.impl))
                    throw TypeError(".file.File.impl: object expected");
                message.impl = $root.common.ObjectReference.fromObject(object.impl, long + 1);
            }
            if (object.isSynced != null)
                message.isSynced = Boolean(object.isSynced);
            return message;
        };

        /**
         * Creates a plain object from a File message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.File
         * @static
         * @param {file.File} message File
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        File.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.writable = false;
                object.isVersioned = false;
                object.name = "";
                object.isNew = false;
                object.impl = null;
                object.isSynced = false;
            }
            if (message.writable != null && Object.hasOwnProperty.call(message, "writable"))
                object.writable = message.writable;
            if (message.isVersioned != null && Object.hasOwnProperty.call(message, "isVersioned"))
                object.isVersioned = message.isVersioned;
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                object.name = message.name;
            if (message.isNew != null && Object.hasOwnProperty.call(message, "isNew"))
                object.isNew = message.isNew;
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl"))
                object.impl = $root.common.ObjectReference.toObject(message.impl, options, q + 1);
            if (message.isSynced != null && Object.hasOwnProperty.call(message, "isSynced"))
                object.isSynced = message.isSynced;
            return object;
        };

        /**
         * Converts this File to JSON.
         * @function toJSON
         * @memberof file.File
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        File.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for File
         * @function getTypeUrl
         * @memberof file.File
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        File.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.File";
        };

        return File;
    })();

    file.SyncStatusMsg = (function() {

        /**
         * Properties of a SyncStatusMsg.
         * @memberof file
         * @interface ISyncStatusMsg
         * @property {string|null} [state] SyncStatusMsg state
         * @property {file.ISyncVersionsBranchMsg|null} [local] SyncStatusMsg local
         * @property {file.ISyncVersionsBranchMsg|null} [synced] SyncStatusMsg synced
         * @property {file.ISyncVersionsBranchMsg|null} [remote] SyncStatusMsg remote
         * @property {common.IBooleanValue|null} [existsInSyncedParent] SyncStatusMsg existsInSyncedParent
         * @property {file.IUploadingStateMsg|null} [uploading] SyncStatusMsg uploading
         */

        /**
         * Constructs a new SyncStatusMsg.
         * @memberof file
         * @classdesc Represents a SyncStatusMsg.
         * @implements ISyncStatusMsg
         * @constructor
         * @param {file.ISyncStatusMsg=} [properties] Properties to set
         */
        function SyncStatusMsg(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * SyncStatusMsg state.
         * @member {string} state
         * @memberof file.SyncStatusMsg
         * @instance
         */
        SyncStatusMsg.prototype.state = "";

        /**
         * SyncStatusMsg local.
         * @member {file.ISyncVersionsBranchMsg|null|undefined} local
         * @memberof file.SyncStatusMsg
         * @instance
         */
        SyncStatusMsg.prototype.local = null;

        /**
         * SyncStatusMsg synced.
         * @member {file.ISyncVersionsBranchMsg|null|undefined} synced
         * @memberof file.SyncStatusMsg
         * @instance
         */
        SyncStatusMsg.prototype.synced = null;

        /**
         * SyncStatusMsg remote.
         * @member {file.ISyncVersionsBranchMsg|null|undefined} remote
         * @memberof file.SyncStatusMsg
         * @instance
         */
        SyncStatusMsg.prototype.remote = null;

        /**
         * SyncStatusMsg existsInSyncedParent.
         * @member {common.IBooleanValue|null|undefined} existsInSyncedParent
         * @memberof file.SyncStatusMsg
         * @instance
         */
        SyncStatusMsg.prototype.existsInSyncedParent = null;

        /**
         * SyncStatusMsg uploading.
         * @member {file.IUploadingStateMsg|null|undefined} uploading
         * @memberof file.SyncStatusMsg
         * @instance
         */
        SyncStatusMsg.prototype.uploading = null;

        /**
         * Creates a new SyncStatusMsg instance using the specified properties.
         * @function create
         * @memberof file.SyncStatusMsg
         * @static
         * @param {file.ISyncStatusMsg=} [properties] Properties to set
         * @returns {file.SyncStatusMsg} SyncStatusMsg instance
         */
        SyncStatusMsg.create = function create(properties) {
            return new SyncStatusMsg(properties);
        };

        /**
         * Encodes the specified SyncStatusMsg message. Does not implicitly {@link file.SyncStatusMsg.verify|verify} messages.
         * @function encode
         * @memberof file.SyncStatusMsg
         * @static
         * @param {file.ISyncStatusMsg} message SyncStatusMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SyncStatusMsg.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.state != null && Object.hasOwnProperty.call(message, "state"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.state);
            if (message.local != null && Object.hasOwnProperty.call(message, "local"))
                $root.file.SyncVersionsBranchMsg.encode(message.local, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.synced != null && Object.hasOwnProperty.call(message, "synced"))
                $root.file.SyncVersionsBranchMsg.encode(message.synced, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                $root.file.SyncVersionsBranchMsg.encode(message.remote, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            if (message.existsInSyncedParent != null && Object.hasOwnProperty.call(message, "existsInSyncedParent"))
                $root.common.BooleanValue.encode(message.existsInSyncedParent, writer.uint32(/* id 5, wireType 2 =*/42).fork(), q + 1).ldelim();
            if (message.uploading != null && Object.hasOwnProperty.call(message, "uploading"))
                $root.file.UploadingStateMsg.encode(message.uploading, writer.uint32(/* id 6, wireType 2 =*/50).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified SyncStatusMsg message, length delimited. Does not implicitly {@link file.SyncStatusMsg.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.SyncStatusMsg
         * @static
         * @param {file.ISyncStatusMsg} message SyncStatusMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SyncStatusMsg.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a SyncStatusMsg message from the specified reader or buffer.
         * @function decode
         * @memberof file.SyncStatusMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.SyncStatusMsg} SyncStatusMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SyncStatusMsg.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.SyncStatusMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.state = reader.string();
                        break;
                    }
                case 2: {
                        message.local = $root.file.SyncVersionsBranchMsg.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.synced = $root.file.SyncVersionsBranchMsg.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.remote = $root.file.SyncVersionsBranchMsg.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 5: {
                        message.existsInSyncedParent = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 6: {
                        message.uploading = $root.file.UploadingStateMsg.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a SyncStatusMsg message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.SyncStatusMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.SyncStatusMsg} SyncStatusMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SyncStatusMsg.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a SyncStatusMsg message.
         * @function verify
         * @memberof file.SyncStatusMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        SyncStatusMsg.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.state != null && Object.hasOwnProperty.call(message, "state"))
                if (!$util.isString(message.state))
                    return "state: string expected";
            if (message.local != null && Object.hasOwnProperty.call(message, "local")) {
                var error = $root.file.SyncVersionsBranchMsg.verify(message.local, long + 1);
                if (error)
                    return "local." + error;
            }
            if (message.synced != null && Object.hasOwnProperty.call(message, "synced")) {
                var error = $root.file.SyncVersionsBranchMsg.verify(message.synced, long + 1);
                if (error)
                    return "synced." + error;
            }
            if (message.remote != null && Object.hasOwnProperty.call(message, "remote")) {
                var error = $root.file.SyncVersionsBranchMsg.verify(message.remote, long + 1);
                if (error)
                    return "remote." + error;
            }
            if (message.existsInSyncedParent != null && Object.hasOwnProperty.call(message, "existsInSyncedParent")) {
                var error = $root.common.BooleanValue.verify(message.existsInSyncedParent, long + 1);
                if (error)
                    return "existsInSyncedParent." + error;
            }
            if (message.uploading != null && Object.hasOwnProperty.call(message, "uploading")) {
                var error = $root.file.UploadingStateMsg.verify(message.uploading, long + 1);
                if (error)
                    return "uploading." + error;
            }
            return null;
        };

        /**
         * Creates a SyncStatusMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.SyncStatusMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.SyncStatusMsg} SyncStatusMsg
         */
        SyncStatusMsg.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.SyncStatusMsg)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.SyncStatusMsg: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.SyncStatusMsg();
            if (object.state != null)
                message.state = String(object.state);
            if (object.local != null) {
                if (!$util.isObject(object.local))
                    throw TypeError(".file.SyncStatusMsg.local: object expected");
                message.local = $root.file.SyncVersionsBranchMsg.fromObject(object.local, long + 1);
            }
            if (object.synced != null) {
                if (!$util.isObject(object.synced))
                    throw TypeError(".file.SyncStatusMsg.synced: object expected");
                message.synced = $root.file.SyncVersionsBranchMsg.fromObject(object.synced, long + 1);
            }
            if (object.remote != null) {
                if (!$util.isObject(object.remote))
                    throw TypeError(".file.SyncStatusMsg.remote: object expected");
                message.remote = $root.file.SyncVersionsBranchMsg.fromObject(object.remote, long + 1);
            }
            if (object.existsInSyncedParent != null) {
                if (!$util.isObject(object.existsInSyncedParent))
                    throw TypeError(".file.SyncStatusMsg.existsInSyncedParent: object expected");
                message.existsInSyncedParent = $root.common.BooleanValue.fromObject(object.existsInSyncedParent, long + 1);
            }
            if (object.uploading != null) {
                if (!$util.isObject(object.uploading))
                    throw TypeError(".file.SyncStatusMsg.uploading: object expected");
                message.uploading = $root.file.UploadingStateMsg.fromObject(object.uploading, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a SyncStatusMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.SyncStatusMsg
         * @static
         * @param {file.SyncStatusMsg} message SyncStatusMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        SyncStatusMsg.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.state = "";
                object.local = null;
                object.synced = null;
                object.remote = null;
                object.existsInSyncedParent = null;
                object.uploading = null;
            }
            if (message.state != null && Object.hasOwnProperty.call(message, "state"))
                object.state = message.state;
            if (message.local != null && Object.hasOwnProperty.call(message, "local"))
                object.local = $root.file.SyncVersionsBranchMsg.toObject(message.local, options, q + 1);
            if (message.synced != null && Object.hasOwnProperty.call(message, "synced"))
                object.synced = $root.file.SyncVersionsBranchMsg.toObject(message.synced, options, q + 1);
            if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                object.remote = $root.file.SyncVersionsBranchMsg.toObject(message.remote, options, q + 1);
            if (message.existsInSyncedParent != null && Object.hasOwnProperty.call(message, "existsInSyncedParent"))
                object.existsInSyncedParent = $root.common.BooleanValue.toObject(message.existsInSyncedParent, options, q + 1);
            if (message.uploading != null && Object.hasOwnProperty.call(message, "uploading"))
                object.uploading = $root.file.UploadingStateMsg.toObject(message.uploading, options, q + 1);
            return object;
        };

        /**
         * Converts this SyncStatusMsg to JSON.
         * @function toJSON
         * @memberof file.SyncStatusMsg
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        SyncStatusMsg.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for SyncStatusMsg
         * @function getTypeUrl
         * @memberof file.SyncStatusMsg
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        SyncStatusMsg.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.SyncStatusMsg";
        };

        return SyncStatusMsg;
    })();

    file.SyncVersionsBranchMsg = (function() {

        /**
         * Properties of a SyncVersionsBranchMsg.
         * @memberof file
         * @interface ISyncVersionsBranchMsg
         * @property {common.IUInt64Value|null} [latest] SyncVersionsBranchMsg latest
         * @property {Array.<number|Long>|null} [archived] SyncVersionsBranchMsg archived
         * @property {common.IBooleanValue|null} [isArchived] SyncVersionsBranchMsg isArchived
         */

        /**
         * Constructs a new SyncVersionsBranchMsg.
         * @memberof file
         * @classdesc Represents a SyncVersionsBranchMsg.
         * @implements ISyncVersionsBranchMsg
         * @constructor
         * @param {file.ISyncVersionsBranchMsg=} [properties] Properties to set
         */
        function SyncVersionsBranchMsg(properties) {
            this.archived = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * SyncVersionsBranchMsg latest.
         * @member {common.IUInt64Value|null|undefined} latest
         * @memberof file.SyncVersionsBranchMsg
         * @instance
         */
        SyncVersionsBranchMsg.prototype.latest = null;

        /**
         * SyncVersionsBranchMsg archived.
         * @member {Array.<number|Long>} archived
         * @memberof file.SyncVersionsBranchMsg
         * @instance
         */
        SyncVersionsBranchMsg.prototype.archived = $util.emptyArray;

        /**
         * SyncVersionsBranchMsg isArchived.
         * @member {common.IBooleanValue|null|undefined} isArchived
         * @memberof file.SyncVersionsBranchMsg
         * @instance
         */
        SyncVersionsBranchMsg.prototype.isArchived = null;

        /**
         * Creates a new SyncVersionsBranchMsg instance using the specified properties.
         * @function create
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {file.ISyncVersionsBranchMsg=} [properties] Properties to set
         * @returns {file.SyncVersionsBranchMsg} SyncVersionsBranchMsg instance
         */
        SyncVersionsBranchMsg.create = function create(properties) {
            return new SyncVersionsBranchMsg(properties);
        };

        /**
         * Encodes the specified SyncVersionsBranchMsg message. Does not implicitly {@link file.SyncVersionsBranchMsg.verify|verify} messages.
         * @function encode
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {file.ISyncVersionsBranchMsg} message SyncVersionsBranchMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SyncVersionsBranchMsg.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.latest != null && Object.hasOwnProperty.call(message, "latest"))
                $root.common.UInt64Value.encode(message.latest, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.archived != null && message.archived.length) {
                writer.uint32(/* id 2, wireType 2 =*/18).fork();
                for (var i = 0; i < message.archived.length; ++i)
                    writer.uint64(message.archived[i]);
                writer.ldelim();
            }
            if (message.isArchived != null && Object.hasOwnProperty.call(message, "isArchived"))
                $root.common.BooleanValue.encode(message.isArchived, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified SyncVersionsBranchMsg message, length delimited. Does not implicitly {@link file.SyncVersionsBranchMsg.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {file.ISyncVersionsBranchMsg} message SyncVersionsBranchMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SyncVersionsBranchMsg.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a SyncVersionsBranchMsg message from the specified reader or buffer.
         * @function decode
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.SyncVersionsBranchMsg} SyncVersionsBranchMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SyncVersionsBranchMsg.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.SyncVersionsBranchMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.latest = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        if (!(message.archived && message.archived.length))
                            message.archived = [];
                        if ((tag & 7) === 2) {
                            var end2 = reader.uint32() + reader.pos;
                            while (reader.pos < end2)
                                message.archived.push(reader.uint64());
                        } else
                            message.archived.push(reader.uint64());
                        break;
                    }
                case 3: {
                        message.isArchived = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a SyncVersionsBranchMsg message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.SyncVersionsBranchMsg} SyncVersionsBranchMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SyncVersionsBranchMsg.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a SyncVersionsBranchMsg message.
         * @function verify
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        SyncVersionsBranchMsg.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.latest != null && Object.hasOwnProperty.call(message, "latest")) {
                var error = $root.common.UInt64Value.verify(message.latest, long + 1);
                if (error)
                    return "latest." + error;
            }
            if (message.archived != null && Object.hasOwnProperty.call(message, "archived")) {
                if (!Array.isArray(message.archived))
                    return "archived: array expected";
                for (var i = 0; i < message.archived.length; ++i)
                    if (!$util.isInteger(message.archived[i]) && !(message.archived[i] && $util.isInteger(message.archived[i].low) && $util.isInteger(message.archived[i].high)))
                        return "archived: integer|Long[] expected";
            }
            if (message.isArchived != null && Object.hasOwnProperty.call(message, "isArchived")) {
                var error = $root.common.BooleanValue.verify(message.isArchived, long + 1);
                if (error)
                    return "isArchived." + error;
            }
            return null;
        };

        /**
         * Creates a SyncVersionsBranchMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.SyncVersionsBranchMsg} SyncVersionsBranchMsg
         */
        SyncVersionsBranchMsg.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.SyncVersionsBranchMsg)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.SyncVersionsBranchMsg: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.SyncVersionsBranchMsg();
            if (object.latest != null) {
                if (!$util.isObject(object.latest))
                    throw TypeError(".file.SyncVersionsBranchMsg.latest: object expected");
                message.latest = $root.common.UInt64Value.fromObject(object.latest, long + 1);
            }
            if (object.archived) {
                if (!Array.isArray(object.archived))
                    throw TypeError(".file.SyncVersionsBranchMsg.archived: array expected");
                message.archived = [];
                for (var i = 0; i < object.archived.length; ++i)
                    if ($util.Long)
                        message.archived[i] = $util.Long.fromValue(object.archived[i], true);
                    else if (typeof object.archived[i] === "string")
                        message.archived[i] = parseInt(object.archived[i], 10);
                    else if (typeof object.archived[i] === "number")
                        message.archived[i] = object.archived[i];
                    else if (typeof object.archived[i] === "object")
                        message.archived[i] = new $util.LongBits(object.archived[i].low >>> 0, object.archived[i].high >>> 0).toNumber(true);
            }
            if (object.isArchived != null) {
                if (!$util.isObject(object.isArchived))
                    throw TypeError(".file.SyncVersionsBranchMsg.isArchived: object expected");
                message.isArchived = $root.common.BooleanValue.fromObject(object.isArchived, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a SyncVersionsBranchMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {file.SyncVersionsBranchMsg} message SyncVersionsBranchMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        SyncVersionsBranchMsg.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.archived = [];
            if (options.defaults) {
                object.latest = null;
                object.isArchived = null;
            }
            if (message.latest != null && Object.hasOwnProperty.call(message, "latest"))
                object.latest = $root.common.UInt64Value.toObject(message.latest, options, q + 1);
            if (message.archived && message.archived.length) {
                object.archived = [];
                for (var j = 0; j < message.archived.length; ++j)
                    if (typeof BigInt !== "undefined" && options.longs === BigInt)
                        object.archived[j] = typeof message.archived[j] === "number" ? BigInt(message.archived[j]) : $util.Long.fromBits(message.archived[j].low >>> 0, message.archived[j].high >>> 0, true).toBigInt();
                    else if (typeof message.archived[j] === "number")
                        object.archived[j] = options.longs === String ? String(message.archived[j]) : message.archived[j];
                    else
                        object.archived[j] = options.longs === String ? $util.Long.prototype.toString.call(message.archived[j]) : options.longs === Number ? new $util.LongBits(message.archived[j].low >>> 0, message.archived[j].high >>> 0).toNumber(true) : message.archived[j];
            }
            if (message.isArchived != null && Object.hasOwnProperty.call(message, "isArchived"))
                object.isArchived = $root.common.BooleanValue.toObject(message.isArchived, options, q + 1);
            return object;
        };

        /**
         * Converts this SyncVersionsBranchMsg to JSON.
         * @function toJSON
         * @memberof file.SyncVersionsBranchMsg
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        SyncVersionsBranchMsg.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for SyncVersionsBranchMsg
         * @function getTypeUrl
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        SyncVersionsBranchMsg.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.SyncVersionsBranchMsg";
        };

        return SyncVersionsBranchMsg;
    })();

    file.UploadingStateMsg = (function() {

        /**
         * Properties of an UploadingStateMsg.
         * @memberof file
         * @interface IUploadingStateMsg
         * @property {number|Long|null} [localVersion] UploadingStateMsg localVersion
         * @property {number|Long|null} [remoteVersion] UploadingStateMsg remoteVersion
         * @property {number|Long|null} [bytesLeftToUpload] UploadingStateMsg bytesLeftToUpload
         * @property {boolean|null} [uploadStarted] UploadingStateMsg uploadStarted
         */

        /**
         * Constructs a new UploadingStateMsg.
         * @memberof file
         * @classdesc Represents an UploadingStateMsg.
         * @implements IUploadingStateMsg
         * @constructor
         * @param {file.IUploadingStateMsg=} [properties] Properties to set
         */
        function UploadingStateMsg(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * UploadingStateMsg localVersion.
         * @member {number|Long} localVersion
         * @memberof file.UploadingStateMsg
         * @instance
         */
        UploadingStateMsg.prototype.localVersion = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * UploadingStateMsg remoteVersion.
         * @member {number|Long} remoteVersion
         * @memberof file.UploadingStateMsg
         * @instance
         */
        UploadingStateMsg.prototype.remoteVersion = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * UploadingStateMsg bytesLeftToUpload.
         * @member {number|Long} bytesLeftToUpload
         * @memberof file.UploadingStateMsg
         * @instance
         */
        UploadingStateMsg.prototype.bytesLeftToUpload = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * UploadingStateMsg uploadStarted.
         * @member {boolean} uploadStarted
         * @memberof file.UploadingStateMsg
         * @instance
         */
        UploadingStateMsg.prototype.uploadStarted = false;

        /**
         * Creates a new UploadingStateMsg instance using the specified properties.
         * @function create
         * @memberof file.UploadingStateMsg
         * @static
         * @param {file.IUploadingStateMsg=} [properties] Properties to set
         * @returns {file.UploadingStateMsg} UploadingStateMsg instance
         */
        UploadingStateMsg.create = function create(properties) {
            return new UploadingStateMsg(properties);
        };

        /**
         * Encodes the specified UploadingStateMsg message. Does not implicitly {@link file.UploadingStateMsg.verify|verify} messages.
         * @function encode
         * @memberof file.UploadingStateMsg
         * @static
         * @param {file.IUploadingStateMsg} message UploadingStateMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UploadingStateMsg.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.localVersion);
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.remoteVersion);
            if (message.bytesLeftToUpload != null && Object.hasOwnProperty.call(message, "bytesLeftToUpload"))
                writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.bytesLeftToUpload);
            if (message.uploadStarted != null && Object.hasOwnProperty.call(message, "uploadStarted"))
                writer.uint32(/* id 4, wireType 0 =*/32).bool(message.uploadStarted);
            return writer;
        };

        /**
         * Encodes the specified UploadingStateMsg message, length delimited. Does not implicitly {@link file.UploadingStateMsg.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.UploadingStateMsg
         * @static
         * @param {file.IUploadingStateMsg} message UploadingStateMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UploadingStateMsg.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an UploadingStateMsg message from the specified reader or buffer.
         * @function decode
         * @memberof file.UploadingStateMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.UploadingStateMsg} UploadingStateMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UploadingStateMsg.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.UploadingStateMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.localVersion = reader.uint64();
                        break;
                    }
                case 2: {
                        message.remoteVersion = reader.uint64();
                        break;
                    }
                case 3: {
                        message.bytesLeftToUpload = reader.uint64();
                        break;
                    }
                case 4: {
                        message.uploadStarted = reader.bool();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an UploadingStateMsg message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.UploadingStateMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.UploadingStateMsg} UploadingStateMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UploadingStateMsg.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an UploadingStateMsg message.
         * @function verify
         * @memberof file.UploadingStateMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        UploadingStateMsg.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                if (!$util.isInteger(message.localVersion) && !(message.localVersion && $util.isInteger(message.localVersion.low) && $util.isInteger(message.localVersion.high)))
                    return "localVersion: integer|Long expected";
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                if (!$util.isInteger(message.remoteVersion) && !(message.remoteVersion && $util.isInteger(message.remoteVersion.low) && $util.isInteger(message.remoteVersion.high)))
                    return "remoteVersion: integer|Long expected";
            if (message.bytesLeftToUpload != null && Object.hasOwnProperty.call(message, "bytesLeftToUpload"))
                if (!$util.isInteger(message.bytesLeftToUpload) && !(message.bytesLeftToUpload && $util.isInteger(message.bytesLeftToUpload.low) && $util.isInteger(message.bytesLeftToUpload.high)))
                    return "bytesLeftToUpload: integer|Long expected";
            if (message.uploadStarted != null && Object.hasOwnProperty.call(message, "uploadStarted"))
                if (typeof message.uploadStarted !== "boolean")
                    return "uploadStarted: boolean expected";
            return null;
        };

        /**
         * Creates an UploadingStateMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.UploadingStateMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.UploadingStateMsg} UploadingStateMsg
         */
        UploadingStateMsg.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.UploadingStateMsg)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.UploadingStateMsg: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.UploadingStateMsg();
            if (object.localVersion != null)
                if ($util.Long)
                    message.localVersion = $util.Long.fromValue(object.localVersion, true);
                else if (typeof object.localVersion === "string")
                    message.localVersion = parseInt(object.localVersion, 10);
                else if (typeof object.localVersion === "number")
                    message.localVersion = object.localVersion;
                else if (typeof object.localVersion === "object")
                    message.localVersion = new $util.LongBits(object.localVersion.low >>> 0, object.localVersion.high >>> 0).toNumber(true);
            if (object.remoteVersion != null)
                if ($util.Long)
                    message.remoteVersion = $util.Long.fromValue(object.remoteVersion, true);
                else if (typeof object.remoteVersion === "string")
                    message.remoteVersion = parseInt(object.remoteVersion, 10);
                else if (typeof object.remoteVersion === "number")
                    message.remoteVersion = object.remoteVersion;
                else if (typeof object.remoteVersion === "object")
                    message.remoteVersion = new $util.LongBits(object.remoteVersion.low >>> 0, object.remoteVersion.high >>> 0).toNumber(true);
            if (object.bytesLeftToUpload != null)
                if ($util.Long)
                    message.bytesLeftToUpload = $util.Long.fromValue(object.bytesLeftToUpload, true);
                else if (typeof object.bytesLeftToUpload === "string")
                    message.bytesLeftToUpload = parseInt(object.bytesLeftToUpload, 10);
                else if (typeof object.bytesLeftToUpload === "number")
                    message.bytesLeftToUpload = object.bytesLeftToUpload;
                else if (typeof object.bytesLeftToUpload === "object")
                    message.bytesLeftToUpload = new $util.LongBits(object.bytesLeftToUpload.low >>> 0, object.bytesLeftToUpload.high >>> 0).toNumber(true);
            if (object.uploadStarted != null)
                message.uploadStarted = Boolean(object.uploadStarted);
            return message;
        };

        /**
         * Creates a plain object from an UploadingStateMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.UploadingStateMsg
         * @static
         * @param {file.UploadingStateMsg} message UploadingStateMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        UploadingStateMsg.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.localVersion = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.localVersion = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.remoteVersion = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.remoteVersion = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.bytesLeftToUpload = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.bytesLeftToUpload = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.uploadStarted = false;
            }
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.localVersion = typeof message.localVersion === "number" ? BigInt(message.localVersion) : $util.Long.fromBits(message.localVersion.low >>> 0, message.localVersion.high >>> 0, true).toBigInt();
                else if (typeof message.localVersion === "number")
                    object.localVersion = options.longs === String ? String(message.localVersion) : message.localVersion;
                else
                    object.localVersion = options.longs === String ? $util.Long.prototype.toString.call(message.localVersion) : options.longs === Number ? new $util.LongBits(message.localVersion.low >>> 0, message.localVersion.high >>> 0).toNumber(true) : message.localVersion;
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.remoteVersion = typeof message.remoteVersion === "number" ? BigInt(message.remoteVersion) : $util.Long.fromBits(message.remoteVersion.low >>> 0, message.remoteVersion.high >>> 0, true).toBigInt();
                else if (typeof message.remoteVersion === "number")
                    object.remoteVersion = options.longs === String ? String(message.remoteVersion) : message.remoteVersion;
                else
                    object.remoteVersion = options.longs === String ? $util.Long.prototype.toString.call(message.remoteVersion) : options.longs === Number ? new $util.LongBits(message.remoteVersion.low >>> 0, message.remoteVersion.high >>> 0).toNumber(true) : message.remoteVersion;
            if (message.bytesLeftToUpload != null && Object.hasOwnProperty.call(message, "bytesLeftToUpload"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.bytesLeftToUpload = typeof message.bytesLeftToUpload === "number" ? BigInt(message.bytesLeftToUpload) : $util.Long.fromBits(message.bytesLeftToUpload.low >>> 0, message.bytesLeftToUpload.high >>> 0, true).toBigInt();
                else if (typeof message.bytesLeftToUpload === "number")
                    object.bytesLeftToUpload = options.longs === String ? String(message.bytesLeftToUpload) : message.bytesLeftToUpload;
                else
                    object.bytesLeftToUpload = options.longs === String ? $util.Long.prototype.toString.call(message.bytesLeftToUpload) : options.longs === Number ? new $util.LongBits(message.bytesLeftToUpload.low >>> 0, message.bytesLeftToUpload.high >>> 0).toNumber(true) : message.bytesLeftToUpload;
            if (message.uploadStarted != null && Object.hasOwnProperty.call(message, "uploadStarted"))
                object.uploadStarted = message.uploadStarted;
            return object;
        };

        /**
         * Converts this UploadingStateMsg to JSON.
         * @function toJSON
         * @memberof file.UploadingStateMsg
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        UploadingStateMsg.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for UploadingStateMsg
         * @function getTypeUrl
         * @memberof file.UploadingStateMsg
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        UploadingStateMsg.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.UploadingStateMsg";
        };

        return UploadingStateMsg;
    })();

    file.StatsMsg = (function() {

        /**
         * Properties of a StatsMsg.
         * @memberof file
         * @interface IStatsMsg
         * @property {common.IBooleanValue|null} [isFile] StatsMsg isFile
         * @property {common.IBooleanValue|null} [isFolder] StatsMsg isFolder
         * @property {common.IBooleanValue|null} [isLink] StatsMsg isLink
         * @property {boolean|null} [writable] StatsMsg writable
         * @property {common.IUInt64Value|null} [size] StatsMsg size
         * @property {common.IUInt64Value|null} [mtime] StatsMsg mtime
         * @property {common.IUInt64Value|null} [ctime] StatsMsg ctime
         * @property {common.IUInt64Value|null} [version] StatsMsg version
         * @property {common.IUInt64Value|null} [bytesNeedDownload] StatsMsg bytesNeedDownload
         * @property {common.IStringValue|null} [versionSyncBranch] StatsMsg versionSyncBranch
         */

        /**
         * Constructs a new StatsMsg.
         * @memberof file
         * @classdesc Represents a StatsMsg.
         * @implements IStatsMsg
         * @constructor
         * @param {file.IStatsMsg=} [properties] Properties to set
         */
        function StatsMsg(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * StatsMsg isFile.
         * @member {common.IBooleanValue|null|undefined} isFile
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.isFile = null;

        /**
         * StatsMsg isFolder.
         * @member {common.IBooleanValue|null|undefined} isFolder
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.isFolder = null;

        /**
         * StatsMsg isLink.
         * @member {common.IBooleanValue|null|undefined} isLink
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.isLink = null;

        /**
         * StatsMsg writable.
         * @member {boolean} writable
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.writable = false;

        /**
         * StatsMsg size.
         * @member {common.IUInt64Value|null|undefined} size
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.size = null;

        /**
         * StatsMsg mtime.
         * @member {common.IUInt64Value|null|undefined} mtime
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.mtime = null;

        /**
         * StatsMsg ctime.
         * @member {common.IUInt64Value|null|undefined} ctime
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.ctime = null;

        /**
         * StatsMsg version.
         * @member {common.IUInt64Value|null|undefined} version
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.version = null;

        /**
         * StatsMsg bytesNeedDownload.
         * @member {common.IUInt64Value|null|undefined} bytesNeedDownload
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.bytesNeedDownload = null;

        /**
         * StatsMsg versionSyncBranch.
         * @member {common.IStringValue|null|undefined} versionSyncBranch
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.versionSyncBranch = null;

        /**
         * Creates a new StatsMsg instance using the specified properties.
         * @function create
         * @memberof file.StatsMsg
         * @static
         * @param {file.IStatsMsg=} [properties] Properties to set
         * @returns {file.StatsMsg} StatsMsg instance
         */
        StatsMsg.create = function create(properties) {
            return new StatsMsg(properties);
        };

        /**
         * Encodes the specified StatsMsg message. Does not implicitly {@link file.StatsMsg.verify|verify} messages.
         * @function encode
         * @memberof file.StatsMsg
         * @static
         * @param {file.IStatsMsg} message StatsMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StatsMsg.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                $root.common.BooleanValue.encode(message.isFile, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                $root.common.BooleanValue.encode(message.isFolder, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink"))
                $root.common.BooleanValue.encode(message.isLink, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.writable != null && Object.hasOwnProperty.call(message, "writable"))
                writer.uint32(/* id 4, wireType 0 =*/32).bool(message.writable);
            if (message.size != null && Object.hasOwnProperty.call(message, "size"))
                $root.common.UInt64Value.encode(message.size, writer.uint32(/* id 5, wireType 2 =*/42).fork(), q + 1).ldelim();
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime"))
                $root.common.UInt64Value.encode(message.mtime, writer.uint32(/* id 6, wireType 2 =*/50).fork(), q + 1).ldelim();
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime"))
                $root.common.UInt64Value.encode(message.ctime, writer.uint32(/* id 7, wireType 2 =*/58).fork(), q + 1).ldelim();
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                $root.common.UInt64Value.encode(message.version, writer.uint32(/* id 8, wireType 2 =*/66).fork(), q + 1).ldelim();
            if (message.bytesNeedDownload != null && Object.hasOwnProperty.call(message, "bytesNeedDownload"))
                $root.common.UInt64Value.encode(message.bytesNeedDownload, writer.uint32(/* id 9, wireType 2 =*/74).fork(), q + 1).ldelim();
            if (message.versionSyncBranch != null && Object.hasOwnProperty.call(message, "versionSyncBranch"))
                $root.common.StringValue.encode(message.versionSyncBranch, writer.uint32(/* id 10, wireType 2 =*/82).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified StatsMsg message, length delimited. Does not implicitly {@link file.StatsMsg.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.StatsMsg
         * @static
         * @param {file.IStatsMsg} message StatsMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StatsMsg.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a StatsMsg message from the specified reader or buffer.
         * @function decode
         * @memberof file.StatsMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.StatsMsg} StatsMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StatsMsg.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.StatsMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.isFile = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.isFolder = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.isLink = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.writable = reader.bool();
                        break;
                    }
                case 5: {
                        message.size = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 6: {
                        message.mtime = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 7: {
                        message.ctime = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 8: {
                        message.version = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 9: {
                        message.bytesNeedDownload = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 10: {
                        message.versionSyncBranch = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a StatsMsg message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.StatsMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.StatsMsg} StatsMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StatsMsg.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a StatsMsg message.
         * @function verify
         * @memberof file.StatsMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        StatsMsg.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile")) {
                var error = $root.common.BooleanValue.verify(message.isFile, long + 1);
                if (error)
                    return "isFile." + error;
            }
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder")) {
                var error = $root.common.BooleanValue.verify(message.isFolder, long + 1);
                if (error)
                    return "isFolder." + error;
            }
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink")) {
                var error = $root.common.BooleanValue.verify(message.isLink, long + 1);
                if (error)
                    return "isLink." + error;
            }
            if (message.writable != null && Object.hasOwnProperty.call(message, "writable"))
                if (typeof message.writable !== "boolean")
                    return "writable: boolean expected";
            if (message.size != null && Object.hasOwnProperty.call(message, "size")) {
                var error = $root.common.UInt64Value.verify(message.size, long + 1);
                if (error)
                    return "size." + error;
            }
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime")) {
                var error = $root.common.UInt64Value.verify(message.mtime, long + 1);
                if (error)
                    return "mtime." + error;
            }
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime")) {
                var error = $root.common.UInt64Value.verify(message.ctime, long + 1);
                if (error)
                    return "ctime." + error;
            }
            if (message.version != null && Object.hasOwnProperty.call(message, "version")) {
                var error = $root.common.UInt64Value.verify(message.version, long + 1);
                if (error)
                    return "version." + error;
            }
            if (message.bytesNeedDownload != null && Object.hasOwnProperty.call(message, "bytesNeedDownload")) {
                var error = $root.common.UInt64Value.verify(message.bytesNeedDownload, long + 1);
                if (error)
                    return "bytesNeedDownload." + error;
            }
            if (message.versionSyncBranch != null && Object.hasOwnProperty.call(message, "versionSyncBranch")) {
                var error = $root.common.StringValue.verify(message.versionSyncBranch, long + 1);
                if (error)
                    return "versionSyncBranch." + error;
            }
            return null;
        };

        /**
         * Creates a StatsMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.StatsMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.StatsMsg} StatsMsg
         */
        StatsMsg.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.StatsMsg)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.StatsMsg: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.StatsMsg();
            if (object.isFile != null) {
                if (!$util.isObject(object.isFile))
                    throw TypeError(".file.StatsMsg.isFile: object expected");
                message.isFile = $root.common.BooleanValue.fromObject(object.isFile, long + 1);
            }
            if (object.isFolder != null) {
                if (!$util.isObject(object.isFolder))
                    throw TypeError(".file.StatsMsg.isFolder: object expected");
                message.isFolder = $root.common.BooleanValue.fromObject(object.isFolder, long + 1);
            }
            if (object.isLink != null) {
                if (!$util.isObject(object.isLink))
                    throw TypeError(".file.StatsMsg.isLink: object expected");
                message.isLink = $root.common.BooleanValue.fromObject(object.isLink, long + 1);
            }
            if (object.writable != null)
                message.writable = Boolean(object.writable);
            if (object.size != null) {
                if (!$util.isObject(object.size))
                    throw TypeError(".file.StatsMsg.size: object expected");
                message.size = $root.common.UInt64Value.fromObject(object.size, long + 1);
            }
            if (object.mtime != null) {
                if (!$util.isObject(object.mtime))
                    throw TypeError(".file.StatsMsg.mtime: object expected");
                message.mtime = $root.common.UInt64Value.fromObject(object.mtime, long + 1);
            }
            if (object.ctime != null) {
                if (!$util.isObject(object.ctime))
                    throw TypeError(".file.StatsMsg.ctime: object expected");
                message.ctime = $root.common.UInt64Value.fromObject(object.ctime, long + 1);
            }
            if (object.version != null) {
                if (!$util.isObject(object.version))
                    throw TypeError(".file.StatsMsg.version: object expected");
                message.version = $root.common.UInt64Value.fromObject(object.version, long + 1);
            }
            if (object.bytesNeedDownload != null) {
                if (!$util.isObject(object.bytesNeedDownload))
                    throw TypeError(".file.StatsMsg.bytesNeedDownload: object expected");
                message.bytesNeedDownload = $root.common.UInt64Value.fromObject(object.bytesNeedDownload, long + 1);
            }
            if (object.versionSyncBranch != null) {
                if (!$util.isObject(object.versionSyncBranch))
                    throw TypeError(".file.StatsMsg.versionSyncBranch: object expected");
                message.versionSyncBranch = $root.common.StringValue.fromObject(object.versionSyncBranch, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a StatsMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.StatsMsg
         * @static
         * @param {file.StatsMsg} message StatsMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        StatsMsg.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.isFile = null;
                object.isFolder = null;
                object.isLink = null;
                object.writable = false;
                object.size = null;
                object.mtime = null;
                object.ctime = null;
                object.version = null;
                object.bytesNeedDownload = null;
                object.versionSyncBranch = null;
            }
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                object.isFile = $root.common.BooleanValue.toObject(message.isFile, options, q + 1);
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                object.isFolder = $root.common.BooleanValue.toObject(message.isFolder, options, q + 1);
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink"))
                object.isLink = $root.common.BooleanValue.toObject(message.isLink, options, q + 1);
            if (message.writable != null && Object.hasOwnProperty.call(message, "writable"))
                object.writable = message.writable;
            if (message.size != null && Object.hasOwnProperty.call(message, "size"))
                object.size = $root.common.UInt64Value.toObject(message.size, options, q + 1);
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime"))
                object.mtime = $root.common.UInt64Value.toObject(message.mtime, options, q + 1);
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime"))
                object.ctime = $root.common.UInt64Value.toObject(message.ctime, options, q + 1);
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                object.version = $root.common.UInt64Value.toObject(message.version, options, q + 1);
            if (message.bytesNeedDownload != null && Object.hasOwnProperty.call(message, "bytesNeedDownload"))
                object.bytesNeedDownload = $root.common.UInt64Value.toObject(message.bytesNeedDownload, options, q + 1);
            if (message.versionSyncBranch != null && Object.hasOwnProperty.call(message, "versionSyncBranch"))
                object.versionSyncBranch = $root.common.StringValue.toObject(message.versionSyncBranch, options, q + 1);
            return object;
        };

        /**
         * Converts this StatsMsg to JSON.
         * @function toJSON
         * @memberof file.StatsMsg
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        StatsMsg.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for StatsMsg
         * @function getTypeUrl
         * @memberof file.StatsMsg
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        StatsMsg.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.StatsMsg";
        };

        return StatsMsg;
    })();

    file.GetXAttrRequestBody = (function() {

        /**
         * Properties of a GetXAttrRequestBody.
         * @memberof file
         * @interface IGetXAttrRequestBody
         * @property {string|null} [xaName] GetXAttrRequestBody xaName
         */

        /**
         * Constructs a new GetXAttrRequestBody.
         * @memberof file
         * @classdesc Represents a GetXAttrRequestBody.
         * @implements IGetXAttrRequestBody
         * @constructor
         * @param {file.IGetXAttrRequestBody=} [properties] Properties to set
         */
        function GetXAttrRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * GetXAttrRequestBody xaName.
         * @member {string} xaName
         * @memberof file.GetXAttrRequestBody
         * @instance
         */
        GetXAttrRequestBody.prototype.xaName = "";

        /**
         * Creates a new GetXAttrRequestBody instance using the specified properties.
         * @function create
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {file.IGetXAttrRequestBody=} [properties] Properties to set
         * @returns {file.GetXAttrRequestBody} GetXAttrRequestBody instance
         */
        GetXAttrRequestBody.create = function create(properties) {
            return new GetXAttrRequestBody(properties);
        };

        /**
         * Encodes the specified GetXAttrRequestBody message. Does not implicitly {@link file.GetXAttrRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {file.IGetXAttrRequestBody} message GetXAttrRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        GetXAttrRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.xaName);
            return writer;
        };

        /**
         * Encodes the specified GetXAttrRequestBody message, length delimited. Does not implicitly {@link file.GetXAttrRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {file.IGetXAttrRequestBody} message GetXAttrRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        GetXAttrRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a GetXAttrRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.GetXAttrRequestBody} GetXAttrRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        GetXAttrRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.GetXAttrRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.xaName = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a GetXAttrRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.GetXAttrRequestBody} GetXAttrRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        GetXAttrRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a GetXAttrRequestBody message.
         * @function verify
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        GetXAttrRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                if (!$util.isString(message.xaName))
                    return "xaName: string expected";
            return null;
        };

        /**
         * Creates a GetXAttrRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.GetXAttrRequestBody} GetXAttrRequestBody
         */
        GetXAttrRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.GetXAttrRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.GetXAttrRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.GetXAttrRequestBody();
            if (object.xaName != null)
                message.xaName = String(object.xaName);
            return message;
        };

        /**
         * Creates a plain object from a GetXAttrRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {file.GetXAttrRequestBody} message GetXAttrRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        GetXAttrRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.xaName = "";
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                object.xaName = message.xaName;
            return object;
        };

        /**
         * Converts this GetXAttrRequestBody to JSON.
         * @function toJSON
         * @memberof file.GetXAttrRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        GetXAttrRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for GetXAttrRequestBody
         * @function getTypeUrl
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        GetXAttrRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.GetXAttrRequestBody";
        };

        return GetXAttrRequestBody;
    })();

    file.XAttrValue = (function() {

        /**
         * Properties of a XAttrValue.
         * @memberof file
         * @interface IXAttrValue
         * @property {common.IStringValue|null} [str] XAttrValue str
         * @property {common.IStringValue|null} [json] XAttrValue json
         * @property {common.IBytesValue|null} [bytes] XAttrValue bytes
         */

        /**
         * Constructs a new XAttrValue.
         * @memberof file
         * @classdesc Represents a XAttrValue.
         * @implements IXAttrValue
         * @constructor
         * @param {file.IXAttrValue=} [properties] Properties to set
         */
        function XAttrValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * XAttrValue str.
         * @member {common.IStringValue|null|undefined} str
         * @memberof file.XAttrValue
         * @instance
         */
        XAttrValue.prototype.str = null;

        /**
         * XAttrValue json.
         * @member {common.IStringValue|null|undefined} json
         * @memberof file.XAttrValue
         * @instance
         */
        XAttrValue.prototype.json = null;

        /**
         * XAttrValue bytes.
         * @member {common.IBytesValue|null|undefined} bytes
         * @memberof file.XAttrValue
         * @instance
         */
        XAttrValue.prototype.bytes = null;

        /**
         * Creates a new XAttrValue instance using the specified properties.
         * @function create
         * @memberof file.XAttrValue
         * @static
         * @param {file.IXAttrValue=} [properties] Properties to set
         * @returns {file.XAttrValue} XAttrValue instance
         */
        XAttrValue.create = function create(properties) {
            return new XAttrValue(properties);
        };

        /**
         * Encodes the specified XAttrValue message. Does not implicitly {@link file.XAttrValue.verify|verify} messages.
         * @function encode
         * @memberof file.XAttrValue
         * @static
         * @param {file.IXAttrValue} message XAttrValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        XAttrValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.str != null && Object.hasOwnProperty.call(message, "str"))
                $root.common.StringValue.encode(message.str, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified XAttrValue message, length delimited. Does not implicitly {@link file.XAttrValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.XAttrValue
         * @static
         * @param {file.IXAttrValue} message XAttrValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        XAttrValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a XAttrValue message from the specified reader or buffer.
         * @function decode
         * @memberof file.XAttrValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.XAttrValue} XAttrValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        XAttrValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.XAttrValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.str = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.json = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a XAttrValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.XAttrValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.XAttrValue} XAttrValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        XAttrValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a XAttrValue message.
         * @function verify
         * @memberof file.XAttrValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        XAttrValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.str != null && Object.hasOwnProperty.call(message, "str")) {
                var error = $root.common.StringValue.verify(message.str, long + 1);
                if (error)
                    return "str." + error;
            }
            if (message.json != null && Object.hasOwnProperty.call(message, "json")) {
                var error = $root.common.StringValue.verify(message.json, long + 1);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes, long + 1);
                if (error)
                    return "bytes." + error;
            }
            return null;
        };

        /**
         * Creates a XAttrValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.XAttrValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.XAttrValue} XAttrValue
         */
        XAttrValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.XAttrValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.XAttrValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.XAttrValue();
            if (object.str != null) {
                if (!$util.isObject(object.str))
                    throw TypeError(".file.XAttrValue.str: object expected");
                message.str = $root.common.StringValue.fromObject(object.str, long + 1);
            }
            if (object.json != null) {
                if (!$util.isObject(object.json))
                    throw TypeError(".file.XAttrValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json, long + 1);
            }
            if (object.bytes != null) {
                if (!$util.isObject(object.bytes))
                    throw TypeError(".file.XAttrValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a XAttrValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.XAttrValue
         * @static
         * @param {file.XAttrValue} message XAttrValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        XAttrValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.str = null;
                object.json = null;
                object.bytes = null;
            }
            if (message.str != null && Object.hasOwnProperty.call(message, "str"))
                object.str = $root.common.StringValue.toObject(message.str, options, q + 1);
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = $root.common.StringValue.toObject(message.json, options, q + 1);
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options, q + 1);
            return object;
        };

        /**
         * Converts this XAttrValue to JSON.
         * @function toJSON
         * @memberof file.XAttrValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        XAttrValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for XAttrValue
         * @function getTypeUrl
         * @memberof file.XAttrValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        XAttrValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.XAttrValue";
        };

        return XAttrValue;
    })();

    file.ReadBytesRequestBody = (function() {

        /**
         * Properties of a ReadBytesRequestBody.
         * @memberof file
         * @interface IReadBytesRequestBody
         * @property {common.IUInt64Value|null} [start] ReadBytesRequestBody start
         * @property {common.IUInt64Value|null} [end] ReadBytesRequestBody end
         */

        /**
         * Constructs a new ReadBytesRequestBody.
         * @memberof file
         * @classdesc Represents a ReadBytesRequestBody.
         * @implements IReadBytesRequestBody
         * @constructor
         * @param {file.IReadBytesRequestBody=} [properties] Properties to set
         */
        function ReadBytesRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ReadBytesRequestBody start.
         * @member {common.IUInt64Value|null|undefined} start
         * @memberof file.ReadBytesRequestBody
         * @instance
         */
        ReadBytesRequestBody.prototype.start = null;

        /**
         * ReadBytesRequestBody end.
         * @member {common.IUInt64Value|null|undefined} end
         * @memberof file.ReadBytesRequestBody
         * @instance
         */
        ReadBytesRequestBody.prototype.end = null;

        /**
         * Creates a new ReadBytesRequestBody instance using the specified properties.
         * @function create
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {file.IReadBytesRequestBody=} [properties] Properties to set
         * @returns {file.ReadBytesRequestBody} ReadBytesRequestBody instance
         */
        ReadBytesRequestBody.create = function create(properties) {
            return new ReadBytesRequestBody(properties);
        };

        /**
         * Encodes the specified ReadBytesRequestBody message. Does not implicitly {@link file.ReadBytesRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {file.IReadBytesRequestBody} message ReadBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ReadBytesRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                $root.common.UInt64Value.encode(message.start, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                $root.common.UInt64Value.encode(message.end, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified ReadBytesRequestBody message, length delimited. Does not implicitly {@link file.ReadBytesRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {file.IReadBytesRequestBody} message ReadBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ReadBytesRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a ReadBytesRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.ReadBytesRequestBody} ReadBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ReadBytesRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ReadBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.start = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.end = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a ReadBytesRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.ReadBytesRequestBody} ReadBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ReadBytesRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a ReadBytesRequestBody message.
         * @function verify
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ReadBytesRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.start != null && Object.hasOwnProperty.call(message, "start")) {
                var error = $root.common.UInt64Value.verify(message.start, long + 1);
                if (error)
                    return "start." + error;
            }
            if (message.end != null && Object.hasOwnProperty.call(message, "end")) {
                var error = $root.common.UInt64Value.verify(message.end, long + 1);
                if (error)
                    return "end." + error;
            }
            return null;
        };

        /**
         * Creates a ReadBytesRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.ReadBytesRequestBody} ReadBytesRequestBody
         */
        ReadBytesRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.ReadBytesRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.ReadBytesRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.ReadBytesRequestBody();
            if (object.start != null) {
                if (!$util.isObject(object.start))
                    throw TypeError(".file.ReadBytesRequestBody.start: object expected");
                message.start = $root.common.UInt64Value.fromObject(object.start, long + 1);
            }
            if (object.end != null) {
                if (!$util.isObject(object.end))
                    throw TypeError(".file.ReadBytesRequestBody.end: object expected");
                message.end = $root.common.UInt64Value.fromObject(object.end, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a ReadBytesRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {file.ReadBytesRequestBody} message ReadBytesRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ReadBytesRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.start = null;
                object.end = null;
            }
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                object.start = $root.common.UInt64Value.toObject(message.start, options, q + 1);
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                object.end = $root.common.UInt64Value.toObject(message.end, options, q + 1);
            return object;
        };

        /**
         * Converts this ReadBytesRequestBody to JSON.
         * @function toJSON
         * @memberof file.ReadBytesRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ReadBytesRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ReadBytesRequestBody
         * @function getTypeUrl
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ReadBytesRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.ReadBytesRequestBody";
        };

        return ReadBytesRequestBody;
    })();

    file.ReadBytesReplyBody = (function() {

        /**
         * Properties of a ReadBytesReplyBody.
         * @memberof file
         * @interface IReadBytesReplyBody
         * @property {common.IBytesValue|null} [bytes] ReadBytesReplyBody bytes
         */

        /**
         * Constructs a new ReadBytesReplyBody.
         * @memberof file
         * @classdesc Represents a ReadBytesReplyBody.
         * @implements IReadBytesReplyBody
         * @constructor
         * @param {file.IReadBytesReplyBody=} [properties] Properties to set
         */
        function ReadBytesReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ReadBytesReplyBody bytes.
         * @member {common.IBytesValue|null|undefined} bytes
         * @memberof file.ReadBytesReplyBody
         * @instance
         */
        ReadBytesReplyBody.prototype.bytes = null;

        /**
         * Creates a new ReadBytesReplyBody instance using the specified properties.
         * @function create
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {file.IReadBytesReplyBody=} [properties] Properties to set
         * @returns {file.ReadBytesReplyBody} ReadBytesReplyBody instance
         */
        ReadBytesReplyBody.create = function create(properties) {
            return new ReadBytesReplyBody(properties);
        };

        /**
         * Encodes the specified ReadBytesReplyBody message. Does not implicitly {@link file.ReadBytesReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {file.IReadBytesReplyBody} message ReadBytesReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ReadBytesReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified ReadBytesReplyBody message, length delimited. Does not implicitly {@link file.ReadBytesReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {file.IReadBytesReplyBody} message ReadBytesReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ReadBytesReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a ReadBytesReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.ReadBytesReplyBody} ReadBytesReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ReadBytesReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ReadBytesReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a ReadBytesReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.ReadBytesReplyBody} ReadBytesReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ReadBytesReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a ReadBytesReplyBody message.
         * @function verify
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ReadBytesReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes, long + 1);
                if (error)
                    return "bytes." + error;
            }
            return null;
        };

        /**
         * Creates a ReadBytesReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.ReadBytesReplyBody} ReadBytesReplyBody
         */
        ReadBytesReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.ReadBytesReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.ReadBytesReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.ReadBytesReplyBody();
            if (object.bytes != null) {
                if (!$util.isObject(object.bytes))
                    throw TypeError(".file.ReadBytesReplyBody.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a ReadBytesReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {file.ReadBytesReplyBody} message ReadBytesReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ReadBytesReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.bytes = null;
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options, q + 1);
            return object;
        };

        /**
         * Converts this ReadBytesReplyBody to JSON.
         * @function toJSON
         * @memberof file.ReadBytesReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ReadBytesReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ReadBytesReplyBody
         * @function getTypeUrl
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ReadBytesReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.ReadBytesReplyBody";
        };

        return ReadBytesReplyBody;
    })();

    file.VersionedReadFlags = (function() {

        /**
         * Properties of a VersionedReadFlags.
         * @memberof file
         * @interface IVersionedReadFlags
         * @property {common.IUInt64Value|null} [archivedVersion] VersionedReadFlags archivedVersion
         * @property {common.IUInt64Value|null} [remoteVersion] VersionedReadFlags remoteVersion
         */

        /**
         * Constructs a new VersionedReadFlags.
         * @memberof file
         * @classdesc Represents a VersionedReadFlags.
         * @implements IVersionedReadFlags
         * @constructor
         * @param {file.IVersionedReadFlags=} [properties] Properties to set
         */
        function VersionedReadFlags(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedReadFlags archivedVersion.
         * @member {common.IUInt64Value|null|undefined} archivedVersion
         * @memberof file.VersionedReadFlags
         * @instance
         */
        VersionedReadFlags.prototype.archivedVersion = null;

        /**
         * VersionedReadFlags remoteVersion.
         * @member {common.IUInt64Value|null|undefined} remoteVersion
         * @memberof file.VersionedReadFlags
         * @instance
         */
        VersionedReadFlags.prototype.remoteVersion = null;

        /**
         * Creates a new VersionedReadFlags instance using the specified properties.
         * @function create
         * @memberof file.VersionedReadFlags
         * @static
         * @param {file.IVersionedReadFlags=} [properties] Properties to set
         * @returns {file.VersionedReadFlags} VersionedReadFlags instance
         */
        VersionedReadFlags.create = function create(properties) {
            return new VersionedReadFlags(properties);
        };

        /**
         * Encodes the specified VersionedReadFlags message. Does not implicitly {@link file.VersionedReadFlags.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedReadFlags
         * @static
         * @param {file.IVersionedReadFlags} message VersionedReadFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadFlags.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.archivedVersion != null && Object.hasOwnProperty.call(message, "archivedVersion"))
                $root.common.UInt64Value.encode(message.archivedVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedReadFlags message, length delimited. Does not implicitly {@link file.VersionedReadFlags.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedReadFlags
         * @static
         * @param {file.IVersionedReadFlags} message VersionedReadFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadFlags.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedReadFlags message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedReadFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedReadFlags} VersionedReadFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadFlags.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.archivedVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedReadFlags message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedReadFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedReadFlags} VersionedReadFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadFlags.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedReadFlags message.
         * @function verify
         * @memberof file.VersionedReadFlags
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedReadFlags.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.archivedVersion != null && Object.hasOwnProperty.call(message, "archivedVersion")) {
                var error = $root.common.UInt64Value.verify(message.archivedVersion, long + 1);
                if (error)
                    return "archivedVersion." + error;
            }
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion, long + 1);
                if (error)
                    return "remoteVersion." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedReadFlags message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedReadFlags
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedReadFlags} VersionedReadFlags
         */
        VersionedReadFlags.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedReadFlags)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedReadFlags: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedReadFlags();
            if (object.archivedVersion != null) {
                if (!$util.isObject(object.archivedVersion))
                    throw TypeError(".file.VersionedReadFlags.archivedVersion: object expected");
                message.archivedVersion = $root.common.UInt64Value.fromObject(object.archivedVersion, long + 1);
            }
            if (object.remoteVersion != null) {
                if (!$util.isObject(object.remoteVersion))
                    throw TypeError(".file.VersionedReadFlags.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedReadFlags message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedReadFlags
         * @static
         * @param {file.VersionedReadFlags} message VersionedReadFlags
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedReadFlags.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.archivedVersion = null;
                object.remoteVersion = null;
            }
            if (message.archivedVersion != null && Object.hasOwnProperty.call(message, "archivedVersion"))
                object.archivedVersion = $root.common.UInt64Value.toObject(message.archivedVersion, options, q + 1);
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedReadFlags to JSON.
         * @function toJSON
         * @memberof file.VersionedReadFlags
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedReadFlags.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedReadFlags
         * @function getTypeUrl
         * @memberof file.VersionedReadFlags
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedReadFlags.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedReadFlags";
        };

        return VersionedReadFlags;
    })();

    file.RequestWithVersionedReadFlags = (function() {

        /**
         * Properties of a RequestWithVersionedReadFlags.
         * @memberof file
         * @interface IRequestWithVersionedReadFlags
         * @property {file.IVersionedReadFlags|null} [flags] RequestWithVersionedReadFlags flags
         */

        /**
         * Constructs a new RequestWithVersionedReadFlags.
         * @memberof file
         * @classdesc Represents a RequestWithVersionedReadFlags.
         * @implements IRequestWithVersionedReadFlags
         * @constructor
         * @param {file.IRequestWithVersionedReadFlags=} [properties] Properties to set
         */
        function RequestWithVersionedReadFlags(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * RequestWithVersionedReadFlags flags.
         * @member {file.IVersionedReadFlags|null|undefined} flags
         * @memberof file.RequestWithVersionedReadFlags
         * @instance
         */
        RequestWithVersionedReadFlags.prototype.flags = null;

        /**
         * Creates a new RequestWithVersionedReadFlags instance using the specified properties.
         * @function create
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {file.IRequestWithVersionedReadFlags=} [properties] Properties to set
         * @returns {file.RequestWithVersionedReadFlags} RequestWithVersionedReadFlags instance
         */
        RequestWithVersionedReadFlags.create = function create(properties) {
            return new RequestWithVersionedReadFlags(properties);
        };

        /**
         * Encodes the specified RequestWithVersionedReadFlags message. Does not implicitly {@link file.RequestWithVersionedReadFlags.verify|verify} messages.
         * @function encode
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {file.IRequestWithVersionedReadFlags} message RequestWithVersionedReadFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        RequestWithVersionedReadFlags.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified RequestWithVersionedReadFlags message, length delimited. Does not implicitly {@link file.RequestWithVersionedReadFlags.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {file.IRequestWithVersionedReadFlags} message RequestWithVersionedReadFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        RequestWithVersionedReadFlags.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a RequestWithVersionedReadFlags message from the specified reader or buffer.
         * @function decode
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.RequestWithVersionedReadFlags} RequestWithVersionedReadFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        RequestWithVersionedReadFlags.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.RequestWithVersionedReadFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a RequestWithVersionedReadFlags message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.RequestWithVersionedReadFlags} RequestWithVersionedReadFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        RequestWithVersionedReadFlags.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a RequestWithVersionedReadFlags message.
         * @function verify
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        RequestWithVersionedReadFlags.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a RequestWithVersionedReadFlags message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.RequestWithVersionedReadFlags} RequestWithVersionedReadFlags
         */
        RequestWithVersionedReadFlags.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.RequestWithVersionedReadFlags)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.RequestWithVersionedReadFlags: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.RequestWithVersionedReadFlags();
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".file.RequestWithVersionedReadFlags.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a RequestWithVersionedReadFlags message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {file.RequestWithVersionedReadFlags} message RequestWithVersionedReadFlags
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        RequestWithVersionedReadFlags.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.flags = null;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this RequestWithVersionedReadFlags to JSON.
         * @function toJSON
         * @memberof file.RequestWithVersionedReadFlags
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        RequestWithVersionedReadFlags.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for RequestWithVersionedReadFlags
         * @function getTypeUrl
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        RequestWithVersionedReadFlags.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.RequestWithVersionedReadFlags";
        };

        return RequestWithVersionedReadFlags;
    })();

    file.VersionedGetXAttrRequestBody = (function() {

        /**
         * Properties of a VersionedGetXAttrRequestBody.
         * @memberof file
         * @interface IVersionedGetXAttrRequestBody
         * @property {string|null} [xaName] VersionedGetXAttrRequestBody xaName
         * @property {file.IVersionedReadFlags|null} [flags] VersionedGetXAttrRequestBody flags
         */

        /**
         * Constructs a new VersionedGetXAttrRequestBody.
         * @memberof file
         * @classdesc Represents a VersionedGetXAttrRequestBody.
         * @implements IVersionedGetXAttrRequestBody
         * @constructor
         * @param {file.IVersionedGetXAttrRequestBody=} [properties] Properties to set
         */
        function VersionedGetXAttrRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedGetXAttrRequestBody xaName.
         * @member {string} xaName
         * @memberof file.VersionedGetXAttrRequestBody
         * @instance
         */
        VersionedGetXAttrRequestBody.prototype.xaName = "";

        /**
         * VersionedGetXAttrRequestBody flags.
         * @member {file.IVersionedReadFlags|null|undefined} flags
         * @memberof file.VersionedGetXAttrRequestBody
         * @instance
         */
        VersionedGetXAttrRequestBody.prototype.flags = null;

        /**
         * Creates a new VersionedGetXAttrRequestBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {file.IVersionedGetXAttrRequestBody=} [properties] Properties to set
         * @returns {file.VersionedGetXAttrRequestBody} VersionedGetXAttrRequestBody instance
         */
        VersionedGetXAttrRequestBody.create = function create(properties) {
            return new VersionedGetXAttrRequestBody(properties);
        };

        /**
         * Encodes the specified VersionedGetXAttrRequestBody message. Does not implicitly {@link file.VersionedGetXAttrRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {file.IVersionedGetXAttrRequestBody} message VersionedGetXAttrRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetXAttrRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.xaName);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedGetXAttrRequestBody message, length delimited. Does not implicitly {@link file.VersionedGetXAttrRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {file.IVersionedGetXAttrRequestBody} message VersionedGetXAttrRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetXAttrRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedGetXAttrRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedGetXAttrRequestBody} VersionedGetXAttrRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetXAttrRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetXAttrRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.xaName = reader.string();
                        break;
                    }
                case 2: {
                        message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedGetXAttrRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedGetXAttrRequestBody} VersionedGetXAttrRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetXAttrRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedGetXAttrRequestBody message.
         * @function verify
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedGetXAttrRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                if (!$util.isString(message.xaName))
                    return "xaName: string expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedGetXAttrRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedGetXAttrRequestBody} VersionedGetXAttrRequestBody
         */
        VersionedGetXAttrRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedGetXAttrRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedGetXAttrRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedGetXAttrRequestBody();
            if (object.xaName != null)
                message.xaName = String(object.xaName);
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".file.VersionedGetXAttrRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedGetXAttrRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {file.VersionedGetXAttrRequestBody} message VersionedGetXAttrRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedGetXAttrRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.xaName = "";
                object.flags = null;
            }
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                object.xaName = message.xaName;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedGetXAttrRequestBody to JSON.
         * @function toJSON
         * @memberof file.VersionedGetXAttrRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedGetXAttrRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedGetXAttrRequestBody
         * @function getTypeUrl
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedGetXAttrRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedGetXAttrRequestBody";
        };

        return VersionedGetXAttrRequestBody;
    })();

    file.VersionedGetXAttrReplyBody = (function() {

        /**
         * Properties of a VersionedGetXAttrReplyBody.
         * @memberof file
         * @interface IVersionedGetXAttrReplyBody
         * @property {number|Long|null} [version] VersionedGetXAttrReplyBody version
         * @property {common.IStringValue|null} [str] VersionedGetXAttrReplyBody str
         * @property {common.IStringValue|null} [json] VersionedGetXAttrReplyBody json
         * @property {common.IBytesValue|null} [bytes] VersionedGetXAttrReplyBody bytes
         */

        /**
         * Constructs a new VersionedGetXAttrReplyBody.
         * @memberof file
         * @classdesc Represents a VersionedGetXAttrReplyBody.
         * @implements IVersionedGetXAttrReplyBody
         * @constructor
         * @param {file.IVersionedGetXAttrReplyBody=} [properties] Properties to set
         */
        function VersionedGetXAttrReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedGetXAttrReplyBody version.
         * @member {number|Long} version
         * @memberof file.VersionedGetXAttrReplyBody
         * @instance
         */
        VersionedGetXAttrReplyBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * VersionedGetXAttrReplyBody str.
         * @member {common.IStringValue|null|undefined} str
         * @memberof file.VersionedGetXAttrReplyBody
         * @instance
         */
        VersionedGetXAttrReplyBody.prototype.str = null;

        /**
         * VersionedGetXAttrReplyBody json.
         * @member {common.IStringValue|null|undefined} json
         * @memberof file.VersionedGetXAttrReplyBody
         * @instance
         */
        VersionedGetXAttrReplyBody.prototype.json = null;

        /**
         * VersionedGetXAttrReplyBody bytes.
         * @member {common.IBytesValue|null|undefined} bytes
         * @memberof file.VersionedGetXAttrReplyBody
         * @instance
         */
        VersionedGetXAttrReplyBody.prototype.bytes = null;

        /**
         * Creates a new VersionedGetXAttrReplyBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {file.IVersionedGetXAttrReplyBody=} [properties] Properties to set
         * @returns {file.VersionedGetXAttrReplyBody} VersionedGetXAttrReplyBody instance
         */
        VersionedGetXAttrReplyBody.create = function create(properties) {
            return new VersionedGetXAttrReplyBody(properties);
        };

        /**
         * Encodes the specified VersionedGetXAttrReplyBody message. Does not implicitly {@link file.VersionedGetXAttrReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {file.IVersionedGetXAttrReplyBody} message VersionedGetXAttrReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetXAttrReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            if (message.str != null && Object.hasOwnProperty.call(message, "str"))
                $root.common.StringValue.encode(message.str, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedGetXAttrReplyBody message, length delimited. Does not implicitly {@link file.VersionedGetXAttrReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {file.IVersionedGetXAttrReplyBody} message VersionedGetXAttrReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetXAttrReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedGetXAttrReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedGetXAttrReplyBody} VersionedGetXAttrReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetXAttrReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetXAttrReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.str = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.json = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedGetXAttrReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedGetXAttrReplyBody} VersionedGetXAttrReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetXAttrReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedGetXAttrReplyBody message.
         * @function verify
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedGetXAttrReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            if (message.str != null && Object.hasOwnProperty.call(message, "str")) {
                var error = $root.common.StringValue.verify(message.str, long + 1);
                if (error)
                    return "str." + error;
            }
            if (message.json != null && Object.hasOwnProperty.call(message, "json")) {
                var error = $root.common.StringValue.verify(message.json, long + 1);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes, long + 1);
                if (error)
                    return "bytes." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedGetXAttrReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedGetXAttrReplyBody} VersionedGetXAttrReplyBody
         */
        VersionedGetXAttrReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedGetXAttrReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedGetXAttrReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedGetXAttrReplyBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            if (object.str != null) {
                if (!$util.isObject(object.str))
                    throw TypeError(".file.VersionedGetXAttrReplyBody.str: object expected");
                message.str = $root.common.StringValue.fromObject(object.str, long + 1);
            }
            if (object.json != null) {
                if (!$util.isObject(object.json))
                    throw TypeError(".file.VersionedGetXAttrReplyBody.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json, long + 1);
            }
            if (object.bytes != null) {
                if (!$util.isObject(object.bytes))
                    throw TypeError(".file.VersionedGetXAttrReplyBody.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedGetXAttrReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {file.VersionedGetXAttrReplyBody} message VersionedGetXAttrReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedGetXAttrReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.str = null;
                object.json = null;
                object.bytes = null;
            }
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            if (message.str != null && Object.hasOwnProperty.call(message, "str"))
                object.str = $root.common.StringValue.toObject(message.str, options, q + 1);
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = $root.common.StringValue.toObject(message.json, options, q + 1);
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedGetXAttrReplyBody to JSON.
         * @function toJSON
         * @memberof file.VersionedGetXAttrReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedGetXAttrReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedGetXAttrReplyBody
         * @function getTypeUrl
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedGetXAttrReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedGetXAttrReplyBody";
        };

        return VersionedGetXAttrReplyBody;
    })();

    file.VersionedListXAttrsReplyBody = (function() {

        /**
         * Properties of a VersionedListXAttrsReplyBody.
         * @memberof file
         * @interface IVersionedListXAttrsReplyBody
         * @property {number|Long|null} [version] VersionedListXAttrsReplyBody version
         * @property {Array.<string>|null} [xaNames] VersionedListXAttrsReplyBody xaNames
         */

        /**
         * Constructs a new VersionedListXAttrsReplyBody.
         * @memberof file
         * @classdesc Represents a VersionedListXAttrsReplyBody.
         * @implements IVersionedListXAttrsReplyBody
         * @constructor
         * @param {file.IVersionedListXAttrsReplyBody=} [properties] Properties to set
         */
        function VersionedListXAttrsReplyBody(properties) {
            this.xaNames = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedListXAttrsReplyBody version.
         * @member {number|Long} version
         * @memberof file.VersionedListXAttrsReplyBody
         * @instance
         */
        VersionedListXAttrsReplyBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * VersionedListXAttrsReplyBody xaNames.
         * @member {Array.<string>} xaNames
         * @memberof file.VersionedListXAttrsReplyBody
         * @instance
         */
        VersionedListXAttrsReplyBody.prototype.xaNames = $util.emptyArray;

        /**
         * Creates a new VersionedListXAttrsReplyBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {file.IVersionedListXAttrsReplyBody=} [properties] Properties to set
         * @returns {file.VersionedListXAttrsReplyBody} VersionedListXAttrsReplyBody instance
         */
        VersionedListXAttrsReplyBody.create = function create(properties) {
            return new VersionedListXAttrsReplyBody(properties);
        };

        /**
         * Encodes the specified VersionedListXAttrsReplyBody message. Does not implicitly {@link file.VersionedListXAttrsReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {file.IVersionedListXAttrsReplyBody} message VersionedListXAttrsReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedListXAttrsReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            if (message.xaNames != null && message.xaNames.length)
                for (var i = 0; i < message.xaNames.length; ++i)
                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.xaNames[i]);
            return writer;
        };

        /**
         * Encodes the specified VersionedListXAttrsReplyBody message, length delimited. Does not implicitly {@link file.VersionedListXAttrsReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {file.IVersionedListXAttrsReplyBody} message VersionedListXAttrsReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedListXAttrsReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedListXAttrsReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedListXAttrsReplyBody} VersionedListXAttrsReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedListXAttrsReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedListXAttrsReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        if (!(message.xaNames && message.xaNames.length))
                            message.xaNames = [];
                        message.xaNames.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedListXAttrsReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedListXAttrsReplyBody} VersionedListXAttrsReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedListXAttrsReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedListXAttrsReplyBody message.
         * @function verify
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedListXAttrsReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            if (message.xaNames != null && Object.hasOwnProperty.call(message, "xaNames")) {
                if (!Array.isArray(message.xaNames))
                    return "xaNames: array expected";
                for (var i = 0; i < message.xaNames.length; ++i)
                    if (!$util.isString(message.xaNames[i]))
                        return "xaNames: string[] expected";
            }
            return null;
        };

        /**
         * Creates a VersionedListXAttrsReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedListXAttrsReplyBody} VersionedListXAttrsReplyBody
         */
        VersionedListXAttrsReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedListXAttrsReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedListXAttrsReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedListXAttrsReplyBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            if (object.xaNames) {
                if (!Array.isArray(object.xaNames))
                    throw TypeError(".file.VersionedListXAttrsReplyBody.xaNames: array expected");
                message.xaNames = [];
                for (var i = 0; i < object.xaNames.length; ++i)
                    message.xaNames[i] = String(object.xaNames[i]);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedListXAttrsReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {file.VersionedListXAttrsReplyBody} message VersionedListXAttrsReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedListXAttrsReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.xaNames = [];
            if (options.defaults)
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            if (message.xaNames && message.xaNames.length) {
                object.xaNames = [];
                for (var j = 0; j < message.xaNames.length; ++j)
                    object.xaNames[j] = message.xaNames[j];
            }
            return object;
        };

        /**
         * Converts this VersionedListXAttrsReplyBody to JSON.
         * @function toJSON
         * @memberof file.VersionedListXAttrsReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedListXAttrsReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedListXAttrsReplyBody
         * @function getTypeUrl
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedListXAttrsReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedListXAttrsReplyBody";
        };

        return VersionedListXAttrsReplyBody;
    })();

    file.VersionedReadBytesRequestBody = (function() {

        /**
         * Properties of a VersionedReadBytesRequestBody.
         * @memberof file
         * @interface IVersionedReadBytesRequestBody
         * @property {common.IUInt64Value|null} [start] VersionedReadBytesRequestBody start
         * @property {common.IUInt64Value|null} [end] VersionedReadBytesRequestBody end
         * @property {file.IVersionedReadFlags|null} [flags] VersionedReadBytesRequestBody flags
         */

        /**
         * Constructs a new VersionedReadBytesRequestBody.
         * @memberof file
         * @classdesc Represents a VersionedReadBytesRequestBody.
         * @implements IVersionedReadBytesRequestBody
         * @constructor
         * @param {file.IVersionedReadBytesRequestBody=} [properties] Properties to set
         */
        function VersionedReadBytesRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedReadBytesRequestBody start.
         * @member {common.IUInt64Value|null|undefined} start
         * @memberof file.VersionedReadBytesRequestBody
         * @instance
         */
        VersionedReadBytesRequestBody.prototype.start = null;

        /**
         * VersionedReadBytesRequestBody end.
         * @member {common.IUInt64Value|null|undefined} end
         * @memberof file.VersionedReadBytesRequestBody
         * @instance
         */
        VersionedReadBytesRequestBody.prototype.end = null;

        /**
         * VersionedReadBytesRequestBody flags.
         * @member {file.IVersionedReadFlags|null|undefined} flags
         * @memberof file.VersionedReadBytesRequestBody
         * @instance
         */
        VersionedReadBytesRequestBody.prototype.flags = null;

        /**
         * Creates a new VersionedReadBytesRequestBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {file.IVersionedReadBytesRequestBody=} [properties] Properties to set
         * @returns {file.VersionedReadBytesRequestBody} VersionedReadBytesRequestBody instance
         */
        VersionedReadBytesRequestBody.create = function create(properties) {
            return new VersionedReadBytesRequestBody(properties);
        };

        /**
         * Encodes the specified VersionedReadBytesRequestBody message. Does not implicitly {@link file.VersionedReadBytesRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {file.IVersionedReadBytesRequestBody} message VersionedReadBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadBytesRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                $root.common.UInt64Value.encode(message.start, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                $root.common.UInt64Value.encode(message.end, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 10, wireType 2 =*/82).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedReadBytesRequestBody message, length delimited. Does not implicitly {@link file.VersionedReadBytesRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {file.IVersionedReadBytesRequestBody} message VersionedReadBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadBytesRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedReadBytesRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedReadBytesRequestBody} VersionedReadBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadBytesRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.start = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.end = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 10: {
                        message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedReadBytesRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedReadBytesRequestBody} VersionedReadBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadBytesRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedReadBytesRequestBody message.
         * @function verify
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedReadBytesRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.start != null && Object.hasOwnProperty.call(message, "start")) {
                var error = $root.common.UInt64Value.verify(message.start, long + 1);
                if (error)
                    return "start." + error;
            }
            if (message.end != null && Object.hasOwnProperty.call(message, "end")) {
                var error = $root.common.UInt64Value.verify(message.end, long + 1);
                if (error)
                    return "end." + error;
            }
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedReadBytesRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedReadBytesRequestBody} VersionedReadBytesRequestBody
         */
        VersionedReadBytesRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedReadBytesRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedReadBytesRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedReadBytesRequestBody();
            if (object.start != null) {
                if (!$util.isObject(object.start))
                    throw TypeError(".file.VersionedReadBytesRequestBody.start: object expected");
                message.start = $root.common.UInt64Value.fromObject(object.start, long + 1);
            }
            if (object.end != null) {
                if (!$util.isObject(object.end))
                    throw TypeError(".file.VersionedReadBytesRequestBody.end: object expected");
                message.end = $root.common.UInt64Value.fromObject(object.end, long + 1);
            }
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".file.VersionedReadBytesRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedReadBytesRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {file.VersionedReadBytesRequestBody} message VersionedReadBytesRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedReadBytesRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.start = null;
                object.end = null;
                object.flags = null;
            }
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                object.start = $root.common.UInt64Value.toObject(message.start, options, q + 1);
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                object.end = $root.common.UInt64Value.toObject(message.end, options, q + 1);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedReadBytesRequestBody to JSON.
         * @function toJSON
         * @memberof file.VersionedReadBytesRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedReadBytesRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedReadBytesRequestBody
         * @function getTypeUrl
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedReadBytesRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedReadBytesRequestBody";
        };

        return VersionedReadBytesRequestBody;
    })();

    file.VersionedReadBytesReplyBody = (function() {

        /**
         * Properties of a VersionedReadBytesReplyBody.
         * @memberof file
         * @interface IVersionedReadBytesReplyBody
         * @property {number|Long|null} [version] VersionedReadBytesReplyBody version
         * @property {common.IBytesValue|null} [bytes] VersionedReadBytesReplyBody bytes
         */

        /**
         * Constructs a new VersionedReadBytesReplyBody.
         * @memberof file
         * @classdesc Represents a VersionedReadBytesReplyBody.
         * @implements IVersionedReadBytesReplyBody
         * @constructor
         * @param {file.IVersionedReadBytesReplyBody=} [properties] Properties to set
         */
        function VersionedReadBytesReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedReadBytesReplyBody version.
         * @member {number|Long} version
         * @memberof file.VersionedReadBytesReplyBody
         * @instance
         */
        VersionedReadBytesReplyBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * VersionedReadBytesReplyBody bytes.
         * @member {common.IBytesValue|null|undefined} bytes
         * @memberof file.VersionedReadBytesReplyBody
         * @instance
         */
        VersionedReadBytesReplyBody.prototype.bytes = null;

        /**
         * Creates a new VersionedReadBytesReplyBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {file.IVersionedReadBytesReplyBody=} [properties] Properties to set
         * @returns {file.VersionedReadBytesReplyBody} VersionedReadBytesReplyBody instance
         */
        VersionedReadBytesReplyBody.create = function create(properties) {
            return new VersionedReadBytesReplyBody(properties);
        };

        /**
         * Encodes the specified VersionedReadBytesReplyBody message. Does not implicitly {@link file.VersionedReadBytesReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {file.IVersionedReadBytesReplyBody} message VersionedReadBytesReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadBytesReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedReadBytesReplyBody message, length delimited. Does not implicitly {@link file.VersionedReadBytesReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {file.IVersionedReadBytesReplyBody} message VersionedReadBytesReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadBytesReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedReadBytesReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedReadBytesReplyBody} VersionedReadBytesReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadBytesReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadBytesReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedReadBytesReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedReadBytesReplyBody} VersionedReadBytesReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadBytesReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedReadBytesReplyBody message.
         * @function verify
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedReadBytesReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes, long + 1);
                if (error)
                    return "bytes." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedReadBytesReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedReadBytesReplyBody} VersionedReadBytesReplyBody
         */
        VersionedReadBytesReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedReadBytesReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedReadBytesReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedReadBytesReplyBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            if (object.bytes != null) {
                if (!$util.isObject(object.bytes))
                    throw TypeError(".file.VersionedReadBytesReplyBody.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedReadBytesReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {file.VersionedReadBytesReplyBody} message VersionedReadBytesReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedReadBytesReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.bytes = null;
            }
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedReadBytesReplyBody to JSON.
         * @function toJSON
         * @memberof file.VersionedReadBytesReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedReadBytesReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedReadBytesReplyBody
         * @function getTypeUrl
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedReadBytesReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedReadBytesReplyBody";
        };

        return VersionedReadBytesReplyBody;
    })();

    file.VersionedReadTxtReplyBody = (function() {

        /**
         * Properties of a VersionedReadTxtReplyBody.
         * @memberof file
         * @interface IVersionedReadTxtReplyBody
         * @property {number|Long|null} [version] VersionedReadTxtReplyBody version
         * @property {string|null} [txt] VersionedReadTxtReplyBody txt
         */

        /**
         * Constructs a new VersionedReadTxtReplyBody.
         * @memberof file
         * @classdesc Represents a VersionedReadTxtReplyBody.
         * @implements IVersionedReadTxtReplyBody
         * @constructor
         * @param {file.IVersionedReadTxtReplyBody=} [properties] Properties to set
         */
        function VersionedReadTxtReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedReadTxtReplyBody version.
         * @member {number|Long} version
         * @memberof file.VersionedReadTxtReplyBody
         * @instance
         */
        VersionedReadTxtReplyBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * VersionedReadTxtReplyBody txt.
         * @member {string} txt
         * @memberof file.VersionedReadTxtReplyBody
         * @instance
         */
        VersionedReadTxtReplyBody.prototype.txt = "";

        /**
         * Creates a new VersionedReadTxtReplyBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {file.IVersionedReadTxtReplyBody=} [properties] Properties to set
         * @returns {file.VersionedReadTxtReplyBody} VersionedReadTxtReplyBody instance
         */
        VersionedReadTxtReplyBody.create = function create(properties) {
            return new VersionedReadTxtReplyBody(properties);
        };

        /**
         * Encodes the specified VersionedReadTxtReplyBody message. Does not implicitly {@link file.VersionedReadTxtReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {file.IVersionedReadTxtReplyBody} message VersionedReadTxtReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadTxtReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.txt);
            return writer;
        };

        /**
         * Encodes the specified VersionedReadTxtReplyBody message, length delimited. Does not implicitly {@link file.VersionedReadTxtReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {file.IVersionedReadTxtReplyBody} message VersionedReadTxtReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadTxtReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedReadTxtReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedReadTxtReplyBody} VersionedReadTxtReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadTxtReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadTxtReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.txt = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedReadTxtReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedReadTxtReplyBody} VersionedReadTxtReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadTxtReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedReadTxtReplyBody message.
         * @function verify
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedReadTxtReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                if (!$util.isString(message.txt))
                    return "txt: string expected";
            return null;
        };

        /**
         * Creates a VersionedReadTxtReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedReadTxtReplyBody} VersionedReadTxtReplyBody
         */
        VersionedReadTxtReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedReadTxtReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedReadTxtReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedReadTxtReplyBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            if (object.txt != null)
                message.txt = String(object.txt);
            return message;
        };

        /**
         * Creates a plain object from a VersionedReadTxtReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {file.VersionedReadTxtReplyBody} message VersionedReadTxtReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedReadTxtReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.txt = "";
            }
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                object.txt = message.txt;
            return object;
        };

        /**
         * Converts this VersionedReadTxtReplyBody to JSON.
         * @function toJSON
         * @memberof file.VersionedReadTxtReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedReadTxtReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedReadTxtReplyBody
         * @function getTypeUrl
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedReadTxtReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedReadTxtReplyBody";
        };

        return VersionedReadTxtReplyBody;
    })();

    file.VersionedReadJsonReplyBody = (function() {

        /**
         * Properties of a VersionedReadJsonReplyBody.
         * @memberof file
         * @interface IVersionedReadJsonReplyBody
         * @property {number|Long|null} [version] VersionedReadJsonReplyBody version
         * @property {string|null} [json] VersionedReadJsonReplyBody json
         */

        /**
         * Constructs a new VersionedReadJsonReplyBody.
         * @memberof file
         * @classdesc Represents a VersionedReadJsonReplyBody.
         * @implements IVersionedReadJsonReplyBody
         * @constructor
         * @param {file.IVersionedReadJsonReplyBody=} [properties] Properties to set
         */
        function VersionedReadJsonReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedReadJsonReplyBody version.
         * @member {number|Long} version
         * @memberof file.VersionedReadJsonReplyBody
         * @instance
         */
        VersionedReadJsonReplyBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * VersionedReadJsonReplyBody json.
         * @member {string} json
         * @memberof file.VersionedReadJsonReplyBody
         * @instance
         */
        VersionedReadJsonReplyBody.prototype.json = "";

        /**
         * Creates a new VersionedReadJsonReplyBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {file.IVersionedReadJsonReplyBody=} [properties] Properties to set
         * @returns {file.VersionedReadJsonReplyBody} VersionedReadJsonReplyBody instance
         */
        VersionedReadJsonReplyBody.create = function create(properties) {
            return new VersionedReadJsonReplyBody(properties);
        };

        /**
         * Encodes the specified VersionedReadJsonReplyBody message. Does not implicitly {@link file.VersionedReadJsonReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {file.IVersionedReadJsonReplyBody} message VersionedReadJsonReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadJsonReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.json);
            return writer;
        };

        /**
         * Encodes the specified VersionedReadJsonReplyBody message, length delimited. Does not implicitly {@link file.VersionedReadJsonReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {file.IVersionedReadJsonReplyBody} message VersionedReadJsonReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadJsonReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedReadJsonReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedReadJsonReplyBody} VersionedReadJsonReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadJsonReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadJsonReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.json = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedReadJsonReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedReadJsonReplyBody} VersionedReadJsonReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadJsonReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedReadJsonReplyBody message.
         * @function verify
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedReadJsonReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                if (!$util.isString(message.json))
                    return "json: string expected";
            return null;
        };

        /**
         * Creates a VersionedReadJsonReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedReadJsonReplyBody} VersionedReadJsonReplyBody
         */
        VersionedReadJsonReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedReadJsonReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedReadJsonReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedReadJsonReplyBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            if (object.json != null)
                message.json = String(object.json);
            return message;
        };

        /**
         * Creates a plain object from a VersionedReadJsonReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {file.VersionedReadJsonReplyBody} message VersionedReadJsonReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedReadJsonReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.json = "";
            }
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = message.json;
            return object;
        };

        /**
         * Converts this VersionedReadJsonReplyBody to JSON.
         * @function toJSON
         * @memberof file.VersionedReadJsonReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedReadJsonReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedReadJsonReplyBody
         * @function getTypeUrl
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedReadJsonReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedReadJsonReplyBody";
        };

        return VersionedReadJsonReplyBody;
    })();

    file.VersionedGetByteSourceReplyBody = (function() {

        /**
         * Properties of a VersionedGetByteSourceReplyBody.
         * @memberof file
         * @interface IVersionedGetByteSourceReplyBody
         * @property {number|Long|null} [version] VersionedGetByteSourceReplyBody version
         * @property {common.IObjectReference|null} [src] VersionedGetByteSourceReplyBody src
         */

        /**
         * Constructs a new VersionedGetByteSourceReplyBody.
         * @memberof file
         * @classdesc Represents a VersionedGetByteSourceReplyBody.
         * @implements IVersionedGetByteSourceReplyBody
         * @constructor
         * @param {file.IVersionedGetByteSourceReplyBody=} [properties] Properties to set
         */
        function VersionedGetByteSourceReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedGetByteSourceReplyBody version.
         * @member {number|Long} version
         * @memberof file.VersionedGetByteSourceReplyBody
         * @instance
         */
        VersionedGetByteSourceReplyBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * VersionedGetByteSourceReplyBody src.
         * @member {common.IObjectReference|null|undefined} src
         * @memberof file.VersionedGetByteSourceReplyBody
         * @instance
         */
        VersionedGetByteSourceReplyBody.prototype.src = null;

        /**
         * Creates a new VersionedGetByteSourceReplyBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {file.IVersionedGetByteSourceReplyBody=} [properties] Properties to set
         * @returns {file.VersionedGetByteSourceReplyBody} VersionedGetByteSourceReplyBody instance
         */
        VersionedGetByteSourceReplyBody.create = function create(properties) {
            return new VersionedGetByteSourceReplyBody(properties);
        };

        /**
         * Encodes the specified VersionedGetByteSourceReplyBody message. Does not implicitly {@link file.VersionedGetByteSourceReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {file.IVersionedGetByteSourceReplyBody} message VersionedGetByteSourceReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetByteSourceReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                $root.common.ObjectReference.encode(message.src, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedGetByteSourceReplyBody message, length delimited. Does not implicitly {@link file.VersionedGetByteSourceReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {file.IVersionedGetByteSourceReplyBody} message VersionedGetByteSourceReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetByteSourceReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedGetByteSourceReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedGetByteSourceReplyBody} VersionedGetByteSourceReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetByteSourceReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetByteSourceReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.src = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedGetByteSourceReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedGetByteSourceReplyBody} VersionedGetByteSourceReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetByteSourceReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedGetByteSourceReplyBody message.
         * @function verify
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedGetByteSourceReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            if (message.src != null && Object.hasOwnProperty.call(message, "src")) {
                var error = $root.common.ObjectReference.verify(message.src, long + 1);
                if (error)
                    return "src." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedGetByteSourceReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedGetByteSourceReplyBody} VersionedGetByteSourceReplyBody
         */
        VersionedGetByteSourceReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedGetByteSourceReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedGetByteSourceReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedGetByteSourceReplyBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            if (object.src != null) {
                if (!$util.isObject(object.src))
                    throw TypeError(".file.VersionedGetByteSourceReplyBody.src: object expected");
                message.src = $root.common.ObjectReference.fromObject(object.src, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedGetByteSourceReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {file.VersionedGetByteSourceReplyBody} message VersionedGetByteSourceReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedGetByteSourceReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.src = null;
            }
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                object.src = $root.common.ObjectReference.toObject(message.src, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedGetByteSourceReplyBody to JSON.
         * @function toJSON
         * @memberof file.VersionedGetByteSourceReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedGetByteSourceReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedGetByteSourceReplyBody
         * @function getTypeUrl
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedGetByteSourceReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedGetByteSourceReplyBody";
        };

        return VersionedGetByteSourceReplyBody;
    })();

    file.ListVersionsReplyBody = (function() {

        /**
         * Properties of a ListVersionsReplyBody.
         * @memberof file
         * @interface IListVersionsReplyBody
         * @property {common.IUInt64Value|null} [current] ListVersionsReplyBody current
         * @property {Array.<number|Long>|null} [archived] ListVersionsReplyBody archived
         */

        /**
         * Constructs a new ListVersionsReplyBody.
         * @memberof file
         * @classdesc Represents a ListVersionsReplyBody.
         * @implements IListVersionsReplyBody
         * @constructor
         * @param {file.IListVersionsReplyBody=} [properties] Properties to set
         */
        function ListVersionsReplyBody(properties) {
            this.archived = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ListVersionsReplyBody current.
         * @member {common.IUInt64Value|null|undefined} current
         * @memberof file.ListVersionsReplyBody
         * @instance
         */
        ListVersionsReplyBody.prototype.current = null;

        /**
         * ListVersionsReplyBody archived.
         * @member {Array.<number|Long>} archived
         * @memberof file.ListVersionsReplyBody
         * @instance
         */
        ListVersionsReplyBody.prototype.archived = $util.emptyArray;

        /**
         * Creates a new ListVersionsReplyBody instance using the specified properties.
         * @function create
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {file.IListVersionsReplyBody=} [properties] Properties to set
         * @returns {file.ListVersionsReplyBody} ListVersionsReplyBody instance
         */
        ListVersionsReplyBody.create = function create(properties) {
            return new ListVersionsReplyBody(properties);
        };

        /**
         * Encodes the specified ListVersionsReplyBody message. Does not implicitly {@link file.ListVersionsReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {file.IListVersionsReplyBody} message ListVersionsReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ListVersionsReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                $root.common.UInt64Value.encode(message.current, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.archived != null && message.archived.length) {
                writer.uint32(/* id 2, wireType 2 =*/18).fork();
                for (var i = 0; i < message.archived.length; ++i)
                    writer.uint64(message.archived[i]);
                writer.ldelim();
            }
            return writer;
        };

        /**
         * Encodes the specified ListVersionsReplyBody message, length delimited. Does not implicitly {@link file.ListVersionsReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {file.IListVersionsReplyBody} message ListVersionsReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ListVersionsReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a ListVersionsReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.ListVersionsReplyBody} ListVersionsReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ListVersionsReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ListVersionsReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.current = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        if (!(message.archived && message.archived.length))
                            message.archived = [];
                        if ((tag & 7) === 2) {
                            var end2 = reader.uint32() + reader.pos;
                            while (reader.pos < end2)
                                message.archived.push(reader.uint64());
                        } else
                            message.archived.push(reader.uint64());
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a ListVersionsReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.ListVersionsReplyBody} ListVersionsReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ListVersionsReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a ListVersionsReplyBody message.
         * @function verify
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ListVersionsReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.current != null && Object.hasOwnProperty.call(message, "current")) {
                var error = $root.common.UInt64Value.verify(message.current, long + 1);
                if (error)
                    return "current." + error;
            }
            if (message.archived != null && Object.hasOwnProperty.call(message, "archived")) {
                if (!Array.isArray(message.archived))
                    return "archived: array expected";
                for (var i = 0; i < message.archived.length; ++i)
                    if (!$util.isInteger(message.archived[i]) && !(message.archived[i] && $util.isInteger(message.archived[i].low) && $util.isInteger(message.archived[i].high)))
                        return "archived: integer|Long[] expected";
            }
            return null;
        };

        /**
         * Creates a ListVersionsReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.ListVersionsReplyBody} ListVersionsReplyBody
         */
        ListVersionsReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.ListVersionsReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.ListVersionsReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.ListVersionsReplyBody();
            if (object.current != null) {
                if (!$util.isObject(object.current))
                    throw TypeError(".file.ListVersionsReplyBody.current: object expected");
                message.current = $root.common.UInt64Value.fromObject(object.current, long + 1);
            }
            if (object.archived) {
                if (!Array.isArray(object.archived))
                    throw TypeError(".file.ListVersionsReplyBody.archived: array expected");
                message.archived = [];
                for (var i = 0; i < object.archived.length; ++i)
                    if ($util.Long)
                        message.archived[i] = $util.Long.fromValue(object.archived[i], true);
                    else if (typeof object.archived[i] === "string")
                        message.archived[i] = parseInt(object.archived[i], 10);
                    else if (typeof object.archived[i] === "number")
                        message.archived[i] = object.archived[i];
                    else if (typeof object.archived[i] === "object")
                        message.archived[i] = new $util.LongBits(object.archived[i].low >>> 0, object.archived[i].high >>> 0).toNumber(true);
            }
            return message;
        };

        /**
         * Creates a plain object from a ListVersionsReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {file.ListVersionsReplyBody} message ListVersionsReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ListVersionsReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.archived = [];
            if (options.defaults)
                object.current = null;
            if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                object.current = $root.common.UInt64Value.toObject(message.current, options, q + 1);
            if (message.archived && message.archived.length) {
                object.archived = [];
                for (var j = 0; j < message.archived.length; ++j)
                    if (typeof BigInt !== "undefined" && options.longs === BigInt)
                        object.archived[j] = typeof message.archived[j] === "number" ? BigInt(message.archived[j]) : $util.Long.fromBits(message.archived[j].low >>> 0, message.archived[j].high >>> 0, true).toBigInt();
                    else if (typeof message.archived[j] === "number")
                        object.archived[j] = options.longs === String ? String(message.archived[j]) : message.archived[j];
                    else
                        object.archived[j] = options.longs === String ? $util.Long.prototype.toString.call(message.archived[j]) : options.longs === Number ? new $util.LongBits(message.archived[j].low >>> 0, message.archived[j].high >>> 0).toNumber(true) : message.archived[j];
            }
            return object;
        };

        /**
         * Converts this ListVersionsReplyBody to JSON.
         * @function toJSON
         * @memberof file.ListVersionsReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ListVersionsReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ListVersionsReplyBody
         * @function getTypeUrl
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ListVersionsReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.ListVersionsReplyBody";
        };

        return ListVersionsReplyBody;
    })();

    file.UpdateXAttrsRequestBody = (function() {

        /**
         * Properties of an UpdateXAttrsRequestBody.
         * @memberof file
         * @interface IUpdateXAttrsRequestBody
         * @property {file.IXAttrsChanges|null} [changes] UpdateXAttrsRequestBody changes
         */

        /**
         * Constructs a new UpdateXAttrsRequestBody.
         * @memberof file
         * @classdesc Represents an UpdateXAttrsRequestBody.
         * @implements IUpdateXAttrsRequestBody
         * @constructor
         * @param {file.IUpdateXAttrsRequestBody=} [properties] Properties to set
         */
        function UpdateXAttrsRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * UpdateXAttrsRequestBody changes.
         * @member {file.IXAttrsChanges|null|undefined} changes
         * @memberof file.UpdateXAttrsRequestBody
         * @instance
         */
        UpdateXAttrsRequestBody.prototype.changes = null;

        /**
         * Creates a new UpdateXAttrsRequestBody instance using the specified properties.
         * @function create
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {file.IUpdateXAttrsRequestBody=} [properties] Properties to set
         * @returns {file.UpdateXAttrsRequestBody} UpdateXAttrsRequestBody instance
         */
        UpdateXAttrsRequestBody.create = function create(properties) {
            return new UpdateXAttrsRequestBody(properties);
        };

        /**
         * Encodes the specified UpdateXAttrsRequestBody message. Does not implicitly {@link file.UpdateXAttrsRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {file.IUpdateXAttrsRequestBody} message UpdateXAttrsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UpdateXAttrsRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.changes != null && Object.hasOwnProperty.call(message, "changes"))
                $root.file.XAttrsChanges.encode(message.changes, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified UpdateXAttrsRequestBody message, length delimited. Does not implicitly {@link file.UpdateXAttrsRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {file.IUpdateXAttrsRequestBody} message UpdateXAttrsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UpdateXAttrsRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an UpdateXAttrsRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.UpdateXAttrsRequestBody} UpdateXAttrsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UpdateXAttrsRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.UpdateXAttrsRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.changes = $root.file.XAttrsChanges.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an UpdateXAttrsRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.UpdateXAttrsRequestBody} UpdateXAttrsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UpdateXAttrsRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an UpdateXAttrsRequestBody message.
         * @function verify
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        UpdateXAttrsRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.changes != null && Object.hasOwnProperty.call(message, "changes")) {
                var error = $root.file.XAttrsChanges.verify(message.changes, long + 1);
                if (error)
                    return "changes." + error;
            }
            return null;
        };

        /**
         * Creates an UpdateXAttrsRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.UpdateXAttrsRequestBody} UpdateXAttrsRequestBody
         */
        UpdateXAttrsRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.UpdateXAttrsRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.UpdateXAttrsRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.UpdateXAttrsRequestBody();
            if (object.changes != null) {
                if (!$util.isObject(object.changes))
                    throw TypeError(".file.UpdateXAttrsRequestBody.changes: object expected");
                message.changes = $root.file.XAttrsChanges.fromObject(object.changes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an UpdateXAttrsRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {file.UpdateXAttrsRequestBody} message UpdateXAttrsRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        UpdateXAttrsRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.changes = null;
            if (message.changes != null && Object.hasOwnProperty.call(message, "changes"))
                object.changes = $root.file.XAttrsChanges.toObject(message.changes, options, q + 1);
            return object;
        };

        /**
         * Converts this UpdateXAttrsRequestBody to JSON.
         * @function toJSON
         * @memberof file.UpdateXAttrsRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        UpdateXAttrsRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for UpdateXAttrsRequestBody
         * @function getTypeUrl
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        UpdateXAttrsRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.UpdateXAttrsRequestBody";
        };

        return UpdateXAttrsRequestBody;
    })();

    file.NameAndXAttrValue = (function() {

        /**
         * Properties of a NameAndXAttrValue.
         * @memberof file
         * @interface INameAndXAttrValue
         * @property {string|null} [xaName] NameAndXAttrValue xaName
         * @property {common.IStringValue|null} [str] NameAndXAttrValue str
         * @property {common.IStringValue|null} [json] NameAndXAttrValue json
         * @property {common.IBytesValue|null} [bytes] NameAndXAttrValue bytes
         */

        /**
         * Constructs a new NameAndXAttrValue.
         * @memberof file
         * @classdesc Represents a NameAndXAttrValue.
         * @implements INameAndXAttrValue
         * @constructor
         * @param {file.INameAndXAttrValue=} [properties] Properties to set
         */
        function NameAndXAttrValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * NameAndXAttrValue xaName.
         * @member {string} xaName
         * @memberof file.NameAndXAttrValue
         * @instance
         */
        NameAndXAttrValue.prototype.xaName = "";

        /**
         * NameAndXAttrValue str.
         * @member {common.IStringValue|null|undefined} str
         * @memberof file.NameAndXAttrValue
         * @instance
         */
        NameAndXAttrValue.prototype.str = null;

        /**
         * NameAndXAttrValue json.
         * @member {common.IStringValue|null|undefined} json
         * @memberof file.NameAndXAttrValue
         * @instance
         */
        NameAndXAttrValue.prototype.json = null;

        /**
         * NameAndXAttrValue bytes.
         * @member {common.IBytesValue|null|undefined} bytes
         * @memberof file.NameAndXAttrValue
         * @instance
         */
        NameAndXAttrValue.prototype.bytes = null;

        /**
         * Creates a new NameAndXAttrValue instance using the specified properties.
         * @function create
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {file.INameAndXAttrValue=} [properties] Properties to set
         * @returns {file.NameAndXAttrValue} NameAndXAttrValue instance
         */
        NameAndXAttrValue.create = function create(properties) {
            return new NameAndXAttrValue(properties);
        };

        /**
         * Encodes the specified NameAndXAttrValue message. Does not implicitly {@link file.NameAndXAttrValue.verify|verify} messages.
         * @function encode
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {file.INameAndXAttrValue} message NameAndXAttrValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        NameAndXAttrValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.xaName);
            if (message.str != null && Object.hasOwnProperty.call(message, "str"))
                $root.common.StringValue.encode(message.str, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified NameAndXAttrValue message, length delimited. Does not implicitly {@link file.NameAndXAttrValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {file.INameAndXAttrValue} message NameAndXAttrValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        NameAndXAttrValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a NameAndXAttrValue message from the specified reader or buffer.
         * @function decode
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.NameAndXAttrValue} NameAndXAttrValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        NameAndXAttrValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.NameAndXAttrValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.xaName = reader.string();
                        break;
                    }
                case 2: {
                        message.str = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.json = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a NameAndXAttrValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.NameAndXAttrValue} NameAndXAttrValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        NameAndXAttrValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a NameAndXAttrValue message.
         * @function verify
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        NameAndXAttrValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                if (!$util.isString(message.xaName))
                    return "xaName: string expected";
            if (message.str != null && Object.hasOwnProperty.call(message, "str")) {
                var error = $root.common.StringValue.verify(message.str, long + 1);
                if (error)
                    return "str." + error;
            }
            if (message.json != null && Object.hasOwnProperty.call(message, "json")) {
                var error = $root.common.StringValue.verify(message.json, long + 1);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes, long + 1);
                if (error)
                    return "bytes." + error;
            }
            return null;
        };

        /**
         * Creates a NameAndXAttrValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.NameAndXAttrValue} NameAndXAttrValue
         */
        NameAndXAttrValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.NameAndXAttrValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.NameAndXAttrValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.NameAndXAttrValue();
            if (object.xaName != null)
                message.xaName = String(object.xaName);
            if (object.str != null) {
                if (!$util.isObject(object.str))
                    throw TypeError(".file.NameAndXAttrValue.str: object expected");
                message.str = $root.common.StringValue.fromObject(object.str, long + 1);
            }
            if (object.json != null) {
                if (!$util.isObject(object.json))
                    throw TypeError(".file.NameAndXAttrValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json, long + 1);
            }
            if (object.bytes != null) {
                if (!$util.isObject(object.bytes))
                    throw TypeError(".file.NameAndXAttrValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a NameAndXAttrValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {file.NameAndXAttrValue} message NameAndXAttrValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        NameAndXAttrValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.xaName = "";
                object.str = null;
                object.json = null;
                object.bytes = null;
            }
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                object.xaName = message.xaName;
            if (message.str != null && Object.hasOwnProperty.call(message, "str"))
                object.str = $root.common.StringValue.toObject(message.str, options, q + 1);
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = $root.common.StringValue.toObject(message.json, options, q + 1);
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options, q + 1);
            return object;
        };

        /**
         * Converts this NameAndXAttrValue to JSON.
         * @function toJSON
         * @memberof file.NameAndXAttrValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        NameAndXAttrValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for NameAndXAttrValue
         * @function getTypeUrl
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        NameAndXAttrValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.NameAndXAttrValue";
        };

        return NameAndXAttrValue;
    })();

    file.XAttrsChanges = (function() {

        /**
         * Properties of a XAttrsChanges.
         * @memberof file
         * @interface IXAttrsChanges
         * @property {Array.<file.INameAndXAttrValue>|null} [set] XAttrsChanges set
         * @property {Array.<string>|null} [remove] XAttrsChanges remove
         */

        /**
         * Constructs a new XAttrsChanges.
         * @memberof file
         * @classdesc Represents a XAttrsChanges.
         * @implements IXAttrsChanges
         * @constructor
         * @param {file.IXAttrsChanges=} [properties] Properties to set
         */
        function XAttrsChanges(properties) {
            this.set = [];
            this.remove = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * XAttrsChanges set.
         * @member {Array.<file.INameAndXAttrValue>} set
         * @memberof file.XAttrsChanges
         * @instance
         */
        XAttrsChanges.prototype.set = $util.emptyArray;

        /**
         * XAttrsChanges remove.
         * @member {Array.<string>} remove
         * @memberof file.XAttrsChanges
         * @instance
         */
        XAttrsChanges.prototype.remove = $util.emptyArray;

        /**
         * Creates a new XAttrsChanges instance using the specified properties.
         * @function create
         * @memberof file.XAttrsChanges
         * @static
         * @param {file.IXAttrsChanges=} [properties] Properties to set
         * @returns {file.XAttrsChanges} XAttrsChanges instance
         */
        XAttrsChanges.create = function create(properties) {
            return new XAttrsChanges(properties);
        };

        /**
         * Encodes the specified XAttrsChanges message. Does not implicitly {@link file.XAttrsChanges.verify|verify} messages.
         * @function encode
         * @memberof file.XAttrsChanges
         * @static
         * @param {file.IXAttrsChanges} message XAttrsChanges message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        XAttrsChanges.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.set != null && message.set.length)
                for (var i = 0; i < message.set.length; ++i)
                    $root.file.NameAndXAttrValue.encode(message.set[i], writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.remove != null && message.remove.length)
                for (var i = 0; i < message.remove.length; ++i)
                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.remove[i]);
            return writer;
        };

        /**
         * Encodes the specified XAttrsChanges message, length delimited. Does not implicitly {@link file.XAttrsChanges.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.XAttrsChanges
         * @static
         * @param {file.IXAttrsChanges} message XAttrsChanges message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        XAttrsChanges.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a XAttrsChanges message from the specified reader or buffer.
         * @function decode
         * @memberof file.XAttrsChanges
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.XAttrsChanges} XAttrsChanges
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        XAttrsChanges.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.XAttrsChanges();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.set && message.set.length))
                            message.set = [];
                        message.set.push($root.file.NameAndXAttrValue.decode(reader, reader.uint32(), undefined, long + 1));
                        break;
                    }
                case 2: {
                        if (!(message.remove && message.remove.length))
                            message.remove = [];
                        message.remove.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a XAttrsChanges message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.XAttrsChanges
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.XAttrsChanges} XAttrsChanges
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        XAttrsChanges.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a XAttrsChanges message.
         * @function verify
         * @memberof file.XAttrsChanges
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        XAttrsChanges.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.set != null && Object.hasOwnProperty.call(message, "set")) {
                if (!Array.isArray(message.set))
                    return "set: array expected";
                for (var i = 0; i < message.set.length; ++i) {
                    var error = $root.file.NameAndXAttrValue.verify(message.set[i], long + 1);
                    if (error)
                        return "set." + error;
                }
            }
            if (message.remove != null && Object.hasOwnProperty.call(message, "remove")) {
                if (!Array.isArray(message.remove))
                    return "remove: array expected";
                for (var i = 0; i < message.remove.length; ++i)
                    if (!$util.isString(message.remove[i]))
                        return "remove: string[] expected";
            }
            return null;
        };

        /**
         * Creates a XAttrsChanges message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.XAttrsChanges
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.XAttrsChanges} XAttrsChanges
         */
        XAttrsChanges.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.XAttrsChanges)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.XAttrsChanges: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.XAttrsChanges();
            if (object.set) {
                if (!Array.isArray(object.set))
                    throw TypeError(".file.XAttrsChanges.set: array expected");
                message.set = [];
                for (var i = 0; i < object.set.length; ++i) {
                    if (!$util.isObject(object.set[i]))
                        throw TypeError(".file.XAttrsChanges.set: object expected");
                    message.set[i] = $root.file.NameAndXAttrValue.fromObject(object.set[i], long + 1);
                }
            }
            if (object.remove) {
                if (!Array.isArray(object.remove))
                    throw TypeError(".file.XAttrsChanges.remove: array expected");
                message.remove = [];
                for (var i = 0; i < object.remove.length; ++i)
                    message.remove[i] = String(object.remove[i]);
            }
            return message;
        };

        /**
         * Creates a plain object from a XAttrsChanges message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.XAttrsChanges
         * @static
         * @param {file.XAttrsChanges} message XAttrsChanges
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        XAttrsChanges.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults) {
                object.set = [];
                object.remove = [];
            }
            if (message.set && message.set.length) {
                object.set = [];
                for (var j = 0; j < message.set.length; ++j)
                    object.set[j] = $root.file.NameAndXAttrValue.toObject(message.set[j], options, q + 1);
            }
            if (message.remove && message.remove.length) {
                object.remove = [];
                for (var j = 0; j < message.remove.length; ++j)
                    object.remove[j] = message.remove[j];
            }
            return object;
        };

        /**
         * Converts this XAttrsChanges to JSON.
         * @function toJSON
         * @memberof file.XAttrsChanges
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        XAttrsChanges.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for XAttrsChanges
         * @function getTypeUrl
         * @memberof file.XAttrsChanges
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        XAttrsChanges.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.XAttrsChanges";
        };

        return XAttrsChanges;
    })();

    file.WriteBytesRequestBody = (function() {

        /**
         * Properties of a WriteBytesRequestBody.
         * @memberof file
         * @interface IWriteBytesRequestBody
         * @property {Uint8Array|null} [bytes] WriteBytesRequestBody bytes
         */

        /**
         * Constructs a new WriteBytesRequestBody.
         * @memberof file
         * @classdesc Represents a WriteBytesRequestBody.
         * @implements IWriteBytesRequestBody
         * @constructor
         * @param {file.IWriteBytesRequestBody=} [properties] Properties to set
         */
        function WriteBytesRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * WriteBytesRequestBody bytes.
         * @member {Uint8Array} bytes
         * @memberof file.WriteBytesRequestBody
         * @instance
         */
        WriteBytesRequestBody.prototype.bytes = $util.newBuffer([]);

        /**
         * Creates a new WriteBytesRequestBody instance using the specified properties.
         * @function create
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {file.IWriteBytesRequestBody=} [properties] Properties to set
         * @returns {file.WriteBytesRequestBody} WriteBytesRequestBody instance
         */
        WriteBytesRequestBody.create = function create(properties) {
            return new WriteBytesRequestBody(properties);
        };

        /**
         * Encodes the specified WriteBytesRequestBody message. Does not implicitly {@link file.WriteBytesRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {file.IWriteBytesRequestBody} message WriteBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteBytesRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.bytes);
            return writer;
        };

        /**
         * Encodes the specified WriteBytesRequestBody message, length delimited. Does not implicitly {@link file.WriteBytesRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {file.IWriteBytesRequestBody} message WriteBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteBytesRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a WriteBytesRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.WriteBytesRequestBody} WriteBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteBytesRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.WriteBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.bytes = reader.bytes();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a WriteBytesRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.WriteBytesRequestBody} WriteBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteBytesRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a WriteBytesRequestBody message.
         * @function verify
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        WriteBytesRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                if (!(message.bytes && typeof message.bytes.length === "number" || $util.isString(message.bytes)))
                    return "bytes: buffer expected";
            return null;
        };

        /**
         * Creates a WriteBytesRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.WriteBytesRequestBody} WriteBytesRequestBody
         */
        WriteBytesRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.WriteBytesRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.WriteBytesRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.WriteBytesRequestBody();
            if (object.bytes != null)
                if (typeof object.bytes === "string")
                    $util.base64.decode(object.bytes, message.bytes = $util.newBuffer($util.base64.length(object.bytes)), 0);
                else if (object.bytes.length >= 0)
                    message.bytes = object.bytes;
            return message;
        };

        /**
         * Creates a plain object from a WriteBytesRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {file.WriteBytesRequestBody} message WriteBytesRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        WriteBytesRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if (options.bytes === String)
                    object.bytes = "";
                else {
                    object.bytes = [];
                    if (options.bytes !== Array)
                        object.bytes = $util.newBuffer(object.bytes);
                }
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = options.bytes === String ? $util.base64.encode(message.bytes, 0, message.bytes.length) : options.bytes === Array ? Array.prototype.slice.call(message.bytes) : message.bytes;
            return object;
        };

        /**
         * Converts this WriteBytesRequestBody to JSON.
         * @function toJSON
         * @memberof file.WriteBytesRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        WriteBytesRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for WriteBytesRequestBody
         * @function getTypeUrl
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        WriteBytesRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.WriteBytesRequestBody";
        };

        return WriteBytesRequestBody;
    })();

    file.WriteTxtRequestBody = (function() {

        /**
         * Properties of a WriteTxtRequestBody.
         * @memberof file
         * @interface IWriteTxtRequestBody
         * @property {string|null} [txt] WriteTxtRequestBody txt
         */

        /**
         * Constructs a new WriteTxtRequestBody.
         * @memberof file
         * @classdesc Represents a WriteTxtRequestBody.
         * @implements IWriteTxtRequestBody
         * @constructor
         * @param {file.IWriteTxtRequestBody=} [properties] Properties to set
         */
        function WriteTxtRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * WriteTxtRequestBody txt.
         * @member {string} txt
         * @memberof file.WriteTxtRequestBody
         * @instance
         */
        WriteTxtRequestBody.prototype.txt = "";

        /**
         * Creates a new WriteTxtRequestBody instance using the specified properties.
         * @function create
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {file.IWriteTxtRequestBody=} [properties] Properties to set
         * @returns {file.WriteTxtRequestBody} WriteTxtRequestBody instance
         */
        WriteTxtRequestBody.create = function create(properties) {
            return new WriteTxtRequestBody(properties);
        };

        /**
         * Encodes the specified WriteTxtRequestBody message. Does not implicitly {@link file.WriteTxtRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {file.IWriteTxtRequestBody} message WriteTxtRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteTxtRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.txt);
            return writer;
        };

        /**
         * Encodes the specified WriteTxtRequestBody message, length delimited. Does not implicitly {@link file.WriteTxtRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {file.IWriteTxtRequestBody} message WriteTxtRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteTxtRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a WriteTxtRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.WriteTxtRequestBody} WriteTxtRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteTxtRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.WriteTxtRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.txt = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a WriteTxtRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.WriteTxtRequestBody} WriteTxtRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteTxtRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a WriteTxtRequestBody message.
         * @function verify
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        WriteTxtRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                if (!$util.isString(message.txt))
                    return "txt: string expected";
            return null;
        };

        /**
         * Creates a WriteTxtRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.WriteTxtRequestBody} WriteTxtRequestBody
         */
        WriteTxtRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.WriteTxtRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.WriteTxtRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.WriteTxtRequestBody();
            if (object.txt != null)
                message.txt = String(object.txt);
            return message;
        };

        /**
         * Creates a plain object from a WriteTxtRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {file.WriteTxtRequestBody} message WriteTxtRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        WriteTxtRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.txt = "";
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                object.txt = message.txt;
            return object;
        };

        /**
         * Converts this WriteTxtRequestBody to JSON.
         * @function toJSON
         * @memberof file.WriteTxtRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        WriteTxtRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for WriteTxtRequestBody
         * @function getTypeUrl
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        WriteTxtRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.WriteTxtRequestBody";
        };

        return WriteTxtRequestBody;
    })();

    file.WriteJsonRequestBody = (function() {

        /**
         * Properties of a WriteJsonRequestBody.
         * @memberof file
         * @interface IWriteJsonRequestBody
         * @property {string|null} [json] WriteJsonRequestBody json
         */

        /**
         * Constructs a new WriteJsonRequestBody.
         * @memberof file
         * @classdesc Represents a WriteJsonRequestBody.
         * @implements IWriteJsonRequestBody
         * @constructor
         * @param {file.IWriteJsonRequestBody=} [properties] Properties to set
         */
        function WriteJsonRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * WriteJsonRequestBody json.
         * @member {string} json
         * @memberof file.WriteJsonRequestBody
         * @instance
         */
        WriteJsonRequestBody.prototype.json = "";

        /**
         * Creates a new WriteJsonRequestBody instance using the specified properties.
         * @function create
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {file.IWriteJsonRequestBody=} [properties] Properties to set
         * @returns {file.WriteJsonRequestBody} WriteJsonRequestBody instance
         */
        WriteJsonRequestBody.create = function create(properties) {
            return new WriteJsonRequestBody(properties);
        };

        /**
         * Encodes the specified WriteJsonRequestBody message. Does not implicitly {@link file.WriteJsonRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {file.IWriteJsonRequestBody} message WriteJsonRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteJsonRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.json);
            return writer;
        };

        /**
         * Encodes the specified WriteJsonRequestBody message, length delimited. Does not implicitly {@link file.WriteJsonRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {file.IWriteJsonRequestBody} message WriteJsonRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteJsonRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a WriteJsonRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.WriteJsonRequestBody} WriteJsonRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteJsonRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.WriteJsonRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.json = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a WriteJsonRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.WriteJsonRequestBody} WriteJsonRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteJsonRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a WriteJsonRequestBody message.
         * @function verify
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        WriteJsonRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                if (!$util.isString(message.json))
                    return "json: string expected";
            return null;
        };

        /**
         * Creates a WriteJsonRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.WriteJsonRequestBody} WriteJsonRequestBody
         */
        WriteJsonRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.WriteJsonRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.WriteJsonRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.WriteJsonRequestBody();
            if (object.json != null)
                message.json = String(object.json);
            return message;
        };

        /**
         * Creates a plain object from a WriteJsonRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {file.WriteJsonRequestBody} message WriteJsonRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        WriteJsonRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.json = "";
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = message.json;
            return object;
        };

        /**
         * Converts this WriteJsonRequestBody to JSON.
         * @function toJSON
         * @memberof file.WriteJsonRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        WriteJsonRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for WriteJsonRequestBody
         * @function getTypeUrl
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        WriteJsonRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.WriteJsonRequestBody";
        };

        return WriteJsonRequestBody;
    })();

    file.GetByteSinkRequestBody = (function() {

        /**
         * Properties of a GetByteSinkRequestBody.
         * @memberof file
         * @interface IGetByteSinkRequestBody
         * @property {common.IBooleanValue|null} [truncateFile] GetByteSinkRequestBody truncateFile
         */

        /**
         * Constructs a new GetByteSinkRequestBody.
         * @memberof file
         * @classdesc Represents a GetByteSinkRequestBody.
         * @implements IGetByteSinkRequestBody
         * @constructor
         * @param {file.IGetByteSinkRequestBody=} [properties] Properties to set
         */
        function GetByteSinkRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * GetByteSinkRequestBody truncateFile.
         * @member {common.IBooleanValue|null|undefined} truncateFile
         * @memberof file.GetByteSinkRequestBody
         * @instance
         */
        GetByteSinkRequestBody.prototype.truncateFile = null;

        /**
         * Creates a new GetByteSinkRequestBody instance using the specified properties.
         * @function create
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {file.IGetByteSinkRequestBody=} [properties] Properties to set
         * @returns {file.GetByteSinkRequestBody} GetByteSinkRequestBody instance
         */
        GetByteSinkRequestBody.create = function create(properties) {
            return new GetByteSinkRequestBody(properties);
        };

        /**
         * Encodes the specified GetByteSinkRequestBody message. Does not implicitly {@link file.GetByteSinkRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {file.IGetByteSinkRequestBody} message GetByteSinkRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        GetByteSinkRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.truncateFile != null && Object.hasOwnProperty.call(message, "truncateFile"))
                $root.common.BooleanValue.encode(message.truncateFile, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified GetByteSinkRequestBody message, length delimited. Does not implicitly {@link file.GetByteSinkRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {file.IGetByteSinkRequestBody} message GetByteSinkRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        GetByteSinkRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a GetByteSinkRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.GetByteSinkRequestBody} GetByteSinkRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        GetByteSinkRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.GetByteSinkRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.truncateFile = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a GetByteSinkRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.GetByteSinkRequestBody} GetByteSinkRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        GetByteSinkRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a GetByteSinkRequestBody message.
         * @function verify
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        GetByteSinkRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.truncateFile != null && Object.hasOwnProperty.call(message, "truncateFile")) {
                var error = $root.common.BooleanValue.verify(message.truncateFile, long + 1);
                if (error)
                    return "truncateFile." + error;
            }
            return null;
        };

        /**
         * Creates a GetByteSinkRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.GetByteSinkRequestBody} GetByteSinkRequestBody
         */
        GetByteSinkRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.GetByteSinkRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.GetByteSinkRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.GetByteSinkRequestBody();
            if (object.truncateFile != null) {
                if (!$util.isObject(object.truncateFile))
                    throw TypeError(".file.GetByteSinkRequestBody.truncateFile: object expected");
                message.truncateFile = $root.common.BooleanValue.fromObject(object.truncateFile, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a GetByteSinkRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {file.GetByteSinkRequestBody} message GetByteSinkRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        GetByteSinkRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.truncateFile = null;
            if (message.truncateFile != null && Object.hasOwnProperty.call(message, "truncateFile"))
                object.truncateFile = $root.common.BooleanValue.toObject(message.truncateFile, options, q + 1);
            return object;
        };

        /**
         * Converts this GetByteSinkRequestBody to JSON.
         * @function toJSON
         * @memberof file.GetByteSinkRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        GetByteSinkRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for GetByteSinkRequestBody
         * @function getTypeUrl
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        GetByteSinkRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.GetByteSinkRequestBody";
        };

        return GetByteSinkRequestBody;
    })();

    file.CopyRequestBody = (function() {

        /**
         * Properties of a CopyRequestBody.
         * @memberof file
         * @interface ICopyRequestBody
         * @property {common.IObjectReference|null} [file] CopyRequestBody file
         */

        /**
         * Constructs a new CopyRequestBody.
         * @memberof file
         * @classdesc Represents a CopyRequestBody.
         * @implements ICopyRequestBody
         * @constructor
         * @param {file.ICopyRequestBody=} [properties] Properties to set
         */
        function CopyRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * CopyRequestBody file.
         * @member {common.IObjectReference|null|undefined} file
         * @memberof file.CopyRequestBody
         * @instance
         */
        CopyRequestBody.prototype.file = null;

        /**
         * Creates a new CopyRequestBody instance using the specified properties.
         * @function create
         * @memberof file.CopyRequestBody
         * @static
         * @param {file.ICopyRequestBody=} [properties] Properties to set
         * @returns {file.CopyRequestBody} CopyRequestBody instance
         */
        CopyRequestBody.create = function create(properties) {
            return new CopyRequestBody(properties);
        };

        /**
         * Encodes the specified CopyRequestBody message. Does not implicitly {@link file.CopyRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.CopyRequestBody
         * @static
         * @param {file.ICopyRequestBody} message CopyRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CopyRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                $root.common.ObjectReference.encode(message.file, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified CopyRequestBody message, length delimited. Does not implicitly {@link file.CopyRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.CopyRequestBody
         * @static
         * @param {file.ICopyRequestBody} message CopyRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CopyRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a CopyRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.CopyRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.CopyRequestBody} CopyRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CopyRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.CopyRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.file = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a CopyRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.CopyRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.CopyRequestBody} CopyRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CopyRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a CopyRequestBody message.
         * @function verify
         * @memberof file.CopyRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        CopyRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.file != null && Object.hasOwnProperty.call(message, "file")) {
                var error = $root.common.ObjectReference.verify(message.file, long + 1);
                if (error)
                    return "file." + error;
            }
            return null;
        };

        /**
         * Creates a CopyRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.CopyRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.CopyRequestBody} CopyRequestBody
         */
        CopyRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.CopyRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.CopyRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.CopyRequestBody();
            if (object.file != null) {
                if (!$util.isObject(object.file))
                    throw TypeError(".file.CopyRequestBody.file: object expected");
                message.file = $root.common.ObjectReference.fromObject(object.file, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a CopyRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.CopyRequestBody
         * @static
         * @param {file.CopyRequestBody} message CopyRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        CopyRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.file = null;
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                object.file = $root.common.ObjectReference.toObject(message.file, options, q + 1);
            return object;
        };

        /**
         * Converts this CopyRequestBody to JSON.
         * @function toJSON
         * @memberof file.CopyRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        CopyRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for CopyRequestBody
         * @function getTypeUrl
         * @memberof file.CopyRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        CopyRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.CopyRequestBody";
        };

        return CopyRequestBody;
    })();

    file.VersionedGetByteSinkRequestBody = (function() {

        /**
         * Properties of a VersionedGetByteSinkRequestBody.
         * @memberof file
         * @interface IVersionedGetByteSinkRequestBody
         * @property {common.IBooleanValue|null} [truncateFile] VersionedGetByteSinkRequestBody truncateFile
         * @property {common.IUInt64Value|null} [currentVersion] VersionedGetByteSinkRequestBody currentVersion
         */

        /**
         * Constructs a new VersionedGetByteSinkRequestBody.
         * @memberof file
         * @classdesc Represents a VersionedGetByteSinkRequestBody.
         * @implements IVersionedGetByteSinkRequestBody
         * @constructor
         * @param {file.IVersionedGetByteSinkRequestBody=} [properties] Properties to set
         */
        function VersionedGetByteSinkRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedGetByteSinkRequestBody truncateFile.
         * @member {common.IBooleanValue|null|undefined} truncateFile
         * @memberof file.VersionedGetByteSinkRequestBody
         * @instance
         */
        VersionedGetByteSinkRequestBody.prototype.truncateFile = null;

        /**
         * VersionedGetByteSinkRequestBody currentVersion.
         * @member {common.IUInt64Value|null|undefined} currentVersion
         * @memberof file.VersionedGetByteSinkRequestBody
         * @instance
         */
        VersionedGetByteSinkRequestBody.prototype.currentVersion = null;

        /**
         * Creates a new VersionedGetByteSinkRequestBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {file.IVersionedGetByteSinkRequestBody=} [properties] Properties to set
         * @returns {file.VersionedGetByteSinkRequestBody} VersionedGetByteSinkRequestBody instance
         */
        VersionedGetByteSinkRequestBody.create = function create(properties) {
            return new VersionedGetByteSinkRequestBody(properties);
        };

        /**
         * Encodes the specified VersionedGetByteSinkRequestBody message. Does not implicitly {@link file.VersionedGetByteSinkRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {file.IVersionedGetByteSinkRequestBody} message VersionedGetByteSinkRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetByteSinkRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.truncateFile != null && Object.hasOwnProperty.call(message, "truncateFile"))
                $root.common.BooleanValue.encode(message.truncateFile, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                $root.common.UInt64Value.encode(message.currentVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedGetByteSinkRequestBody message, length delimited. Does not implicitly {@link file.VersionedGetByteSinkRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {file.IVersionedGetByteSinkRequestBody} message VersionedGetByteSinkRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetByteSinkRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedGetByteSinkRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedGetByteSinkRequestBody} VersionedGetByteSinkRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetByteSinkRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetByteSinkRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.truncateFile = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.currentVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedGetByteSinkRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedGetByteSinkRequestBody} VersionedGetByteSinkRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetByteSinkRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedGetByteSinkRequestBody message.
         * @function verify
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedGetByteSinkRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.truncateFile != null && Object.hasOwnProperty.call(message, "truncateFile")) {
                var error = $root.common.BooleanValue.verify(message.truncateFile, long + 1);
                if (error)
                    return "truncateFile." + error;
            }
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion")) {
                var error = $root.common.UInt64Value.verify(message.currentVersion, long + 1);
                if (error)
                    return "currentVersion." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedGetByteSinkRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedGetByteSinkRequestBody} VersionedGetByteSinkRequestBody
         */
        VersionedGetByteSinkRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedGetByteSinkRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedGetByteSinkRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedGetByteSinkRequestBody();
            if (object.truncateFile != null) {
                if (!$util.isObject(object.truncateFile))
                    throw TypeError(".file.VersionedGetByteSinkRequestBody.truncateFile: object expected");
                message.truncateFile = $root.common.BooleanValue.fromObject(object.truncateFile, long + 1);
            }
            if (object.currentVersion != null) {
                if (!$util.isObject(object.currentVersion))
                    throw TypeError(".file.VersionedGetByteSinkRequestBody.currentVersion: object expected");
                message.currentVersion = $root.common.UInt64Value.fromObject(object.currentVersion, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedGetByteSinkRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {file.VersionedGetByteSinkRequestBody} message VersionedGetByteSinkRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedGetByteSinkRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.truncateFile = null;
                object.currentVersion = null;
            }
            if (message.truncateFile != null && Object.hasOwnProperty.call(message, "truncateFile"))
                object.truncateFile = $root.common.BooleanValue.toObject(message.truncateFile, options, q + 1);
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                object.currentVersion = $root.common.UInt64Value.toObject(message.currentVersion, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedGetByteSinkRequestBody to JSON.
         * @function toJSON
         * @memberof file.VersionedGetByteSinkRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedGetByteSinkRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedGetByteSinkRequestBody
         * @function getTypeUrl
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedGetByteSinkRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedGetByteSinkRequestBody";
        };

        return VersionedGetByteSinkRequestBody;
    })();

    file.VersionedGetByteSinkReplyBody = (function() {

        /**
         * Properties of a VersionedGetByteSinkReplyBody.
         * @memberof file
         * @interface IVersionedGetByteSinkReplyBody
         * @property {number|Long|null} [version] VersionedGetByteSinkReplyBody version
         * @property {common.IObjectReference|null} [sink] VersionedGetByteSinkReplyBody sink
         */

        /**
         * Constructs a new VersionedGetByteSinkReplyBody.
         * @memberof file
         * @classdesc Represents a VersionedGetByteSinkReplyBody.
         * @implements IVersionedGetByteSinkReplyBody
         * @constructor
         * @param {file.IVersionedGetByteSinkReplyBody=} [properties] Properties to set
         */
        function VersionedGetByteSinkReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedGetByteSinkReplyBody version.
         * @member {number|Long} version
         * @memberof file.VersionedGetByteSinkReplyBody
         * @instance
         */
        VersionedGetByteSinkReplyBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * VersionedGetByteSinkReplyBody sink.
         * @member {common.IObjectReference|null|undefined} sink
         * @memberof file.VersionedGetByteSinkReplyBody
         * @instance
         */
        VersionedGetByteSinkReplyBody.prototype.sink = null;

        /**
         * Creates a new VersionedGetByteSinkReplyBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {file.IVersionedGetByteSinkReplyBody=} [properties] Properties to set
         * @returns {file.VersionedGetByteSinkReplyBody} VersionedGetByteSinkReplyBody instance
         */
        VersionedGetByteSinkReplyBody.create = function create(properties) {
            return new VersionedGetByteSinkReplyBody(properties);
        };

        /**
         * Encodes the specified VersionedGetByteSinkReplyBody message. Does not implicitly {@link file.VersionedGetByteSinkReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {file.IVersionedGetByteSinkReplyBody} message VersionedGetByteSinkReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetByteSinkReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            if (message.sink != null && Object.hasOwnProperty.call(message, "sink"))
                $root.common.ObjectReference.encode(message.sink, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedGetByteSinkReplyBody message, length delimited. Does not implicitly {@link file.VersionedGetByteSinkReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {file.IVersionedGetByteSinkReplyBody} message VersionedGetByteSinkReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetByteSinkReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedGetByteSinkReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedGetByteSinkReplyBody} VersionedGetByteSinkReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetByteSinkReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetByteSinkReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.sink = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedGetByteSinkReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedGetByteSinkReplyBody} VersionedGetByteSinkReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetByteSinkReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedGetByteSinkReplyBody message.
         * @function verify
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedGetByteSinkReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            if (message.sink != null && Object.hasOwnProperty.call(message, "sink")) {
                var error = $root.common.ObjectReference.verify(message.sink, long + 1);
                if (error)
                    return "sink." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedGetByteSinkReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedGetByteSinkReplyBody} VersionedGetByteSinkReplyBody
         */
        VersionedGetByteSinkReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedGetByteSinkReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedGetByteSinkReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedGetByteSinkReplyBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            if (object.sink != null) {
                if (!$util.isObject(object.sink))
                    throw TypeError(".file.VersionedGetByteSinkReplyBody.sink: object expected");
                message.sink = $root.common.ObjectReference.fromObject(object.sink, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedGetByteSinkReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {file.VersionedGetByteSinkReplyBody} message VersionedGetByteSinkReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedGetByteSinkReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.sink = null;
            }
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            if (message.sink != null && Object.hasOwnProperty.call(message, "sink"))
                object.sink = $root.common.ObjectReference.toObject(message.sink, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedGetByteSinkReplyBody to JSON.
         * @function toJSON
         * @memberof file.VersionedGetByteSinkReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedGetByteSinkReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedGetByteSinkReplyBody
         * @function getTypeUrl
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedGetByteSinkReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedGetByteSinkReplyBody";
        };

        return VersionedGetByteSinkReplyBody;
    })();

    file.ArchiveCurrentRequestBody = (function() {

        /**
         * Properties of an ArchiveCurrentRequestBody.
         * @memberof file
         * @interface IArchiveCurrentRequestBody
         * @property {common.IUInt64Value|null} [version] ArchiveCurrentRequestBody version
         */

        /**
         * Constructs a new ArchiveCurrentRequestBody.
         * @memberof file
         * @classdesc Represents an ArchiveCurrentRequestBody.
         * @implements IArchiveCurrentRequestBody
         * @constructor
         * @param {file.IArchiveCurrentRequestBody=} [properties] Properties to set
         */
        function ArchiveCurrentRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ArchiveCurrentRequestBody version.
         * @member {common.IUInt64Value|null|undefined} version
         * @memberof file.ArchiveCurrentRequestBody
         * @instance
         */
        ArchiveCurrentRequestBody.prototype.version = null;

        /**
         * Creates a new ArchiveCurrentRequestBody instance using the specified properties.
         * @function create
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {file.IArchiveCurrentRequestBody=} [properties] Properties to set
         * @returns {file.ArchiveCurrentRequestBody} ArchiveCurrentRequestBody instance
         */
        ArchiveCurrentRequestBody.create = function create(properties) {
            return new ArchiveCurrentRequestBody(properties);
        };

        /**
         * Encodes the specified ArchiveCurrentRequestBody message. Does not implicitly {@link file.ArchiveCurrentRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {file.IArchiveCurrentRequestBody} message ArchiveCurrentRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ArchiveCurrentRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                $root.common.UInt64Value.encode(message.version, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified ArchiveCurrentRequestBody message, length delimited. Does not implicitly {@link file.ArchiveCurrentRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {file.IArchiveCurrentRequestBody} message ArchiveCurrentRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ArchiveCurrentRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an ArchiveCurrentRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.ArchiveCurrentRequestBody} ArchiveCurrentRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ArchiveCurrentRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ArchiveCurrentRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an ArchiveCurrentRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.ArchiveCurrentRequestBody} ArchiveCurrentRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ArchiveCurrentRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an ArchiveCurrentRequestBody message.
         * @function verify
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ArchiveCurrentRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version")) {
                var error = $root.common.UInt64Value.verify(message.version, long + 1);
                if (error)
                    return "version." + error;
            }
            return null;
        };

        /**
         * Creates an ArchiveCurrentRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.ArchiveCurrentRequestBody} ArchiveCurrentRequestBody
         */
        ArchiveCurrentRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.ArchiveCurrentRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.ArchiveCurrentRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.ArchiveCurrentRequestBody();
            if (object.version != null) {
                if (!$util.isObject(object.version))
                    throw TypeError(".file.ArchiveCurrentRequestBody.version: object expected");
                message.version = $root.common.UInt64Value.fromObject(object.version, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an ArchiveCurrentRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {file.ArchiveCurrentRequestBody} message ArchiveCurrentRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ArchiveCurrentRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.version = null;
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                object.version = $root.common.UInt64Value.toObject(message.version, options, q + 1);
            return object;
        };

        /**
         * Converts this ArchiveCurrentRequestBody to JSON.
         * @function toJSON
         * @memberof file.ArchiveCurrentRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ArchiveCurrentRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ArchiveCurrentRequestBody
         * @function getTypeUrl
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ArchiveCurrentRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.ArchiveCurrentRequestBody";
        };

        return ArchiveCurrentRequestBody;
    })();

    file.FileSyncIsOnDiskRequestBody = (function() {

        /**
         * Properties of a FileSyncIsOnDiskRequestBody.
         * @memberof file
         * @interface IFileSyncIsOnDiskRequestBody
         * @property {number|Long|null} [version] FileSyncIsOnDiskRequestBody version
         */

        /**
         * Constructs a new FileSyncIsOnDiskRequestBody.
         * @memberof file
         * @classdesc Represents a FileSyncIsOnDiskRequestBody.
         * @implements IFileSyncIsOnDiskRequestBody
         * @constructor
         * @param {file.IFileSyncIsOnDiskRequestBody=} [properties] Properties to set
         */
        function FileSyncIsOnDiskRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileSyncIsOnDiskRequestBody version.
         * @member {number|Long} version
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @instance
         */
        FileSyncIsOnDiskRequestBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new FileSyncIsOnDiskRequestBody instance using the specified properties.
         * @function create
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {file.IFileSyncIsOnDiskRequestBody=} [properties] Properties to set
         * @returns {file.FileSyncIsOnDiskRequestBody} FileSyncIsOnDiskRequestBody instance
         */
        FileSyncIsOnDiskRequestBody.create = function create(properties) {
            return new FileSyncIsOnDiskRequestBody(properties);
        };

        /**
         * Encodes the specified FileSyncIsOnDiskRequestBody message. Does not implicitly {@link file.FileSyncIsOnDiskRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {file.IFileSyncIsOnDiskRequestBody} message FileSyncIsOnDiskRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncIsOnDiskRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            return writer;
        };

        /**
         * Encodes the specified FileSyncIsOnDiskRequestBody message, length delimited. Does not implicitly {@link file.FileSyncIsOnDiskRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {file.IFileSyncIsOnDiskRequestBody} message FileSyncIsOnDiskRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncIsOnDiskRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileSyncIsOnDiskRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileSyncIsOnDiskRequestBody} FileSyncIsOnDiskRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncIsOnDiskRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncIsOnDiskRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileSyncIsOnDiskRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.FileSyncIsOnDiskRequestBody} FileSyncIsOnDiskRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncIsOnDiskRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileSyncIsOnDiskRequestBody message.
         * @function verify
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileSyncIsOnDiskRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            return null;
        };

        /**
         * Creates a FileSyncIsOnDiskRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileSyncIsOnDiskRequestBody} FileSyncIsOnDiskRequestBody
         */
        FileSyncIsOnDiskRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.FileSyncIsOnDiskRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.FileSyncIsOnDiskRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.FileSyncIsOnDiskRequestBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from a FileSyncIsOnDiskRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {file.FileSyncIsOnDiskRequestBody} message FileSyncIsOnDiskRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileSyncIsOnDiskRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            return object;
        };

        /**
         * Converts this FileSyncIsOnDiskRequestBody to JSON.
         * @function toJSON
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileSyncIsOnDiskRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileSyncIsOnDiskRequestBody
         * @function getTypeUrl
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileSyncIsOnDiskRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.FileSyncIsOnDiskRequestBody";
        };

        return FileSyncIsOnDiskRequestBody;
    })();

    file.FileSyncIsOnDiskReplyBody = (function() {

        /**
         * Properties of a FileSyncIsOnDiskReplyBody.
         * @memberof file
         * @interface IFileSyncIsOnDiskReplyBody
         * @property {string|null} [status] FileSyncIsOnDiskReplyBody status
         */

        /**
         * Constructs a new FileSyncIsOnDiskReplyBody.
         * @memberof file
         * @classdesc Represents a FileSyncIsOnDiskReplyBody.
         * @implements IFileSyncIsOnDiskReplyBody
         * @constructor
         * @param {file.IFileSyncIsOnDiskReplyBody=} [properties] Properties to set
         */
        function FileSyncIsOnDiskReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileSyncIsOnDiskReplyBody status.
         * @member {string} status
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @instance
         */
        FileSyncIsOnDiskReplyBody.prototype.status = "";

        /**
         * Creates a new FileSyncIsOnDiskReplyBody instance using the specified properties.
         * @function create
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {file.IFileSyncIsOnDiskReplyBody=} [properties] Properties to set
         * @returns {file.FileSyncIsOnDiskReplyBody} FileSyncIsOnDiskReplyBody instance
         */
        FileSyncIsOnDiskReplyBody.create = function create(properties) {
            return new FileSyncIsOnDiskReplyBody(properties);
        };

        /**
         * Encodes the specified FileSyncIsOnDiskReplyBody message. Does not implicitly {@link file.FileSyncIsOnDiskReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {file.IFileSyncIsOnDiskReplyBody} message FileSyncIsOnDiskReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncIsOnDiskReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.status != null && Object.hasOwnProperty.call(message, "status"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.status);
            return writer;
        };

        /**
         * Encodes the specified FileSyncIsOnDiskReplyBody message, length delimited. Does not implicitly {@link file.FileSyncIsOnDiskReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {file.IFileSyncIsOnDiskReplyBody} message FileSyncIsOnDiskReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncIsOnDiskReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileSyncIsOnDiskReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileSyncIsOnDiskReplyBody} FileSyncIsOnDiskReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncIsOnDiskReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncIsOnDiskReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.status = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileSyncIsOnDiskReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.FileSyncIsOnDiskReplyBody} FileSyncIsOnDiskReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncIsOnDiskReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileSyncIsOnDiskReplyBody message.
         * @function verify
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileSyncIsOnDiskReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.status != null && Object.hasOwnProperty.call(message, "status"))
                if (!$util.isString(message.status))
                    return "status: string expected";
            return null;
        };

        /**
         * Creates a FileSyncIsOnDiskReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileSyncIsOnDiskReplyBody} FileSyncIsOnDiskReplyBody
         */
        FileSyncIsOnDiskReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.FileSyncIsOnDiskReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.FileSyncIsOnDiskReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.FileSyncIsOnDiskReplyBody();
            if (object.status != null)
                message.status = String(object.status);
            return message;
        };

        /**
         * Creates a plain object from a FileSyncIsOnDiskReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {file.FileSyncIsOnDiskReplyBody} message FileSyncIsOnDiskReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileSyncIsOnDiskReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.status = "";
            if (message.status != null && Object.hasOwnProperty.call(message, "status"))
                object.status = message.status;
            return object;
        };

        /**
         * Converts this FileSyncIsOnDiskReplyBody to JSON.
         * @function toJSON
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileSyncIsOnDiskReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileSyncIsOnDiskReplyBody
         * @function getTypeUrl
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileSyncIsOnDiskReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.FileSyncIsOnDiskReplyBody";
        };

        return FileSyncIsOnDiskReplyBody;
    })();

    file.FileSyncStartDownloadRequestBody = (function() {

        /**
         * Properties of a FileSyncStartDownloadRequestBody.
         * @memberof file
         * @interface IFileSyncStartDownloadRequestBody
         * @property {number|Long|null} [version] FileSyncStartDownloadRequestBody version
         */

        /**
         * Constructs a new FileSyncStartDownloadRequestBody.
         * @memberof file
         * @classdesc Represents a FileSyncStartDownloadRequestBody.
         * @implements IFileSyncStartDownloadRequestBody
         * @constructor
         * @param {file.IFileSyncStartDownloadRequestBody=} [properties] Properties to set
         */
        function FileSyncStartDownloadRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileSyncStartDownloadRequestBody version.
         * @member {number|Long} version
         * @memberof file.FileSyncStartDownloadRequestBody
         * @instance
         */
        FileSyncStartDownloadRequestBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new FileSyncStartDownloadRequestBody instance using the specified properties.
         * @function create
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {file.IFileSyncStartDownloadRequestBody=} [properties] Properties to set
         * @returns {file.FileSyncStartDownloadRequestBody} FileSyncStartDownloadRequestBody instance
         */
        FileSyncStartDownloadRequestBody.create = function create(properties) {
            return new FileSyncStartDownloadRequestBody(properties);
        };

        /**
         * Encodes the specified FileSyncStartDownloadRequestBody message. Does not implicitly {@link file.FileSyncStartDownloadRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {file.IFileSyncStartDownloadRequestBody} message FileSyncStartDownloadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncStartDownloadRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            return writer;
        };

        /**
         * Encodes the specified FileSyncStartDownloadRequestBody message, length delimited. Does not implicitly {@link file.FileSyncStartDownloadRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {file.IFileSyncStartDownloadRequestBody} message FileSyncStartDownloadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncStartDownloadRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileSyncStartDownloadRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileSyncStartDownloadRequestBody} FileSyncStartDownloadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncStartDownloadRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncStartDownloadRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileSyncStartDownloadRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.FileSyncStartDownloadRequestBody} FileSyncStartDownloadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncStartDownloadRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileSyncStartDownloadRequestBody message.
         * @function verify
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileSyncStartDownloadRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            return null;
        };

        /**
         * Creates a FileSyncStartDownloadRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileSyncStartDownloadRequestBody} FileSyncStartDownloadRequestBody
         */
        FileSyncStartDownloadRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.FileSyncStartDownloadRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.FileSyncStartDownloadRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.FileSyncStartDownloadRequestBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from a FileSyncStartDownloadRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {file.FileSyncStartDownloadRequestBody} message FileSyncStartDownloadRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileSyncStartDownloadRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            return object;
        };

        /**
         * Converts this FileSyncStartDownloadRequestBody to JSON.
         * @function toJSON
         * @memberof file.FileSyncStartDownloadRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileSyncStartDownloadRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileSyncStartDownloadRequestBody
         * @function getTypeUrl
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileSyncStartDownloadRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.FileSyncStartDownloadRequestBody";
        };

        return FileSyncStartDownloadRequestBody;
    })();

    file.FileSyncStartDownloadReplyBody = (function() {

        /**
         * Properties of a FileSyncStartDownloadReplyBody.
         * @memberof file
         * @interface IFileSyncStartDownloadReplyBody
         * @property {file.FileSyncStartDownloadReplyBody.IDownloadInfo|null} [startedDownload] FileSyncStartDownloadReplyBody startedDownload
         */

        /**
         * Constructs a new FileSyncStartDownloadReplyBody.
         * @memberof file
         * @classdesc Represents a FileSyncStartDownloadReplyBody.
         * @implements IFileSyncStartDownloadReplyBody
         * @constructor
         * @param {file.IFileSyncStartDownloadReplyBody=} [properties] Properties to set
         */
        function FileSyncStartDownloadReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileSyncStartDownloadReplyBody startedDownload.
         * @member {file.FileSyncStartDownloadReplyBody.IDownloadInfo|null|undefined} startedDownload
         * @memberof file.FileSyncStartDownloadReplyBody
         * @instance
         */
        FileSyncStartDownloadReplyBody.prototype.startedDownload = null;

        /**
         * Creates a new FileSyncStartDownloadReplyBody instance using the specified properties.
         * @function create
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {file.IFileSyncStartDownloadReplyBody=} [properties] Properties to set
         * @returns {file.FileSyncStartDownloadReplyBody} FileSyncStartDownloadReplyBody instance
         */
        FileSyncStartDownloadReplyBody.create = function create(properties) {
            return new FileSyncStartDownloadReplyBody(properties);
        };

        /**
         * Encodes the specified FileSyncStartDownloadReplyBody message. Does not implicitly {@link file.FileSyncStartDownloadReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {file.IFileSyncStartDownloadReplyBody} message FileSyncStartDownloadReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncStartDownloadReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.startedDownload != null && Object.hasOwnProperty.call(message, "startedDownload"))
                $root.file.FileSyncStartDownloadReplyBody.DownloadInfo.encode(message.startedDownload, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FileSyncStartDownloadReplyBody message, length delimited. Does not implicitly {@link file.FileSyncStartDownloadReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {file.IFileSyncStartDownloadReplyBody} message FileSyncStartDownloadReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncStartDownloadReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileSyncStartDownloadReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileSyncStartDownloadReplyBody} FileSyncStartDownloadReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncStartDownloadReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncStartDownloadReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.startedDownload = $root.file.FileSyncStartDownloadReplyBody.DownloadInfo.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileSyncStartDownloadReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.FileSyncStartDownloadReplyBody} FileSyncStartDownloadReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncStartDownloadReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileSyncStartDownloadReplyBody message.
         * @function verify
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileSyncStartDownloadReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.startedDownload != null && Object.hasOwnProperty.call(message, "startedDownload")) {
                var error = $root.file.FileSyncStartDownloadReplyBody.DownloadInfo.verify(message.startedDownload, long + 1);
                if (error)
                    return "startedDownload." + error;
            }
            return null;
        };

        /**
         * Creates a FileSyncStartDownloadReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileSyncStartDownloadReplyBody} FileSyncStartDownloadReplyBody
         */
        FileSyncStartDownloadReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.FileSyncStartDownloadReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.FileSyncStartDownloadReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.FileSyncStartDownloadReplyBody();
            if (object.startedDownload != null) {
                if (!$util.isObject(object.startedDownload))
                    throw TypeError(".file.FileSyncStartDownloadReplyBody.startedDownload: object expected");
                message.startedDownload = $root.file.FileSyncStartDownloadReplyBody.DownloadInfo.fromObject(object.startedDownload, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a FileSyncStartDownloadReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {file.FileSyncStartDownloadReplyBody} message FileSyncStartDownloadReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileSyncStartDownloadReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.startedDownload = null;
            if (message.startedDownload != null && Object.hasOwnProperty.call(message, "startedDownload"))
                object.startedDownload = $root.file.FileSyncStartDownloadReplyBody.DownloadInfo.toObject(message.startedDownload, options, q + 1);
            return object;
        };

        /**
         * Converts this FileSyncStartDownloadReplyBody to JSON.
         * @function toJSON
         * @memberof file.FileSyncStartDownloadReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileSyncStartDownloadReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileSyncStartDownloadReplyBody
         * @function getTypeUrl
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileSyncStartDownloadReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.FileSyncStartDownloadReplyBody";
        };

        FileSyncStartDownloadReplyBody.DownloadInfo = (function() {

            /**
             * Properties of a DownloadInfo.
             * @memberof file.FileSyncStartDownloadReplyBody
             * @interface IDownloadInfo
             * @property {number|Long|null} [downloadTaskId] DownloadInfo downloadTaskId
             */

            /**
             * Constructs a new DownloadInfo.
             * @memberof file.FileSyncStartDownloadReplyBody
             * @classdesc Represents a DownloadInfo.
             * @implements IDownloadInfo
             * @constructor
             * @param {file.FileSyncStartDownloadReplyBody.IDownloadInfo=} [properties] Properties to set
             */
            function DownloadInfo(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * DownloadInfo downloadTaskId.
             * @member {number|Long} downloadTaskId
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @instance
             */
            DownloadInfo.prototype.downloadTaskId = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

            /**
             * Creates a new DownloadInfo instance using the specified properties.
             * @function create
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {file.FileSyncStartDownloadReplyBody.IDownloadInfo=} [properties] Properties to set
             * @returns {file.FileSyncStartDownloadReplyBody.DownloadInfo} DownloadInfo instance
             */
            DownloadInfo.create = function create(properties) {
                return new DownloadInfo(properties);
            };

            /**
             * Encodes the specified DownloadInfo message. Does not implicitly {@link file.FileSyncStartDownloadReplyBody.DownloadInfo.verify|verify} messages.
             * @function encode
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {file.FileSyncStartDownloadReplyBody.IDownloadInfo} message DownloadInfo message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            DownloadInfo.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.downloadTaskId != null && Object.hasOwnProperty.call(message, "downloadTaskId"))
                    writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.downloadTaskId);
                return writer;
            };

            /**
             * Encodes the specified DownloadInfo message, length delimited. Does not implicitly {@link file.FileSyncStartDownloadReplyBody.DownloadInfo.verify|verify} messages.
             * @function encodeDelimited
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {file.FileSyncStartDownloadReplyBody.IDownloadInfo} message DownloadInfo message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            DownloadInfo.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes a DownloadInfo message from the specified reader or buffer.
             * @function decode
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {file.FileSyncStartDownloadReplyBody.DownloadInfo} DownloadInfo
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            DownloadInfo.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncStartDownloadReplyBody.DownloadInfo();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 2: {
                            message.downloadTaskId = reader.uint64();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a DownloadInfo message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {file.FileSyncStartDownloadReplyBody.DownloadInfo} DownloadInfo
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            DownloadInfo.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a DownloadInfo message.
             * @function verify
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            DownloadInfo.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.downloadTaskId != null && Object.hasOwnProperty.call(message, "downloadTaskId"))
                    if (!$util.isInteger(message.downloadTaskId) && !(message.downloadTaskId && $util.isInteger(message.downloadTaskId.low) && $util.isInteger(message.downloadTaskId.high)))
                        return "downloadTaskId: integer|Long expected";
                return null;
            };

            /**
             * Creates a DownloadInfo message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {file.FileSyncStartDownloadReplyBody.DownloadInfo} DownloadInfo
             */
            DownloadInfo.fromObject = function fromObject(object, long) {
                if (object instanceof $root.file.FileSyncStartDownloadReplyBody.DownloadInfo)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".file.FileSyncStartDownloadReplyBody.DownloadInfo: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.file.FileSyncStartDownloadReplyBody.DownloadInfo();
                if (object.downloadTaskId != null)
                    if ($util.Long)
                        message.downloadTaskId = $util.Long.fromValue(object.downloadTaskId, true);
                    else if (typeof object.downloadTaskId === "string")
                        message.downloadTaskId = parseInt(object.downloadTaskId, 10);
                    else if (typeof object.downloadTaskId === "number")
                        message.downloadTaskId = object.downloadTaskId;
                    else if (typeof object.downloadTaskId === "object")
                        message.downloadTaskId = new $util.LongBits(object.downloadTaskId.low >>> 0, object.downloadTaskId.high >>> 0).toNumber(true);
                return message;
            };

            /**
             * Creates a plain object from a DownloadInfo message. Also converts values to other types if specified.
             * @function toObject
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {file.FileSyncStartDownloadReplyBody.DownloadInfo} message DownloadInfo
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            DownloadInfo.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults)
                    if ($util.Long) {
                        var long = new $util.Long(0, 0, true);
                        object.downloadTaskId = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                    } else
                        object.downloadTaskId = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                if (message.downloadTaskId != null && Object.hasOwnProperty.call(message, "downloadTaskId"))
                    if (typeof BigInt !== "undefined" && options.longs === BigInt)
                        object.downloadTaskId = typeof message.downloadTaskId === "number" ? BigInt(message.downloadTaskId) : $util.Long.fromBits(message.downloadTaskId.low >>> 0, message.downloadTaskId.high >>> 0, true).toBigInt();
                    else if (typeof message.downloadTaskId === "number")
                        object.downloadTaskId = options.longs === String ? String(message.downloadTaskId) : message.downloadTaskId;
                    else
                        object.downloadTaskId = options.longs === String ? $util.Long.prototype.toString.call(message.downloadTaskId) : options.longs === Number ? new $util.LongBits(message.downloadTaskId.low >>> 0, message.downloadTaskId.high >>> 0).toNumber(true) : message.downloadTaskId;
                return object;
            };

            /**
             * Converts this DownloadInfo to JSON.
             * @function toJSON
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            DownloadInfo.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for DownloadInfo
             * @function getTypeUrl
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            DownloadInfo.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/file.FileSyncStartDownloadReplyBody.DownloadInfo";
            };

            return DownloadInfo;
        })();

        return FileSyncStartDownloadReplyBody;
    })();

    file.AdoptRemoteRequestBody = (function() {

        /**
         * Properties of an AdoptRemoteRequestBody.
         * @memberof file
         * @interface IAdoptRemoteRequestBody
         * @property {file.IOptionsToAdopteRemote|null} [opts] AdoptRemoteRequestBody opts
         */

        /**
         * Constructs a new AdoptRemoteRequestBody.
         * @memberof file
         * @classdesc Represents an AdoptRemoteRequestBody.
         * @implements IAdoptRemoteRequestBody
         * @constructor
         * @param {file.IAdoptRemoteRequestBody=} [properties] Properties to set
         */
        function AdoptRemoteRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * AdoptRemoteRequestBody opts.
         * @member {file.IOptionsToAdopteRemote|null|undefined} opts
         * @memberof file.AdoptRemoteRequestBody
         * @instance
         */
        AdoptRemoteRequestBody.prototype.opts = null;

        /**
         * Creates a new AdoptRemoteRequestBody instance using the specified properties.
         * @function create
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {file.IAdoptRemoteRequestBody=} [properties] Properties to set
         * @returns {file.AdoptRemoteRequestBody} AdoptRemoteRequestBody instance
         */
        AdoptRemoteRequestBody.create = function create(properties) {
            return new AdoptRemoteRequestBody(properties);
        };

        /**
         * Encodes the specified AdoptRemoteRequestBody message. Does not implicitly {@link file.AdoptRemoteRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {file.IAdoptRemoteRequestBody} message AdoptRemoteRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AdoptRemoteRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.file.OptionsToAdopteRemote.encode(message.opts, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified AdoptRemoteRequestBody message, length delimited. Does not implicitly {@link file.AdoptRemoteRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {file.IAdoptRemoteRequestBody} message AdoptRemoteRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AdoptRemoteRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an AdoptRemoteRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.AdoptRemoteRequestBody} AdoptRemoteRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AdoptRemoteRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.AdoptRemoteRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.opts = $root.file.OptionsToAdopteRemote.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an AdoptRemoteRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.AdoptRemoteRequestBody} AdoptRemoteRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AdoptRemoteRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an AdoptRemoteRequestBody message.
         * @function verify
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        AdoptRemoteRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts")) {
                var error = $root.file.OptionsToAdopteRemote.verify(message.opts, long + 1);
                if (error)
                    return "opts." + error;
            }
            return null;
        };

        /**
         * Creates an AdoptRemoteRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.AdoptRemoteRequestBody} AdoptRemoteRequestBody
         */
        AdoptRemoteRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.AdoptRemoteRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.AdoptRemoteRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.AdoptRemoteRequestBody();
            if (object.opts != null) {
                if (!$util.isObject(object.opts))
                    throw TypeError(".file.AdoptRemoteRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToAdopteRemote.fromObject(object.opts, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an AdoptRemoteRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {file.AdoptRemoteRequestBody} message AdoptRemoteRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        AdoptRemoteRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.opts = null;
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                object.opts = $root.file.OptionsToAdopteRemote.toObject(message.opts, options, q + 1);
            return object;
        };

        /**
         * Converts this AdoptRemoteRequestBody to JSON.
         * @function toJSON
         * @memberof file.AdoptRemoteRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        AdoptRemoteRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for AdoptRemoteRequestBody
         * @function getTypeUrl
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        AdoptRemoteRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.AdoptRemoteRequestBody";
        };

        return AdoptRemoteRequestBody;
    })();

    file.OptionsToAdopteRemote = (function() {

        /**
         * Properties of an OptionsToAdopteRemote.
         * @memberof file
         * @interface IOptionsToAdopteRemote
         * @property {common.IBooleanValue|null} [dropLocalVer] OptionsToAdopteRemote dropLocalVer
         * @property {common.IUInt64Value|null} [remoteVersion] OptionsToAdopteRemote remoteVersion
         */

        /**
         * Constructs a new OptionsToAdopteRemote.
         * @memberof file
         * @classdesc Represents an OptionsToAdopteRemote.
         * @implements IOptionsToAdopteRemote
         * @constructor
         * @param {file.IOptionsToAdopteRemote=} [properties] Properties to set
         */
        function OptionsToAdopteRemote(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * OptionsToAdopteRemote dropLocalVer.
         * @member {common.IBooleanValue|null|undefined} dropLocalVer
         * @memberof file.OptionsToAdopteRemote
         * @instance
         */
        OptionsToAdopteRemote.prototype.dropLocalVer = null;

        /**
         * OptionsToAdopteRemote remoteVersion.
         * @member {common.IUInt64Value|null|undefined} remoteVersion
         * @memberof file.OptionsToAdopteRemote
         * @instance
         */
        OptionsToAdopteRemote.prototype.remoteVersion = null;

        /**
         * Creates a new OptionsToAdopteRemote instance using the specified properties.
         * @function create
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {file.IOptionsToAdopteRemote=} [properties] Properties to set
         * @returns {file.OptionsToAdopteRemote} OptionsToAdopteRemote instance
         */
        OptionsToAdopteRemote.create = function create(properties) {
            return new OptionsToAdopteRemote(properties);
        };

        /**
         * Encodes the specified OptionsToAdopteRemote message. Does not implicitly {@link file.OptionsToAdopteRemote.verify|verify} messages.
         * @function encode
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {file.IOptionsToAdopteRemote} message OptionsToAdopteRemote message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        OptionsToAdopteRemote.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.dropLocalVer != null && Object.hasOwnProperty.call(message, "dropLocalVer"))
                $root.common.BooleanValue.encode(message.dropLocalVer, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified OptionsToAdopteRemote message, length delimited. Does not implicitly {@link file.OptionsToAdopteRemote.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {file.IOptionsToAdopteRemote} message OptionsToAdopteRemote message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        OptionsToAdopteRemote.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an OptionsToAdopteRemote message from the specified reader or buffer.
         * @function decode
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.OptionsToAdopteRemote} OptionsToAdopteRemote
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        OptionsToAdopteRemote.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.OptionsToAdopteRemote();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.dropLocalVer = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an OptionsToAdopteRemote message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.OptionsToAdopteRemote} OptionsToAdopteRemote
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        OptionsToAdopteRemote.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an OptionsToAdopteRemote message.
         * @function verify
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        OptionsToAdopteRemote.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.dropLocalVer != null && Object.hasOwnProperty.call(message, "dropLocalVer")) {
                var error = $root.common.BooleanValue.verify(message.dropLocalVer, long + 1);
                if (error)
                    return "dropLocalVer." + error;
            }
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion, long + 1);
                if (error)
                    return "remoteVersion." + error;
            }
            return null;
        };

        /**
         * Creates an OptionsToAdopteRemote message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.OptionsToAdopteRemote} OptionsToAdopteRemote
         */
        OptionsToAdopteRemote.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.OptionsToAdopteRemote)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.OptionsToAdopteRemote: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.OptionsToAdopteRemote();
            if (object.dropLocalVer != null) {
                if (!$util.isObject(object.dropLocalVer))
                    throw TypeError(".file.OptionsToAdopteRemote.dropLocalVer: object expected");
                message.dropLocalVer = $root.common.BooleanValue.fromObject(object.dropLocalVer, long + 1);
            }
            if (object.remoteVersion != null) {
                if (!$util.isObject(object.remoteVersion))
                    throw TypeError(".file.OptionsToAdopteRemote.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an OptionsToAdopteRemote message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {file.OptionsToAdopteRemote} message OptionsToAdopteRemote
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        OptionsToAdopteRemote.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.dropLocalVer = null;
                object.remoteVersion = null;
            }
            if (message.dropLocalVer != null && Object.hasOwnProperty.call(message, "dropLocalVer"))
                object.dropLocalVer = $root.common.BooleanValue.toObject(message.dropLocalVer, options, q + 1);
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options, q + 1);
            return object;
        };

        /**
         * Converts this OptionsToAdopteRemote to JSON.
         * @function toJSON
         * @memberof file.OptionsToAdopteRemote
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        OptionsToAdopteRemote.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for OptionsToAdopteRemote
         * @function getTypeUrl
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        OptionsToAdopteRemote.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.OptionsToAdopteRemote";
        };

        return OptionsToAdopteRemote;
    })();

    file.DiffCurrentAndRemoteRequestBody = (function() {

        /**
         * Properties of a DiffCurrentAndRemoteRequestBody.
         * @memberof file
         * @interface IDiffCurrentAndRemoteRequestBody
         * @property {file.IOptionsToDiffFileVersions|null} [opts] DiffCurrentAndRemoteRequestBody opts
         */

        /**
         * Constructs a new DiffCurrentAndRemoteRequestBody.
         * @memberof file
         * @classdesc Represents a DiffCurrentAndRemoteRequestBody.
         * @implements IDiffCurrentAndRemoteRequestBody
         * @constructor
         * @param {file.IDiffCurrentAndRemoteRequestBody=} [properties] Properties to set
         */
        function DiffCurrentAndRemoteRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * DiffCurrentAndRemoteRequestBody opts.
         * @member {file.IOptionsToDiffFileVersions|null|undefined} opts
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @instance
         */
        DiffCurrentAndRemoteRequestBody.prototype.opts = null;

        /**
         * Creates a new DiffCurrentAndRemoteRequestBody instance using the specified properties.
         * @function create
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {file.IDiffCurrentAndRemoteRequestBody=} [properties] Properties to set
         * @returns {file.DiffCurrentAndRemoteRequestBody} DiffCurrentAndRemoteRequestBody instance
         */
        DiffCurrentAndRemoteRequestBody.create = function create(properties) {
            return new DiffCurrentAndRemoteRequestBody(properties);
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteRequestBody message. Does not implicitly {@link file.DiffCurrentAndRemoteRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {file.IDiffCurrentAndRemoteRequestBody} message DiffCurrentAndRemoteRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.file.OptionsToDiffFileVersions.encode(message.opts, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteRequestBody message, length delimited. Does not implicitly {@link file.DiffCurrentAndRemoteRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {file.IDiffCurrentAndRemoteRequestBody} message DiffCurrentAndRemoteRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a DiffCurrentAndRemoteRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.DiffCurrentAndRemoteRequestBody} DiffCurrentAndRemoteRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.DiffCurrentAndRemoteRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.opts = $root.file.OptionsToDiffFileVersions.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a DiffCurrentAndRemoteRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.DiffCurrentAndRemoteRequestBody} DiffCurrentAndRemoteRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a DiffCurrentAndRemoteRequestBody message.
         * @function verify
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        DiffCurrentAndRemoteRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts")) {
                var error = $root.file.OptionsToDiffFileVersions.verify(message.opts, long + 1);
                if (error)
                    return "opts." + error;
            }
            return null;
        };

        /**
         * Creates a DiffCurrentAndRemoteRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.DiffCurrentAndRemoteRequestBody} DiffCurrentAndRemoteRequestBody
         */
        DiffCurrentAndRemoteRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.DiffCurrentAndRemoteRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.DiffCurrentAndRemoteRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.DiffCurrentAndRemoteRequestBody();
            if (object.opts != null) {
                if (!$util.isObject(object.opts))
                    throw TypeError(".file.DiffCurrentAndRemoteRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToDiffFileVersions.fromObject(object.opts, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a DiffCurrentAndRemoteRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {file.DiffCurrentAndRemoteRequestBody} message DiffCurrentAndRemoteRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        DiffCurrentAndRemoteRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.opts = null;
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                object.opts = $root.file.OptionsToDiffFileVersions.toObject(message.opts, options, q + 1);
            return object;
        };

        /**
         * Converts this DiffCurrentAndRemoteRequestBody to JSON.
         * @function toJSON
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        DiffCurrentAndRemoteRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for DiffCurrentAndRemoteRequestBody
         * @function getTypeUrl
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        DiffCurrentAndRemoteRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.DiffCurrentAndRemoteRequestBody";
        };

        return DiffCurrentAndRemoteRequestBody;
    })();

    file.DiffCurrentAndRemoteReplyBody = (function() {

        /**
         * Properties of a DiffCurrentAndRemoteReplyBody.
         * @memberof file
         * @interface IDiffCurrentAndRemoteReplyBody
         * @property {file.IFileDiff|null} [diff] DiffCurrentAndRemoteReplyBody diff
         */

        /**
         * Constructs a new DiffCurrentAndRemoteReplyBody.
         * @memberof file
         * @classdesc Represents a DiffCurrentAndRemoteReplyBody.
         * @implements IDiffCurrentAndRemoteReplyBody
         * @constructor
         * @param {file.IDiffCurrentAndRemoteReplyBody=} [properties] Properties to set
         */
        function DiffCurrentAndRemoteReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * DiffCurrentAndRemoteReplyBody diff.
         * @member {file.IFileDiff|null|undefined} diff
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @instance
         */
        DiffCurrentAndRemoteReplyBody.prototype.diff = null;

        /**
         * Creates a new DiffCurrentAndRemoteReplyBody instance using the specified properties.
         * @function create
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {file.IDiffCurrentAndRemoteReplyBody=} [properties] Properties to set
         * @returns {file.DiffCurrentAndRemoteReplyBody} DiffCurrentAndRemoteReplyBody instance
         */
        DiffCurrentAndRemoteReplyBody.create = function create(properties) {
            return new DiffCurrentAndRemoteReplyBody(properties);
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteReplyBody message. Does not implicitly {@link file.DiffCurrentAndRemoteReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {file.IDiffCurrentAndRemoteReplyBody} message DiffCurrentAndRemoteReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.diff != null && Object.hasOwnProperty.call(message, "diff"))
                $root.file.FileDiff.encode(message.diff, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteReplyBody message, length delimited. Does not implicitly {@link file.DiffCurrentAndRemoteReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {file.IDiffCurrentAndRemoteReplyBody} message DiffCurrentAndRemoteReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a DiffCurrentAndRemoteReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.DiffCurrentAndRemoteReplyBody} DiffCurrentAndRemoteReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.DiffCurrentAndRemoteReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.diff = $root.file.FileDiff.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a DiffCurrentAndRemoteReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.DiffCurrentAndRemoteReplyBody} DiffCurrentAndRemoteReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a DiffCurrentAndRemoteReplyBody message.
         * @function verify
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        DiffCurrentAndRemoteReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.diff != null && Object.hasOwnProperty.call(message, "diff")) {
                var error = $root.file.FileDiff.verify(message.diff, long + 1);
                if (error)
                    return "diff." + error;
            }
            return null;
        };

        /**
         * Creates a DiffCurrentAndRemoteReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.DiffCurrentAndRemoteReplyBody} DiffCurrentAndRemoteReplyBody
         */
        DiffCurrentAndRemoteReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.DiffCurrentAndRemoteReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.DiffCurrentAndRemoteReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.DiffCurrentAndRemoteReplyBody();
            if (object.diff != null) {
                if (!$util.isObject(object.diff))
                    throw TypeError(".file.DiffCurrentAndRemoteReplyBody.diff: object expected");
                message.diff = $root.file.FileDiff.fromObject(object.diff, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a DiffCurrentAndRemoteReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {file.DiffCurrentAndRemoteReplyBody} message DiffCurrentAndRemoteReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        DiffCurrentAndRemoteReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.diff = null;
            if (message.diff != null && Object.hasOwnProperty.call(message, "diff"))
                object.diff = $root.file.FileDiff.toObject(message.diff, options, q + 1);
            return object;
        };

        /**
         * Converts this DiffCurrentAndRemoteReplyBody to JSON.
         * @function toJSON
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        DiffCurrentAndRemoteReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for DiffCurrentAndRemoteReplyBody
         * @function getTypeUrl
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        DiffCurrentAndRemoteReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.DiffCurrentAndRemoteReplyBody";
        };

        return DiffCurrentAndRemoteReplyBody;
    })();

    file.OptionsToDiffFileVersions = (function() {

        /**
         * Properties of an OptionsToDiffFileVersions.
         * @memberof file
         * @interface IOptionsToDiffFileVersions
         * @property {common.IUInt64Value|null} [remoteVersion] OptionsToDiffFileVersions remoteVersion
         * @property {common.IBooleanValue|null} [compareContentIfSameMTime] OptionsToDiffFileVersions compareContentIfSameMTime
         */

        /**
         * Constructs a new OptionsToDiffFileVersions.
         * @memberof file
         * @classdesc Represents an OptionsToDiffFileVersions.
         * @implements IOptionsToDiffFileVersions
         * @constructor
         * @param {file.IOptionsToDiffFileVersions=} [properties] Properties to set
         */
        function OptionsToDiffFileVersions(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * OptionsToDiffFileVersions remoteVersion.
         * @member {common.IUInt64Value|null|undefined} remoteVersion
         * @memberof file.OptionsToDiffFileVersions
         * @instance
         */
        OptionsToDiffFileVersions.prototype.remoteVersion = null;

        /**
         * OptionsToDiffFileVersions compareContentIfSameMTime.
         * @member {common.IBooleanValue|null|undefined} compareContentIfSameMTime
         * @memberof file.OptionsToDiffFileVersions
         * @instance
         */
        OptionsToDiffFileVersions.prototype.compareContentIfSameMTime = null;

        /**
         * Creates a new OptionsToDiffFileVersions instance using the specified properties.
         * @function create
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {file.IOptionsToDiffFileVersions=} [properties] Properties to set
         * @returns {file.OptionsToDiffFileVersions} OptionsToDiffFileVersions instance
         */
        OptionsToDiffFileVersions.create = function create(properties) {
            return new OptionsToDiffFileVersions(properties);
        };

        /**
         * Encodes the specified OptionsToDiffFileVersions message. Does not implicitly {@link file.OptionsToDiffFileVersions.verify|verify} messages.
         * @function encode
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {file.IOptionsToDiffFileVersions} message OptionsToDiffFileVersions message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        OptionsToDiffFileVersions.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.compareContentIfSameMTime != null && Object.hasOwnProperty.call(message, "compareContentIfSameMTime"))
                $root.common.BooleanValue.encode(message.compareContentIfSameMTime, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified OptionsToDiffFileVersions message, length delimited. Does not implicitly {@link file.OptionsToDiffFileVersions.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {file.IOptionsToDiffFileVersions} message OptionsToDiffFileVersions message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        OptionsToDiffFileVersions.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an OptionsToDiffFileVersions message from the specified reader or buffer.
         * @function decode
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.OptionsToDiffFileVersions} OptionsToDiffFileVersions
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        OptionsToDiffFileVersions.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.OptionsToDiffFileVersions();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.compareContentIfSameMTime = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an OptionsToDiffFileVersions message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.OptionsToDiffFileVersions} OptionsToDiffFileVersions
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        OptionsToDiffFileVersions.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an OptionsToDiffFileVersions message.
         * @function verify
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        OptionsToDiffFileVersions.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion, long + 1);
                if (error)
                    return "remoteVersion." + error;
            }
            if (message.compareContentIfSameMTime != null && Object.hasOwnProperty.call(message, "compareContentIfSameMTime")) {
                var error = $root.common.BooleanValue.verify(message.compareContentIfSameMTime, long + 1);
                if (error)
                    return "compareContentIfSameMTime." + error;
            }
            return null;
        };

        /**
         * Creates an OptionsToDiffFileVersions message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.OptionsToDiffFileVersions} OptionsToDiffFileVersions
         */
        OptionsToDiffFileVersions.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.OptionsToDiffFileVersions)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.OptionsToDiffFileVersions: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.OptionsToDiffFileVersions();
            if (object.remoteVersion != null) {
                if (!$util.isObject(object.remoteVersion))
                    throw TypeError(".file.OptionsToDiffFileVersions.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion, long + 1);
            }
            if (object.compareContentIfSameMTime != null) {
                if (!$util.isObject(object.compareContentIfSameMTime))
                    throw TypeError(".file.OptionsToDiffFileVersions.compareContentIfSameMTime: object expected");
                message.compareContentIfSameMTime = $root.common.BooleanValue.fromObject(object.compareContentIfSameMTime, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an OptionsToDiffFileVersions message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {file.OptionsToDiffFileVersions} message OptionsToDiffFileVersions
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        OptionsToDiffFileVersions.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.remoteVersion = null;
                object.compareContentIfSameMTime = null;
            }
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options, q + 1);
            if (message.compareContentIfSameMTime != null && Object.hasOwnProperty.call(message, "compareContentIfSameMTime"))
                object.compareContentIfSameMTime = $root.common.BooleanValue.toObject(message.compareContentIfSameMTime, options, q + 1);
            return object;
        };

        /**
         * Converts this OptionsToDiffFileVersions to JSON.
         * @function toJSON
         * @memberof file.OptionsToDiffFileVersions
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        OptionsToDiffFileVersions.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for OptionsToDiffFileVersions
         * @function getTypeUrl
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        OptionsToDiffFileVersions.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.OptionsToDiffFileVersions";
        };

        return OptionsToDiffFileVersions;
    })();

    file.TimeStampsDiff = (function() {

        /**
         * Properties of a TimeStampsDiff.
         * @memberof file
         * @interface ITimeStampsDiff
         * @property {number|Long|null} [current] TimeStampsDiff current
         * @property {number|Long|null} [remote] TimeStampsDiff remote
         * @property {number|Long|null} [synced] TimeStampsDiff synced
         */

        /**
         * Constructs a new TimeStampsDiff.
         * @memberof file
         * @classdesc Represents a TimeStampsDiff.
         * @implements ITimeStampsDiff
         * @constructor
         * @param {file.ITimeStampsDiff=} [properties] Properties to set
         */
        function TimeStampsDiff(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * TimeStampsDiff current.
         * @member {number|Long} current
         * @memberof file.TimeStampsDiff
         * @instance
         */
        TimeStampsDiff.prototype.current = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * TimeStampsDiff remote.
         * @member {number|Long} remote
         * @memberof file.TimeStampsDiff
         * @instance
         */
        TimeStampsDiff.prototype.remote = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * TimeStampsDiff synced.
         * @member {number|Long} synced
         * @memberof file.TimeStampsDiff
         * @instance
         */
        TimeStampsDiff.prototype.synced = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new TimeStampsDiff instance using the specified properties.
         * @function create
         * @memberof file.TimeStampsDiff
         * @static
         * @param {file.ITimeStampsDiff=} [properties] Properties to set
         * @returns {file.TimeStampsDiff} TimeStampsDiff instance
         */
        TimeStampsDiff.create = function create(properties) {
            return new TimeStampsDiff(properties);
        };

        /**
         * Encodes the specified TimeStampsDiff message. Does not implicitly {@link file.TimeStampsDiff.verify|verify} messages.
         * @function encode
         * @memberof file.TimeStampsDiff
         * @static
         * @param {file.ITimeStampsDiff} message TimeStampsDiff message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        TimeStampsDiff.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.current);
            if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.remote);
            if (message.synced != null && Object.hasOwnProperty.call(message, "synced"))
                writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.synced);
            return writer;
        };

        /**
         * Encodes the specified TimeStampsDiff message, length delimited. Does not implicitly {@link file.TimeStampsDiff.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.TimeStampsDiff
         * @static
         * @param {file.ITimeStampsDiff} message TimeStampsDiff message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        TimeStampsDiff.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a TimeStampsDiff message from the specified reader or buffer.
         * @function decode
         * @memberof file.TimeStampsDiff
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.TimeStampsDiff} TimeStampsDiff
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        TimeStampsDiff.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.TimeStampsDiff();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.current = reader.uint64();
                        break;
                    }
                case 2: {
                        message.remote = reader.uint64();
                        break;
                    }
                case 3: {
                        message.synced = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a TimeStampsDiff message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.TimeStampsDiff
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.TimeStampsDiff} TimeStampsDiff
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        TimeStampsDiff.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a TimeStampsDiff message.
         * @function verify
         * @memberof file.TimeStampsDiff
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        TimeStampsDiff.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                if (!$util.isInteger(message.current) && !(message.current && $util.isInteger(message.current.low) && $util.isInteger(message.current.high)))
                    return "current: integer|Long expected";
            if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                if (!$util.isInteger(message.remote) && !(message.remote && $util.isInteger(message.remote.low) && $util.isInteger(message.remote.high)))
                    return "remote: integer|Long expected";
            if (message.synced != null && Object.hasOwnProperty.call(message, "synced"))
                if (!$util.isInteger(message.synced) && !(message.synced && $util.isInteger(message.synced.low) && $util.isInteger(message.synced.high)))
                    return "synced: integer|Long expected";
            return null;
        };

        /**
         * Creates a TimeStampsDiff message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.TimeStampsDiff
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.TimeStampsDiff} TimeStampsDiff
         */
        TimeStampsDiff.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.TimeStampsDiff)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.TimeStampsDiff: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.TimeStampsDiff();
            if (object.current != null)
                if ($util.Long)
                    message.current = $util.Long.fromValue(object.current, true);
                else if (typeof object.current === "string")
                    message.current = parseInt(object.current, 10);
                else if (typeof object.current === "number")
                    message.current = object.current;
                else if (typeof object.current === "object")
                    message.current = new $util.LongBits(object.current.low >>> 0, object.current.high >>> 0).toNumber(true);
            if (object.remote != null)
                if ($util.Long)
                    message.remote = $util.Long.fromValue(object.remote, true);
                else if (typeof object.remote === "string")
                    message.remote = parseInt(object.remote, 10);
                else if (typeof object.remote === "number")
                    message.remote = object.remote;
                else if (typeof object.remote === "object")
                    message.remote = new $util.LongBits(object.remote.low >>> 0, object.remote.high >>> 0).toNumber(true);
            if (object.synced != null)
                if ($util.Long)
                    message.synced = $util.Long.fromValue(object.synced, true);
                else if (typeof object.synced === "string")
                    message.synced = parseInt(object.synced, 10);
                else if (typeof object.synced === "number")
                    message.synced = object.synced;
                else if (typeof object.synced === "object")
                    message.synced = new $util.LongBits(object.synced.low >>> 0, object.synced.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from a TimeStampsDiff message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.TimeStampsDiff
         * @static
         * @param {file.TimeStampsDiff} message TimeStampsDiff
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        TimeStampsDiff.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.current = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.current = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.remote = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.remote = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.synced = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.synced = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            }
            if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.current = typeof message.current === "number" ? BigInt(message.current) : $util.Long.fromBits(message.current.low >>> 0, message.current.high >>> 0, true).toBigInt();
                else if (typeof message.current === "number")
                    object.current = options.longs === String ? String(message.current) : message.current;
                else
                    object.current = options.longs === String ? $util.Long.prototype.toString.call(message.current) : options.longs === Number ? new $util.LongBits(message.current.low >>> 0, message.current.high >>> 0).toNumber(true) : message.current;
            if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.remote = typeof message.remote === "number" ? BigInt(message.remote) : $util.Long.fromBits(message.remote.low >>> 0, message.remote.high >>> 0, true).toBigInt();
                else if (typeof message.remote === "number")
                    object.remote = options.longs === String ? String(message.remote) : message.remote;
                else
                    object.remote = options.longs === String ? $util.Long.prototype.toString.call(message.remote) : options.longs === Number ? new $util.LongBits(message.remote.low >>> 0, message.remote.high >>> 0).toNumber(true) : message.remote;
            if (message.synced != null && Object.hasOwnProperty.call(message, "synced"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.synced = typeof message.synced === "number" ? BigInt(message.synced) : $util.Long.fromBits(message.synced.low >>> 0, message.synced.high >>> 0, true).toBigInt();
                else if (typeof message.synced === "number")
                    object.synced = options.longs === String ? String(message.synced) : message.synced;
                else
                    object.synced = options.longs === String ? $util.Long.prototype.toString.call(message.synced) : options.longs === Number ? new $util.LongBits(message.synced.low >>> 0, message.synced.high >>> 0).toNumber(true) : message.synced;
            return object;
        };

        /**
         * Converts this TimeStampsDiff to JSON.
         * @function toJSON
         * @memberof file.TimeStampsDiff
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        TimeStampsDiff.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for TimeStampsDiff
         * @function getTypeUrl
         * @memberof file.TimeStampsDiff
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        TimeStampsDiff.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.TimeStampsDiff";
        };

        return TimeStampsDiff;
    })();

    file.XAttrDiff = (function() {

        /**
         * Properties of a XAttrDiff.
         * @memberof file
         * @interface IXAttrDiff
         * @property {string|null} [name] XAttrDiff name
         * @property {common.IStringValue|null} [addedIn] XAttrDiff addedIn
         * @property {common.IStringValue|null} [removedIn] XAttrDiff removedIn
         * @property {common.IStringValue|null} [changedIn] XAttrDiff changedIn
         */

        /**
         * Constructs a new XAttrDiff.
         * @memberof file
         * @classdesc Represents a XAttrDiff.
         * @implements IXAttrDiff
         * @constructor
         * @param {file.IXAttrDiff=} [properties] Properties to set
         */
        function XAttrDiff(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * XAttrDiff name.
         * @member {string} name
         * @memberof file.XAttrDiff
         * @instance
         */
        XAttrDiff.prototype.name = "";

        /**
         * XAttrDiff addedIn.
         * @member {common.IStringValue|null|undefined} addedIn
         * @memberof file.XAttrDiff
         * @instance
         */
        XAttrDiff.prototype.addedIn = null;

        /**
         * XAttrDiff removedIn.
         * @member {common.IStringValue|null|undefined} removedIn
         * @memberof file.XAttrDiff
         * @instance
         */
        XAttrDiff.prototype.removedIn = null;

        /**
         * XAttrDiff changedIn.
         * @member {common.IStringValue|null|undefined} changedIn
         * @memberof file.XAttrDiff
         * @instance
         */
        XAttrDiff.prototype.changedIn = null;

        /**
         * Creates a new XAttrDiff instance using the specified properties.
         * @function create
         * @memberof file.XAttrDiff
         * @static
         * @param {file.IXAttrDiff=} [properties] Properties to set
         * @returns {file.XAttrDiff} XAttrDiff instance
         */
        XAttrDiff.create = function create(properties) {
            return new XAttrDiff(properties);
        };

        /**
         * Encodes the specified XAttrDiff message. Does not implicitly {@link file.XAttrDiff.verify|verify} messages.
         * @function encode
         * @memberof file.XAttrDiff
         * @static
         * @param {file.IXAttrDiff} message XAttrDiff message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        XAttrDiff.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
            if (message.addedIn != null && Object.hasOwnProperty.call(message, "addedIn"))
                $root.common.StringValue.encode(message.addedIn, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.removedIn != null && Object.hasOwnProperty.call(message, "removedIn"))
                $root.common.StringValue.encode(message.removedIn, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.changedIn != null && Object.hasOwnProperty.call(message, "changedIn"))
                $root.common.StringValue.encode(message.changedIn, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified XAttrDiff message, length delimited. Does not implicitly {@link file.XAttrDiff.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.XAttrDiff
         * @static
         * @param {file.IXAttrDiff} message XAttrDiff message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        XAttrDiff.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a XAttrDiff message from the specified reader or buffer.
         * @function decode
         * @memberof file.XAttrDiff
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.XAttrDiff} XAttrDiff
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        XAttrDiff.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.XAttrDiff();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.name = reader.string();
                        break;
                    }
                case 2: {
                        message.addedIn = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.removedIn = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.changedIn = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a XAttrDiff message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.XAttrDiff
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.XAttrDiff} XAttrDiff
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        XAttrDiff.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a XAttrDiff message.
         * @function verify
         * @memberof file.XAttrDiff
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        XAttrDiff.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.addedIn != null && Object.hasOwnProperty.call(message, "addedIn")) {
                var error = $root.common.StringValue.verify(message.addedIn, long + 1);
                if (error)
                    return "addedIn." + error;
            }
            if (message.removedIn != null && Object.hasOwnProperty.call(message, "removedIn")) {
                var error = $root.common.StringValue.verify(message.removedIn, long + 1);
                if (error)
                    return "removedIn." + error;
            }
            if (message.changedIn != null && Object.hasOwnProperty.call(message, "changedIn")) {
                var error = $root.common.StringValue.verify(message.changedIn, long + 1);
                if (error)
                    return "changedIn." + error;
            }
            return null;
        };

        /**
         * Creates a XAttrDiff message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.XAttrDiff
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.XAttrDiff} XAttrDiff
         */
        XAttrDiff.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.XAttrDiff)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.XAttrDiff: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.XAttrDiff();
            if (object.name != null)
                message.name = String(object.name);
            if (object.addedIn != null) {
                if (!$util.isObject(object.addedIn))
                    throw TypeError(".file.XAttrDiff.addedIn: object expected");
                message.addedIn = $root.common.StringValue.fromObject(object.addedIn, long + 1);
            }
            if (object.removedIn != null) {
                if (!$util.isObject(object.removedIn))
                    throw TypeError(".file.XAttrDiff.removedIn: object expected");
                message.removedIn = $root.common.StringValue.fromObject(object.removedIn, long + 1);
            }
            if (object.changedIn != null) {
                if (!$util.isObject(object.changedIn))
                    throw TypeError(".file.XAttrDiff.changedIn: object expected");
                message.changedIn = $root.common.StringValue.fromObject(object.changedIn, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a XAttrDiff message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.XAttrDiff
         * @static
         * @param {file.XAttrDiff} message XAttrDiff
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        XAttrDiff.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.name = "";
                object.addedIn = null;
                object.removedIn = null;
                object.changedIn = null;
            }
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                object.name = message.name;
            if (message.addedIn != null && Object.hasOwnProperty.call(message, "addedIn"))
                object.addedIn = $root.common.StringValue.toObject(message.addedIn, options, q + 1);
            if (message.removedIn != null && Object.hasOwnProperty.call(message, "removedIn"))
                object.removedIn = $root.common.StringValue.toObject(message.removedIn, options, q + 1);
            if (message.changedIn != null && Object.hasOwnProperty.call(message, "changedIn"))
                object.changedIn = $root.common.StringValue.toObject(message.changedIn, options, q + 1);
            return object;
        };

        /**
         * Converts this XAttrDiff to JSON.
         * @function toJSON
         * @memberof file.XAttrDiff
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        XAttrDiff.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for XAttrDiff
         * @function getTypeUrl
         * @memberof file.XAttrDiff
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        XAttrDiff.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.XAttrDiff";
        };

        return XAttrDiff;
    })();

    file.FileDiff = (function() {

        /**
         * Properties of a FileDiff.
         * @memberof file
         * @interface IFileDiff
         * @property {number|Long|null} [currentVersion] FileDiff currentVersion
         * @property {boolean|null} [isCurrentLocal] FileDiff isCurrentLocal
         * @property {common.IUInt64Value|null} [remoteVersion] FileDiff remoteVersion
         * @property {common.IUInt64Value|null} [syncedVersion] FileDiff syncedVersion
         * @property {boolean|null} [isRemoteRemoved] FileDiff isRemoteRemoved
         * @property {file.ITimeStampsDiff|null} [ctime] FileDiff ctime
         * @property {file.ITimeStampsDiff|null} [mtime] FileDiff mtime
         * @property {Array.<file.IXAttrDiff>|null} [xattrs] FileDiff xattrs
         * @property {boolean|null} [areContentsSame] FileDiff areContentsSame
         * @property {file.FileDiff.ISize|null} [size] FileDiff size
         */

        /**
         * Constructs a new FileDiff.
         * @memberof file
         * @classdesc Represents a FileDiff.
         * @implements IFileDiff
         * @constructor
         * @param {file.IFileDiff=} [properties] Properties to set
         */
        function FileDiff(properties) {
            this.xattrs = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileDiff currentVersion.
         * @member {number|Long} currentVersion
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.currentVersion = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * FileDiff isCurrentLocal.
         * @member {boolean} isCurrentLocal
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.isCurrentLocal = false;

        /**
         * FileDiff remoteVersion.
         * @member {common.IUInt64Value|null|undefined} remoteVersion
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.remoteVersion = null;

        /**
         * FileDiff syncedVersion.
         * @member {common.IUInt64Value|null|undefined} syncedVersion
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.syncedVersion = null;

        /**
         * FileDiff isRemoteRemoved.
         * @member {boolean} isRemoteRemoved
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.isRemoteRemoved = false;

        /**
         * FileDiff ctime.
         * @member {file.ITimeStampsDiff|null|undefined} ctime
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.ctime = null;

        /**
         * FileDiff mtime.
         * @member {file.ITimeStampsDiff|null|undefined} mtime
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.mtime = null;

        /**
         * FileDiff xattrs.
         * @member {Array.<file.IXAttrDiff>} xattrs
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.xattrs = $util.emptyArray;

        /**
         * FileDiff areContentsSame.
         * @member {boolean} areContentsSame
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.areContentsSame = false;

        /**
         * FileDiff size.
         * @member {file.FileDiff.ISize|null|undefined} size
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.size = null;

        /**
         * Creates a new FileDiff instance using the specified properties.
         * @function create
         * @memberof file.FileDiff
         * @static
         * @param {file.IFileDiff=} [properties] Properties to set
         * @returns {file.FileDiff} FileDiff instance
         */
        FileDiff.create = function create(properties) {
            return new FileDiff(properties);
        };

        /**
         * Encodes the specified FileDiff message. Does not implicitly {@link file.FileDiff.verify|verify} messages.
         * @function encode
         * @memberof file.FileDiff
         * @static
         * @param {file.IFileDiff} message FileDiff message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileDiff.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.currentVersion);
            if (message.isCurrentLocal != null && Object.hasOwnProperty.call(message, "isCurrentLocal"))
                writer.uint32(/* id 2, wireType 0 =*/16).bool(message.isCurrentLocal);
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.syncedVersion != null && Object.hasOwnProperty.call(message, "syncedVersion"))
                $root.common.UInt64Value.encode(message.syncedVersion, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            if (message.isRemoteRemoved != null && Object.hasOwnProperty.call(message, "isRemoteRemoved"))
                writer.uint32(/* id 5, wireType 0 =*/40).bool(message.isRemoteRemoved);
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime"))
                $root.file.TimeStampsDiff.encode(message.ctime, writer.uint32(/* id 6, wireType 2 =*/50).fork(), q + 1).ldelim();
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime"))
                $root.file.TimeStampsDiff.encode(message.mtime, writer.uint32(/* id 7, wireType 2 =*/58).fork(), q + 1).ldelim();
            if (message.xattrs != null && message.xattrs.length)
                for (var i = 0; i < message.xattrs.length; ++i)
                    $root.file.XAttrDiff.encode(message.xattrs[i], writer.uint32(/* id 8, wireType 2 =*/66).fork(), q + 1).ldelim();
            if (message.areContentsSame != null && Object.hasOwnProperty.call(message, "areContentsSame"))
                writer.uint32(/* id 11, wireType 0 =*/88).bool(message.areContentsSame);
            if (message.size != null && Object.hasOwnProperty.call(message, "size"))
                $root.file.FileDiff.Size.encode(message.size, writer.uint32(/* id 12, wireType 2 =*/98).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FileDiff message, length delimited. Does not implicitly {@link file.FileDiff.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.FileDiff
         * @static
         * @param {file.IFileDiff} message FileDiff message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileDiff.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileDiff message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileDiff
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileDiff} FileDiff
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileDiff.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileDiff();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.currentVersion = reader.uint64();
                        break;
                    }
                case 2: {
                        message.isCurrentLocal = reader.bool();
                        break;
                    }
                case 3: {
                        message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.syncedVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 5: {
                        message.isRemoteRemoved = reader.bool();
                        break;
                    }
                case 6: {
                        message.ctime = $root.file.TimeStampsDiff.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 7: {
                        message.mtime = $root.file.TimeStampsDiff.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 8: {
                        if (!(message.xattrs && message.xattrs.length))
                            message.xattrs = [];
                        message.xattrs.push($root.file.XAttrDiff.decode(reader, reader.uint32(), undefined, long + 1));
                        break;
                    }
                case 11: {
                        message.areContentsSame = reader.bool();
                        break;
                    }
                case 12: {
                        message.size = $root.file.FileDiff.Size.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileDiff message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.FileDiff
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.FileDiff} FileDiff
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileDiff.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileDiff message.
         * @function verify
         * @memberof file.FileDiff
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileDiff.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                if (!$util.isInteger(message.currentVersion) && !(message.currentVersion && $util.isInteger(message.currentVersion.low) && $util.isInteger(message.currentVersion.high)))
                    return "currentVersion: integer|Long expected";
            if (message.isCurrentLocal != null && Object.hasOwnProperty.call(message, "isCurrentLocal"))
                if (typeof message.isCurrentLocal !== "boolean")
                    return "isCurrentLocal: boolean expected";
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion, long + 1);
                if (error)
                    return "remoteVersion." + error;
            }
            if (message.syncedVersion != null && Object.hasOwnProperty.call(message, "syncedVersion")) {
                var error = $root.common.UInt64Value.verify(message.syncedVersion, long + 1);
                if (error)
                    return "syncedVersion." + error;
            }
            if (message.isRemoteRemoved != null && Object.hasOwnProperty.call(message, "isRemoteRemoved"))
                if (typeof message.isRemoteRemoved !== "boolean")
                    return "isRemoteRemoved: boolean expected";
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime")) {
                var error = $root.file.TimeStampsDiff.verify(message.ctime, long + 1);
                if (error)
                    return "ctime." + error;
            }
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime")) {
                var error = $root.file.TimeStampsDiff.verify(message.mtime, long + 1);
                if (error)
                    return "mtime." + error;
            }
            if (message.xattrs != null && Object.hasOwnProperty.call(message, "xattrs")) {
                if (!Array.isArray(message.xattrs))
                    return "xattrs: array expected";
                for (var i = 0; i < message.xattrs.length; ++i) {
                    var error = $root.file.XAttrDiff.verify(message.xattrs[i], long + 1);
                    if (error)
                        return "xattrs." + error;
                }
            }
            if (message.areContentsSame != null && Object.hasOwnProperty.call(message, "areContentsSame"))
                if (typeof message.areContentsSame !== "boolean")
                    return "areContentsSame: boolean expected";
            if (message.size != null && Object.hasOwnProperty.call(message, "size")) {
                var error = $root.file.FileDiff.Size.verify(message.size, long + 1);
                if (error)
                    return "size." + error;
            }
            return null;
        };

        /**
         * Creates a FileDiff message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileDiff
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileDiff} FileDiff
         */
        FileDiff.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.FileDiff)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.FileDiff: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.FileDiff();
            if (object.currentVersion != null)
                if ($util.Long)
                    message.currentVersion = $util.Long.fromValue(object.currentVersion, true);
                else if (typeof object.currentVersion === "string")
                    message.currentVersion = parseInt(object.currentVersion, 10);
                else if (typeof object.currentVersion === "number")
                    message.currentVersion = object.currentVersion;
                else if (typeof object.currentVersion === "object")
                    message.currentVersion = new $util.LongBits(object.currentVersion.low >>> 0, object.currentVersion.high >>> 0).toNumber(true);
            if (object.isCurrentLocal != null)
                message.isCurrentLocal = Boolean(object.isCurrentLocal);
            if (object.remoteVersion != null) {
                if (!$util.isObject(object.remoteVersion))
                    throw TypeError(".file.FileDiff.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion, long + 1);
            }
            if (object.syncedVersion != null) {
                if (!$util.isObject(object.syncedVersion))
                    throw TypeError(".file.FileDiff.syncedVersion: object expected");
                message.syncedVersion = $root.common.UInt64Value.fromObject(object.syncedVersion, long + 1);
            }
            if (object.isRemoteRemoved != null)
                message.isRemoteRemoved = Boolean(object.isRemoteRemoved);
            if (object.ctime != null) {
                if (!$util.isObject(object.ctime))
                    throw TypeError(".file.FileDiff.ctime: object expected");
                message.ctime = $root.file.TimeStampsDiff.fromObject(object.ctime, long + 1);
            }
            if (object.mtime != null) {
                if (!$util.isObject(object.mtime))
                    throw TypeError(".file.FileDiff.mtime: object expected");
                message.mtime = $root.file.TimeStampsDiff.fromObject(object.mtime, long + 1);
            }
            if (object.xattrs) {
                if (!Array.isArray(object.xattrs))
                    throw TypeError(".file.FileDiff.xattrs: array expected");
                message.xattrs = [];
                for (var i = 0; i < object.xattrs.length; ++i) {
                    if (!$util.isObject(object.xattrs[i]))
                        throw TypeError(".file.FileDiff.xattrs: object expected");
                    message.xattrs[i] = $root.file.XAttrDiff.fromObject(object.xattrs[i], long + 1);
                }
            }
            if (object.areContentsSame != null)
                message.areContentsSame = Boolean(object.areContentsSame);
            if (object.size != null) {
                if (!$util.isObject(object.size))
                    throw TypeError(".file.FileDiff.size: object expected");
                message.size = $root.file.FileDiff.Size.fromObject(object.size, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a FileDiff message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileDiff
         * @static
         * @param {file.FileDiff} message FileDiff
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileDiff.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.xattrs = [];
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.currentVersion = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.currentVersion = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.isCurrentLocal = false;
                object.remoteVersion = null;
                object.syncedVersion = null;
                object.isRemoteRemoved = false;
                object.ctime = null;
                object.mtime = null;
                object.areContentsSame = false;
                object.size = null;
            }
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.currentVersion = typeof message.currentVersion === "number" ? BigInt(message.currentVersion) : $util.Long.fromBits(message.currentVersion.low >>> 0, message.currentVersion.high >>> 0, true).toBigInt();
                else if (typeof message.currentVersion === "number")
                    object.currentVersion = options.longs === String ? String(message.currentVersion) : message.currentVersion;
                else
                    object.currentVersion = options.longs === String ? $util.Long.prototype.toString.call(message.currentVersion) : options.longs === Number ? new $util.LongBits(message.currentVersion.low >>> 0, message.currentVersion.high >>> 0).toNumber(true) : message.currentVersion;
            if (message.isCurrentLocal != null && Object.hasOwnProperty.call(message, "isCurrentLocal"))
                object.isCurrentLocal = message.isCurrentLocal;
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options, q + 1);
            if (message.syncedVersion != null && Object.hasOwnProperty.call(message, "syncedVersion"))
                object.syncedVersion = $root.common.UInt64Value.toObject(message.syncedVersion, options, q + 1);
            if (message.isRemoteRemoved != null && Object.hasOwnProperty.call(message, "isRemoteRemoved"))
                object.isRemoteRemoved = message.isRemoteRemoved;
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime"))
                object.ctime = $root.file.TimeStampsDiff.toObject(message.ctime, options, q + 1);
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime"))
                object.mtime = $root.file.TimeStampsDiff.toObject(message.mtime, options, q + 1);
            if (message.xattrs && message.xattrs.length) {
                object.xattrs = [];
                for (var j = 0; j < message.xattrs.length; ++j)
                    object.xattrs[j] = $root.file.XAttrDiff.toObject(message.xattrs[j], options, q + 1);
            }
            if (message.areContentsSame != null && Object.hasOwnProperty.call(message, "areContentsSame"))
                object.areContentsSame = message.areContentsSame;
            if (message.size != null && Object.hasOwnProperty.call(message, "size"))
                object.size = $root.file.FileDiff.Size.toObject(message.size, options, q + 1);
            return object;
        };

        /**
         * Converts this FileDiff to JSON.
         * @function toJSON
         * @memberof file.FileDiff
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileDiff.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileDiff
         * @function getTypeUrl
         * @memberof file.FileDiff
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileDiff.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.FileDiff";
        };

        FileDiff.Size = (function() {

            /**
             * Properties of a Size.
             * @memberof file.FileDiff
             * @interface ISize
             * @property {number|Long|null} [current] Size current
             * @property {number|Long|null} [remote] Size remote
             */

            /**
             * Constructs a new Size.
             * @memberof file.FileDiff
             * @classdesc Represents a Size.
             * @implements ISize
             * @constructor
             * @param {file.FileDiff.ISize=} [properties] Properties to set
             */
            function Size(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * Size current.
             * @member {number|Long} current
             * @memberof file.FileDiff.Size
             * @instance
             */
            Size.prototype.current = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

            /**
             * Size remote.
             * @member {number|Long} remote
             * @memberof file.FileDiff.Size
             * @instance
             */
            Size.prototype.remote = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

            /**
             * Creates a new Size instance using the specified properties.
             * @function create
             * @memberof file.FileDiff.Size
             * @static
             * @param {file.FileDiff.ISize=} [properties] Properties to set
             * @returns {file.FileDiff.Size} Size instance
             */
            Size.create = function create(properties) {
                return new Size(properties);
            };

            /**
             * Encodes the specified Size message. Does not implicitly {@link file.FileDiff.Size.verify|verify} messages.
             * @function encode
             * @memberof file.FileDiff.Size
             * @static
             * @param {file.FileDiff.ISize} message Size message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Size.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                    writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.current);
                if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                    writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.remote);
                return writer;
            };

            /**
             * Encodes the specified Size message, length delimited. Does not implicitly {@link file.FileDiff.Size.verify|verify} messages.
             * @function encodeDelimited
             * @memberof file.FileDiff.Size
             * @static
             * @param {file.FileDiff.ISize} message Size message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Size.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes a Size message from the specified reader or buffer.
             * @function decode
             * @memberof file.FileDiff.Size
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {file.FileDiff.Size} Size
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Size.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileDiff.Size();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.current = reader.uint64();
                            break;
                        }
                    case 2: {
                            message.remote = reader.uint64();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a Size message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof file.FileDiff.Size
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {file.FileDiff.Size} Size
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Size.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a Size message.
             * @function verify
             * @memberof file.FileDiff.Size
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            Size.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                    if (!$util.isInteger(message.current) && !(message.current && $util.isInteger(message.current.low) && $util.isInteger(message.current.high)))
                        return "current: integer|Long expected";
                if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                    if (!$util.isInteger(message.remote) && !(message.remote && $util.isInteger(message.remote.low) && $util.isInteger(message.remote.high)))
                        return "remote: integer|Long expected";
                return null;
            };

            /**
             * Creates a Size message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof file.FileDiff.Size
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {file.FileDiff.Size} Size
             */
            Size.fromObject = function fromObject(object, long) {
                if (object instanceof $root.file.FileDiff.Size)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".file.FileDiff.Size: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.file.FileDiff.Size();
                if (object.current != null)
                    if ($util.Long)
                        message.current = $util.Long.fromValue(object.current, true);
                    else if (typeof object.current === "string")
                        message.current = parseInt(object.current, 10);
                    else if (typeof object.current === "number")
                        message.current = object.current;
                    else if (typeof object.current === "object")
                        message.current = new $util.LongBits(object.current.low >>> 0, object.current.high >>> 0).toNumber(true);
                if (object.remote != null)
                    if ($util.Long)
                        message.remote = $util.Long.fromValue(object.remote, true);
                    else if (typeof object.remote === "string")
                        message.remote = parseInt(object.remote, 10);
                    else if (typeof object.remote === "number")
                        message.remote = object.remote;
                    else if (typeof object.remote === "object")
                        message.remote = new $util.LongBits(object.remote.low >>> 0, object.remote.high >>> 0).toNumber(true);
                return message;
            };

            /**
             * Creates a plain object from a Size message. Also converts values to other types if specified.
             * @function toObject
             * @memberof file.FileDiff.Size
             * @static
             * @param {file.FileDiff.Size} message Size
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            Size.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults) {
                    if ($util.Long) {
                        var long = new $util.Long(0, 0, true);
                        object.current = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                    } else
                        object.current = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                    if ($util.Long) {
                        var long = new $util.Long(0, 0, true);
                        object.remote = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                    } else
                        object.remote = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                }
                if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                    if (typeof BigInt !== "undefined" && options.longs === BigInt)
                        object.current = typeof message.current === "number" ? BigInt(message.current) : $util.Long.fromBits(message.current.low >>> 0, message.current.high >>> 0, true).toBigInt();
                    else if (typeof message.current === "number")
                        object.current = options.longs === String ? String(message.current) : message.current;
                    else
                        object.current = options.longs === String ? $util.Long.prototype.toString.call(message.current) : options.longs === Number ? new $util.LongBits(message.current.low >>> 0, message.current.high >>> 0).toNumber(true) : message.current;
                if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                    if (typeof BigInt !== "undefined" && options.longs === BigInt)
                        object.remote = typeof message.remote === "number" ? BigInt(message.remote) : $util.Long.fromBits(message.remote.low >>> 0, message.remote.high >>> 0, true).toBigInt();
                    else if (typeof message.remote === "number")
                        object.remote = options.longs === String ? String(message.remote) : message.remote;
                    else
                        object.remote = options.longs === String ? $util.Long.prototype.toString.call(message.remote) : options.longs === Number ? new $util.LongBits(message.remote.low >>> 0, message.remote.high >>> 0).toNumber(true) : message.remote;
                return object;
            };

            /**
             * Converts this Size to JSON.
             * @function toJSON
             * @memberof file.FileDiff.Size
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            Size.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for Size
             * @function getTypeUrl
             * @memberof file.FileDiff.Size
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            Size.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/file.FileDiff.Size";
            };

            return Size;
        })();

        return FileDiff;
    })();

    file.FileSyncUploadRequestBody = (function() {

        /**
         * Properties of a FileSyncUploadRequestBody.
         * @memberof file
         * @interface IFileSyncUploadRequestBody
         * @property {file.IOptionsToUploadLocal|null} [opts] FileSyncUploadRequestBody opts
         */

        /**
         * Constructs a new FileSyncUploadRequestBody.
         * @memberof file
         * @classdesc Represents a FileSyncUploadRequestBody.
         * @implements IFileSyncUploadRequestBody
         * @constructor
         * @param {file.IFileSyncUploadRequestBody=} [properties] Properties to set
         */
        function FileSyncUploadRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileSyncUploadRequestBody opts.
         * @member {file.IOptionsToUploadLocal|null|undefined} opts
         * @memberof file.FileSyncUploadRequestBody
         * @instance
         */
        FileSyncUploadRequestBody.prototype.opts = null;

        /**
         * Creates a new FileSyncUploadRequestBody instance using the specified properties.
         * @function create
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {file.IFileSyncUploadRequestBody=} [properties] Properties to set
         * @returns {file.FileSyncUploadRequestBody} FileSyncUploadRequestBody instance
         */
        FileSyncUploadRequestBody.create = function create(properties) {
            return new FileSyncUploadRequestBody(properties);
        };

        /**
         * Encodes the specified FileSyncUploadRequestBody message. Does not implicitly {@link file.FileSyncUploadRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {file.IFileSyncUploadRequestBody} message FileSyncUploadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncUploadRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.file.OptionsToUploadLocal.encode(message.opts, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FileSyncUploadRequestBody message, length delimited. Does not implicitly {@link file.FileSyncUploadRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {file.IFileSyncUploadRequestBody} message FileSyncUploadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncUploadRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileSyncUploadRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileSyncUploadRequestBody} FileSyncUploadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncUploadRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncUploadRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.opts = $root.file.OptionsToUploadLocal.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileSyncUploadRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.FileSyncUploadRequestBody} FileSyncUploadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncUploadRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileSyncUploadRequestBody message.
         * @function verify
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileSyncUploadRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts")) {
                var error = $root.file.OptionsToUploadLocal.verify(message.opts, long + 1);
                if (error)
                    return "opts." + error;
            }
            return null;
        };

        /**
         * Creates a FileSyncUploadRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileSyncUploadRequestBody} FileSyncUploadRequestBody
         */
        FileSyncUploadRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.FileSyncUploadRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.FileSyncUploadRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.FileSyncUploadRequestBody();
            if (object.opts != null) {
                if (!$util.isObject(object.opts))
                    throw TypeError(".file.FileSyncUploadRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToUploadLocal.fromObject(object.opts, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a FileSyncUploadRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {file.FileSyncUploadRequestBody} message FileSyncUploadRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileSyncUploadRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.opts = null;
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                object.opts = $root.file.OptionsToUploadLocal.toObject(message.opts, options, q + 1);
            return object;
        };

        /**
         * Converts this FileSyncUploadRequestBody to JSON.
         * @function toJSON
         * @memberof file.FileSyncUploadRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileSyncUploadRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileSyncUploadRequestBody
         * @function getTypeUrl
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileSyncUploadRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.FileSyncUploadRequestBody";
        };

        return FileSyncUploadRequestBody;
    })();

    file.FileSyncUploadReplyBody = (function() {

        /**
         * Properties of a FileSyncUploadReplyBody.
         * @memberof file
         * @interface IFileSyncUploadReplyBody
         * @property {common.IUInt64Value|null} [uploadedVersion] FileSyncUploadReplyBody uploadedVersion
         */

        /**
         * Constructs a new FileSyncUploadReplyBody.
         * @memberof file
         * @classdesc Represents a FileSyncUploadReplyBody.
         * @implements IFileSyncUploadReplyBody
         * @constructor
         * @param {file.IFileSyncUploadReplyBody=} [properties] Properties to set
         */
        function FileSyncUploadReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileSyncUploadReplyBody uploadedVersion.
         * @member {common.IUInt64Value|null|undefined} uploadedVersion
         * @memberof file.FileSyncUploadReplyBody
         * @instance
         */
        FileSyncUploadReplyBody.prototype.uploadedVersion = null;

        /**
         * Creates a new FileSyncUploadReplyBody instance using the specified properties.
         * @function create
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {file.IFileSyncUploadReplyBody=} [properties] Properties to set
         * @returns {file.FileSyncUploadReplyBody} FileSyncUploadReplyBody instance
         */
        FileSyncUploadReplyBody.create = function create(properties) {
            return new FileSyncUploadReplyBody(properties);
        };

        /**
         * Encodes the specified FileSyncUploadReplyBody message. Does not implicitly {@link file.FileSyncUploadReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {file.IFileSyncUploadReplyBody} message FileSyncUploadReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncUploadReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.uploadedVersion != null && Object.hasOwnProperty.call(message, "uploadedVersion"))
                $root.common.UInt64Value.encode(message.uploadedVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FileSyncUploadReplyBody message, length delimited. Does not implicitly {@link file.FileSyncUploadReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {file.IFileSyncUploadReplyBody} message FileSyncUploadReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncUploadReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileSyncUploadReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileSyncUploadReplyBody} FileSyncUploadReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncUploadReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncUploadReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.uploadedVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileSyncUploadReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.FileSyncUploadReplyBody} FileSyncUploadReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncUploadReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileSyncUploadReplyBody message.
         * @function verify
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileSyncUploadReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.uploadedVersion != null && Object.hasOwnProperty.call(message, "uploadedVersion")) {
                var error = $root.common.UInt64Value.verify(message.uploadedVersion, long + 1);
                if (error)
                    return "uploadedVersion." + error;
            }
            return null;
        };

        /**
         * Creates a FileSyncUploadReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileSyncUploadReplyBody} FileSyncUploadReplyBody
         */
        FileSyncUploadReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.FileSyncUploadReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.FileSyncUploadReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.FileSyncUploadReplyBody();
            if (object.uploadedVersion != null) {
                if (!$util.isObject(object.uploadedVersion))
                    throw TypeError(".file.FileSyncUploadReplyBody.uploadedVersion: object expected");
                message.uploadedVersion = $root.common.UInt64Value.fromObject(object.uploadedVersion, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a FileSyncUploadReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {file.FileSyncUploadReplyBody} message FileSyncUploadReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileSyncUploadReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.uploadedVersion = null;
            if (message.uploadedVersion != null && Object.hasOwnProperty.call(message, "uploadedVersion"))
                object.uploadedVersion = $root.common.UInt64Value.toObject(message.uploadedVersion, options, q + 1);
            return object;
        };

        /**
         * Converts this FileSyncUploadReplyBody to JSON.
         * @function toJSON
         * @memberof file.FileSyncUploadReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileSyncUploadReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileSyncUploadReplyBody
         * @function getTypeUrl
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileSyncUploadReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.FileSyncUploadReplyBody";
        };

        return FileSyncUploadReplyBody;
    })();

    file.FileSyncStartUploadReplyBody = (function() {

        /**
         * Properties of a FileSyncStartUploadReplyBody.
         * @memberof file
         * @interface IFileSyncStartUploadReplyBody
         * @property {file.FileSyncStartUploadReplyBody.IUploadInfo|null} [startedUpload] FileSyncStartUploadReplyBody startedUpload
         */

        /**
         * Constructs a new FileSyncStartUploadReplyBody.
         * @memberof file
         * @classdesc Represents a FileSyncStartUploadReplyBody.
         * @implements IFileSyncStartUploadReplyBody
         * @constructor
         * @param {file.IFileSyncStartUploadReplyBody=} [properties] Properties to set
         */
        function FileSyncStartUploadReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileSyncStartUploadReplyBody startedUpload.
         * @member {file.FileSyncStartUploadReplyBody.IUploadInfo|null|undefined} startedUpload
         * @memberof file.FileSyncStartUploadReplyBody
         * @instance
         */
        FileSyncStartUploadReplyBody.prototype.startedUpload = null;

        /**
         * Creates a new FileSyncStartUploadReplyBody instance using the specified properties.
         * @function create
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {file.IFileSyncStartUploadReplyBody=} [properties] Properties to set
         * @returns {file.FileSyncStartUploadReplyBody} FileSyncStartUploadReplyBody instance
         */
        FileSyncStartUploadReplyBody.create = function create(properties) {
            return new FileSyncStartUploadReplyBody(properties);
        };

        /**
         * Encodes the specified FileSyncStartUploadReplyBody message. Does not implicitly {@link file.FileSyncStartUploadReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {file.IFileSyncStartUploadReplyBody} message FileSyncStartUploadReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncStartUploadReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.startedUpload != null && Object.hasOwnProperty.call(message, "startedUpload"))
                $root.file.FileSyncStartUploadReplyBody.UploadInfo.encode(message.startedUpload, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FileSyncStartUploadReplyBody message, length delimited. Does not implicitly {@link file.FileSyncStartUploadReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {file.IFileSyncStartUploadReplyBody} message FileSyncStartUploadReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncStartUploadReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileSyncStartUploadReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileSyncStartUploadReplyBody} FileSyncStartUploadReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncStartUploadReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncStartUploadReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.startedUpload = $root.file.FileSyncStartUploadReplyBody.UploadInfo.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileSyncStartUploadReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.FileSyncStartUploadReplyBody} FileSyncStartUploadReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncStartUploadReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileSyncStartUploadReplyBody message.
         * @function verify
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileSyncStartUploadReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.startedUpload != null && Object.hasOwnProperty.call(message, "startedUpload")) {
                var error = $root.file.FileSyncStartUploadReplyBody.UploadInfo.verify(message.startedUpload, long + 1);
                if (error)
                    return "startedUpload." + error;
            }
            return null;
        };

        /**
         * Creates a FileSyncStartUploadReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileSyncStartUploadReplyBody} FileSyncStartUploadReplyBody
         */
        FileSyncStartUploadReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.FileSyncStartUploadReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.FileSyncStartUploadReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.FileSyncStartUploadReplyBody();
            if (object.startedUpload != null) {
                if (!$util.isObject(object.startedUpload))
                    throw TypeError(".file.FileSyncStartUploadReplyBody.startedUpload: object expected");
                message.startedUpload = $root.file.FileSyncStartUploadReplyBody.UploadInfo.fromObject(object.startedUpload, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a FileSyncStartUploadReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {file.FileSyncStartUploadReplyBody} message FileSyncStartUploadReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileSyncStartUploadReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.startedUpload = null;
            if (message.startedUpload != null && Object.hasOwnProperty.call(message, "startedUpload"))
                object.startedUpload = $root.file.FileSyncStartUploadReplyBody.UploadInfo.toObject(message.startedUpload, options, q + 1);
            return object;
        };

        /**
         * Converts this FileSyncStartUploadReplyBody to JSON.
         * @function toJSON
         * @memberof file.FileSyncStartUploadReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileSyncStartUploadReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileSyncStartUploadReplyBody
         * @function getTypeUrl
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileSyncStartUploadReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.FileSyncStartUploadReplyBody";
        };

        FileSyncStartUploadReplyBody.UploadInfo = (function() {

            /**
             * Properties of an UploadInfo.
             * @memberof file.FileSyncStartUploadReplyBody
             * @interface IUploadInfo
             * @property {number|Long|null} [uploadVersion] UploadInfo uploadVersion
             * @property {number|Long|null} [uploadTaskId] UploadInfo uploadTaskId
             */

            /**
             * Constructs a new UploadInfo.
             * @memberof file.FileSyncStartUploadReplyBody
             * @classdesc Represents an UploadInfo.
             * @implements IUploadInfo
             * @constructor
             * @param {file.FileSyncStartUploadReplyBody.IUploadInfo=} [properties] Properties to set
             */
            function UploadInfo(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * UploadInfo uploadVersion.
             * @member {number|Long} uploadVersion
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @instance
             */
            UploadInfo.prototype.uploadVersion = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

            /**
             * UploadInfo uploadTaskId.
             * @member {number|Long} uploadTaskId
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @instance
             */
            UploadInfo.prototype.uploadTaskId = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

            /**
             * Creates a new UploadInfo instance using the specified properties.
             * @function create
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {file.FileSyncStartUploadReplyBody.IUploadInfo=} [properties] Properties to set
             * @returns {file.FileSyncStartUploadReplyBody.UploadInfo} UploadInfo instance
             */
            UploadInfo.create = function create(properties) {
                return new UploadInfo(properties);
            };

            /**
             * Encodes the specified UploadInfo message. Does not implicitly {@link file.FileSyncStartUploadReplyBody.UploadInfo.verify|verify} messages.
             * @function encode
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {file.FileSyncStartUploadReplyBody.IUploadInfo} message UploadInfo message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            UploadInfo.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                    writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.uploadVersion);
                if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                    writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.uploadTaskId);
                return writer;
            };

            /**
             * Encodes the specified UploadInfo message, length delimited. Does not implicitly {@link file.FileSyncStartUploadReplyBody.UploadInfo.verify|verify} messages.
             * @function encodeDelimited
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {file.FileSyncStartUploadReplyBody.IUploadInfo} message UploadInfo message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            UploadInfo.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes an UploadInfo message from the specified reader or buffer.
             * @function decode
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {file.FileSyncStartUploadReplyBody.UploadInfo} UploadInfo
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            UploadInfo.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncStartUploadReplyBody.UploadInfo();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.uploadVersion = reader.uint64();
                            break;
                        }
                    case 2: {
                            message.uploadTaskId = reader.uint64();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes an UploadInfo message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {file.FileSyncStartUploadReplyBody.UploadInfo} UploadInfo
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            UploadInfo.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies an UploadInfo message.
             * @function verify
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            UploadInfo.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                    if (!$util.isInteger(message.uploadVersion) && !(message.uploadVersion && $util.isInteger(message.uploadVersion.low) && $util.isInteger(message.uploadVersion.high)))
                        return "uploadVersion: integer|Long expected";
                if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                    if (!$util.isInteger(message.uploadTaskId) && !(message.uploadTaskId && $util.isInteger(message.uploadTaskId.low) && $util.isInteger(message.uploadTaskId.high)))
                        return "uploadTaskId: integer|Long expected";
                return null;
            };

            /**
             * Creates an UploadInfo message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {file.FileSyncStartUploadReplyBody.UploadInfo} UploadInfo
             */
            UploadInfo.fromObject = function fromObject(object, long) {
                if (object instanceof $root.file.FileSyncStartUploadReplyBody.UploadInfo)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".file.FileSyncStartUploadReplyBody.UploadInfo: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.file.FileSyncStartUploadReplyBody.UploadInfo();
                if (object.uploadVersion != null)
                    if ($util.Long)
                        message.uploadVersion = $util.Long.fromValue(object.uploadVersion, true);
                    else if (typeof object.uploadVersion === "string")
                        message.uploadVersion = parseInt(object.uploadVersion, 10);
                    else if (typeof object.uploadVersion === "number")
                        message.uploadVersion = object.uploadVersion;
                    else if (typeof object.uploadVersion === "object")
                        message.uploadVersion = new $util.LongBits(object.uploadVersion.low >>> 0, object.uploadVersion.high >>> 0).toNumber(true);
                if (object.uploadTaskId != null)
                    if ($util.Long)
                        message.uploadTaskId = $util.Long.fromValue(object.uploadTaskId, true);
                    else if (typeof object.uploadTaskId === "string")
                        message.uploadTaskId = parseInt(object.uploadTaskId, 10);
                    else if (typeof object.uploadTaskId === "number")
                        message.uploadTaskId = object.uploadTaskId;
                    else if (typeof object.uploadTaskId === "object")
                        message.uploadTaskId = new $util.LongBits(object.uploadTaskId.low >>> 0, object.uploadTaskId.high >>> 0).toNumber(true);
                return message;
            };

            /**
             * Creates a plain object from an UploadInfo message. Also converts values to other types if specified.
             * @function toObject
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {file.FileSyncStartUploadReplyBody.UploadInfo} message UploadInfo
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            UploadInfo.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults) {
                    if ($util.Long) {
                        var long = new $util.Long(0, 0, true);
                        object.uploadVersion = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                    } else
                        object.uploadVersion = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                    if ($util.Long) {
                        var long = new $util.Long(0, 0, true);
                        object.uploadTaskId = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                    } else
                        object.uploadTaskId = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                }
                if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                    if (typeof BigInt !== "undefined" && options.longs === BigInt)
                        object.uploadVersion = typeof message.uploadVersion === "number" ? BigInt(message.uploadVersion) : $util.Long.fromBits(message.uploadVersion.low >>> 0, message.uploadVersion.high >>> 0, true).toBigInt();
                    else if (typeof message.uploadVersion === "number")
                        object.uploadVersion = options.longs === String ? String(message.uploadVersion) : message.uploadVersion;
                    else
                        object.uploadVersion = options.longs === String ? $util.Long.prototype.toString.call(message.uploadVersion) : options.longs === Number ? new $util.LongBits(message.uploadVersion.low >>> 0, message.uploadVersion.high >>> 0).toNumber(true) : message.uploadVersion;
                if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                    if (typeof BigInt !== "undefined" && options.longs === BigInt)
                        object.uploadTaskId = typeof message.uploadTaskId === "number" ? BigInt(message.uploadTaskId) : $util.Long.fromBits(message.uploadTaskId.low >>> 0, message.uploadTaskId.high >>> 0, true).toBigInt();
                    else if (typeof message.uploadTaskId === "number")
                        object.uploadTaskId = options.longs === String ? String(message.uploadTaskId) : message.uploadTaskId;
                    else
                        object.uploadTaskId = options.longs === String ? $util.Long.prototype.toString.call(message.uploadTaskId) : options.longs === Number ? new $util.LongBits(message.uploadTaskId.low >>> 0, message.uploadTaskId.high >>> 0).toNumber(true) : message.uploadTaskId;
                return object;
            };

            /**
             * Converts this UploadInfo to JSON.
             * @function toJSON
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            UploadInfo.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for UploadInfo
             * @function getTypeUrl
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            UploadInfo.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/file.FileSyncStartUploadReplyBody.UploadInfo";
            };

            return UploadInfo;
        })();

        return FileSyncStartUploadReplyBody;
    })();

    file.OptionsToUploadLocal = (function() {

        /**
         * Properties of an OptionsToUploadLocal.
         * @memberof file
         * @interface IOptionsToUploadLocal
         * @property {common.IUInt64Value|null} [localVersion] OptionsToUploadLocal localVersion
         * @property {common.IUInt64Value|null} [uploadVersion] OptionsToUploadLocal uploadVersion
         */

        /**
         * Constructs a new OptionsToUploadLocal.
         * @memberof file
         * @classdesc Represents an OptionsToUploadLocal.
         * @implements IOptionsToUploadLocal
         * @constructor
         * @param {file.IOptionsToUploadLocal=} [properties] Properties to set
         */
        function OptionsToUploadLocal(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * OptionsToUploadLocal localVersion.
         * @member {common.IUInt64Value|null|undefined} localVersion
         * @memberof file.OptionsToUploadLocal
         * @instance
         */
        OptionsToUploadLocal.prototype.localVersion = null;

        /**
         * OptionsToUploadLocal uploadVersion.
         * @member {common.IUInt64Value|null|undefined} uploadVersion
         * @memberof file.OptionsToUploadLocal
         * @instance
         */
        OptionsToUploadLocal.prototype.uploadVersion = null;

        /**
         * Creates a new OptionsToUploadLocal instance using the specified properties.
         * @function create
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {file.IOptionsToUploadLocal=} [properties] Properties to set
         * @returns {file.OptionsToUploadLocal} OptionsToUploadLocal instance
         */
        OptionsToUploadLocal.create = function create(properties) {
            return new OptionsToUploadLocal(properties);
        };

        /**
         * Encodes the specified OptionsToUploadLocal message. Does not implicitly {@link file.OptionsToUploadLocal.verify|verify} messages.
         * @function encode
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {file.IOptionsToUploadLocal} message OptionsToUploadLocal message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        OptionsToUploadLocal.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                $root.common.UInt64Value.encode(message.localVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                $root.common.UInt64Value.encode(message.uploadVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified OptionsToUploadLocal message, length delimited. Does not implicitly {@link file.OptionsToUploadLocal.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {file.IOptionsToUploadLocal} message OptionsToUploadLocal message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        OptionsToUploadLocal.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an OptionsToUploadLocal message from the specified reader or buffer.
         * @function decode
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.OptionsToUploadLocal} OptionsToUploadLocal
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        OptionsToUploadLocal.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.OptionsToUploadLocal();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.localVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.uploadVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an OptionsToUploadLocal message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.OptionsToUploadLocal} OptionsToUploadLocal
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        OptionsToUploadLocal.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an OptionsToUploadLocal message.
         * @function verify
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        OptionsToUploadLocal.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion")) {
                var error = $root.common.UInt64Value.verify(message.localVersion, long + 1);
                if (error)
                    return "localVersion." + error;
            }
            if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion")) {
                var error = $root.common.UInt64Value.verify(message.uploadVersion, long + 1);
                if (error)
                    return "uploadVersion." + error;
            }
            return null;
        };

        /**
         * Creates an OptionsToUploadLocal message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.OptionsToUploadLocal} OptionsToUploadLocal
         */
        OptionsToUploadLocal.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.OptionsToUploadLocal)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.OptionsToUploadLocal: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.OptionsToUploadLocal();
            if (object.localVersion != null) {
                if (!$util.isObject(object.localVersion))
                    throw TypeError(".file.OptionsToUploadLocal.localVersion: object expected");
                message.localVersion = $root.common.UInt64Value.fromObject(object.localVersion, long + 1);
            }
            if (object.uploadVersion != null) {
                if (!$util.isObject(object.uploadVersion))
                    throw TypeError(".file.OptionsToUploadLocal.uploadVersion: object expected");
                message.uploadVersion = $root.common.UInt64Value.fromObject(object.uploadVersion, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an OptionsToUploadLocal message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {file.OptionsToUploadLocal} message OptionsToUploadLocal
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        OptionsToUploadLocal.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.localVersion = null;
                object.uploadVersion = null;
            }
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                object.localVersion = $root.common.UInt64Value.toObject(message.localVersion, options, q + 1);
            if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                object.uploadVersion = $root.common.UInt64Value.toObject(message.uploadVersion, options, q + 1);
            return object;
        };

        /**
         * Converts this OptionsToUploadLocal to JSON.
         * @function toJSON
         * @memberof file.OptionsToUploadLocal
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        OptionsToUploadLocal.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for OptionsToUploadLocal
         * @function getTypeUrl
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        OptionsToUploadLocal.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.OptionsToUploadLocal";
        };

        return OptionsToUploadLocal;
    })();

    file.WatchUploadRequestBody = (function() {

        /**
         * Properties of a WatchUploadRequestBody.
         * @memberof file
         * @interface IWatchUploadRequestBody
         * @property {number|Long|null} [uploadTaskId] WatchUploadRequestBody uploadTaskId
         */

        /**
         * Constructs a new WatchUploadRequestBody.
         * @memberof file
         * @classdesc Represents a WatchUploadRequestBody.
         * @implements IWatchUploadRequestBody
         * @constructor
         * @param {file.IWatchUploadRequestBody=} [properties] Properties to set
         */
        function WatchUploadRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * WatchUploadRequestBody uploadTaskId.
         * @member {number|Long} uploadTaskId
         * @memberof file.WatchUploadRequestBody
         * @instance
         */
        WatchUploadRequestBody.prototype.uploadTaskId = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new WatchUploadRequestBody instance using the specified properties.
         * @function create
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {file.IWatchUploadRequestBody=} [properties] Properties to set
         * @returns {file.WatchUploadRequestBody} WatchUploadRequestBody instance
         */
        WatchUploadRequestBody.create = function create(properties) {
            return new WatchUploadRequestBody(properties);
        };

        /**
         * Encodes the specified WatchUploadRequestBody message. Does not implicitly {@link file.WatchUploadRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {file.IWatchUploadRequestBody} message WatchUploadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WatchUploadRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.uploadTaskId);
            return writer;
        };

        /**
         * Encodes the specified WatchUploadRequestBody message, length delimited. Does not implicitly {@link file.WatchUploadRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {file.IWatchUploadRequestBody} message WatchUploadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WatchUploadRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a WatchUploadRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.WatchUploadRequestBody} WatchUploadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WatchUploadRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.WatchUploadRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.uploadTaskId = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a WatchUploadRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.WatchUploadRequestBody} WatchUploadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WatchUploadRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a WatchUploadRequestBody message.
         * @function verify
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        WatchUploadRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                if (!$util.isInteger(message.uploadTaskId) && !(message.uploadTaskId && $util.isInteger(message.uploadTaskId.low) && $util.isInteger(message.uploadTaskId.high)))
                    return "uploadTaskId: integer|Long expected";
            return null;
        };

        /**
         * Creates a WatchUploadRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.WatchUploadRequestBody} WatchUploadRequestBody
         */
        WatchUploadRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.WatchUploadRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.WatchUploadRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.WatchUploadRequestBody();
            if (object.uploadTaskId != null)
                if ($util.Long)
                    message.uploadTaskId = $util.Long.fromValue(object.uploadTaskId, true);
                else if (typeof object.uploadTaskId === "string")
                    message.uploadTaskId = parseInt(object.uploadTaskId, 10);
                else if (typeof object.uploadTaskId === "number")
                    message.uploadTaskId = object.uploadTaskId;
                else if (typeof object.uploadTaskId === "object")
                    message.uploadTaskId = new $util.LongBits(object.uploadTaskId.low >>> 0, object.uploadTaskId.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from a WatchUploadRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {file.WatchUploadRequestBody} message WatchUploadRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        WatchUploadRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.uploadTaskId = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.uploadTaskId = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.uploadTaskId = typeof message.uploadTaskId === "number" ? BigInt(message.uploadTaskId) : $util.Long.fromBits(message.uploadTaskId.low >>> 0, message.uploadTaskId.high >>> 0, true).toBigInt();
                else if (typeof message.uploadTaskId === "number")
                    object.uploadTaskId = options.longs === String ? String(message.uploadTaskId) : message.uploadTaskId;
                else
                    object.uploadTaskId = options.longs === String ? $util.Long.prototype.toString.call(message.uploadTaskId) : options.longs === Number ? new $util.LongBits(message.uploadTaskId.low >>> 0, message.uploadTaskId.high >>> 0).toNumber(true) : message.uploadTaskId;
            return object;
        };

        /**
         * Converts this WatchUploadRequestBody to JSON.
         * @function toJSON
         * @memberof file.WatchUploadRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        WatchUploadRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for WatchUploadRequestBody
         * @function getTypeUrl
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        WatchUploadRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.WatchUploadRequestBody";
        };

        return WatchUploadRequestBody;
    })();

    file.UploadEventMsg = (function() {

        /**
         * Properties of an UploadEventMsg.
         * @memberof file
         * @interface IUploadEventMsg
         * @property {string|null} [type] UploadEventMsg type
         * @property {number|Long|null} [uploadTaskId] UploadEventMsg uploadTaskId
         * @property {number|Long|null} [localVersion] UploadEventMsg localVersion
         * @property {number|Long|null} [uploadVersion] UploadEventMsg uploadVersion
         */

        /**
         * Constructs a new UploadEventMsg.
         * @memberof file
         * @classdesc Represents an UploadEventMsg.
         * @implements IUploadEventMsg
         * @constructor
         * @param {file.IUploadEventMsg=} [properties] Properties to set
         */
        function UploadEventMsg(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * UploadEventMsg type.
         * @member {string} type
         * @memberof file.UploadEventMsg
         * @instance
         */
        UploadEventMsg.prototype.type = "";

        /**
         * UploadEventMsg uploadTaskId.
         * @member {number|Long} uploadTaskId
         * @memberof file.UploadEventMsg
         * @instance
         */
        UploadEventMsg.prototype.uploadTaskId = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * UploadEventMsg localVersion.
         * @member {number|Long} localVersion
         * @memberof file.UploadEventMsg
         * @instance
         */
        UploadEventMsg.prototype.localVersion = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * UploadEventMsg uploadVersion.
         * @member {number|Long} uploadVersion
         * @memberof file.UploadEventMsg
         * @instance
         */
        UploadEventMsg.prototype.uploadVersion = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new UploadEventMsg instance using the specified properties.
         * @function create
         * @memberof file.UploadEventMsg
         * @static
         * @param {file.IUploadEventMsg=} [properties] Properties to set
         * @returns {file.UploadEventMsg} UploadEventMsg instance
         */
        UploadEventMsg.create = function create(properties) {
            return new UploadEventMsg(properties);
        };

        /**
         * Encodes the specified UploadEventMsg message. Does not implicitly {@link file.UploadEventMsg.verify|verify} messages.
         * @function encode
         * @memberof file.UploadEventMsg
         * @static
         * @param {file.IUploadEventMsg} message UploadEventMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UploadEventMsg.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.type);
            if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.uploadTaskId);
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.localVersion);
            if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                writer.uint32(/* id 4, wireType 0 =*/32).uint64(message.uploadVersion);
            return writer;
        };

        /**
         * Encodes the specified UploadEventMsg message, length delimited. Does not implicitly {@link file.UploadEventMsg.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.UploadEventMsg
         * @static
         * @param {file.IUploadEventMsg} message UploadEventMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UploadEventMsg.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an UploadEventMsg message from the specified reader or buffer.
         * @function decode
         * @memberof file.UploadEventMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.UploadEventMsg} UploadEventMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UploadEventMsg.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.UploadEventMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.type = reader.string();
                        break;
                    }
                case 2: {
                        message.uploadTaskId = reader.uint64();
                        break;
                    }
                case 3: {
                        message.localVersion = reader.uint64();
                        break;
                    }
                case 4: {
                        message.uploadVersion = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an UploadEventMsg message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.UploadEventMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.UploadEventMsg} UploadEventMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UploadEventMsg.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an UploadEventMsg message.
         * @function verify
         * @memberof file.UploadEventMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        UploadEventMsg.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                if (!$util.isInteger(message.uploadTaskId) && !(message.uploadTaskId && $util.isInteger(message.uploadTaskId.low) && $util.isInteger(message.uploadTaskId.high)))
                    return "uploadTaskId: integer|Long expected";
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                if (!$util.isInteger(message.localVersion) && !(message.localVersion && $util.isInteger(message.localVersion.low) && $util.isInteger(message.localVersion.high)))
                    return "localVersion: integer|Long expected";
            if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                if (!$util.isInteger(message.uploadVersion) && !(message.uploadVersion && $util.isInteger(message.uploadVersion.low) && $util.isInteger(message.uploadVersion.high)))
                    return "uploadVersion: integer|Long expected";
            return null;
        };

        /**
         * Creates an UploadEventMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.UploadEventMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.UploadEventMsg} UploadEventMsg
         */
        UploadEventMsg.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.UploadEventMsg)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.UploadEventMsg: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.UploadEventMsg();
            if (object.type != null)
                message.type = String(object.type);
            if (object.uploadTaskId != null)
                if ($util.Long)
                    message.uploadTaskId = $util.Long.fromValue(object.uploadTaskId, true);
                else if (typeof object.uploadTaskId === "string")
                    message.uploadTaskId = parseInt(object.uploadTaskId, 10);
                else if (typeof object.uploadTaskId === "number")
                    message.uploadTaskId = object.uploadTaskId;
                else if (typeof object.uploadTaskId === "object")
                    message.uploadTaskId = new $util.LongBits(object.uploadTaskId.low >>> 0, object.uploadTaskId.high >>> 0).toNumber(true);
            if (object.localVersion != null)
                if ($util.Long)
                    message.localVersion = $util.Long.fromValue(object.localVersion, true);
                else if (typeof object.localVersion === "string")
                    message.localVersion = parseInt(object.localVersion, 10);
                else if (typeof object.localVersion === "number")
                    message.localVersion = object.localVersion;
                else if (typeof object.localVersion === "object")
                    message.localVersion = new $util.LongBits(object.localVersion.low >>> 0, object.localVersion.high >>> 0).toNumber(true);
            if (object.uploadVersion != null)
                if ($util.Long)
                    message.uploadVersion = $util.Long.fromValue(object.uploadVersion, true);
                else if (typeof object.uploadVersion === "string")
                    message.uploadVersion = parseInt(object.uploadVersion, 10);
                else if (typeof object.uploadVersion === "number")
                    message.uploadVersion = object.uploadVersion;
                else if (typeof object.uploadVersion === "object")
                    message.uploadVersion = new $util.LongBits(object.uploadVersion.low >>> 0, object.uploadVersion.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from an UploadEventMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.UploadEventMsg
         * @static
         * @param {file.UploadEventMsg} message UploadEventMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        UploadEventMsg.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.type = "";
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.uploadTaskId = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.uploadTaskId = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.localVersion = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.localVersion = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.uploadVersion = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.uploadVersion = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            }
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                object.type = message.type;
            if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.uploadTaskId = typeof message.uploadTaskId === "number" ? BigInt(message.uploadTaskId) : $util.Long.fromBits(message.uploadTaskId.low >>> 0, message.uploadTaskId.high >>> 0, true).toBigInt();
                else if (typeof message.uploadTaskId === "number")
                    object.uploadTaskId = options.longs === String ? String(message.uploadTaskId) : message.uploadTaskId;
                else
                    object.uploadTaskId = options.longs === String ? $util.Long.prototype.toString.call(message.uploadTaskId) : options.longs === Number ? new $util.LongBits(message.uploadTaskId.low >>> 0, message.uploadTaskId.high >>> 0).toNumber(true) : message.uploadTaskId;
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.localVersion = typeof message.localVersion === "number" ? BigInt(message.localVersion) : $util.Long.fromBits(message.localVersion.low >>> 0, message.localVersion.high >>> 0, true).toBigInt();
                else if (typeof message.localVersion === "number")
                    object.localVersion = options.longs === String ? String(message.localVersion) : message.localVersion;
                else
                    object.localVersion = options.longs === String ? $util.Long.prototype.toString.call(message.localVersion) : options.longs === Number ? new $util.LongBits(message.localVersion.low >>> 0, message.localVersion.high >>> 0).toNumber(true) : message.localVersion;
            if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.uploadVersion = typeof message.uploadVersion === "number" ? BigInt(message.uploadVersion) : $util.Long.fromBits(message.uploadVersion.low >>> 0, message.uploadVersion.high >>> 0, true).toBigInt();
                else if (typeof message.uploadVersion === "number")
                    object.uploadVersion = options.longs === String ? String(message.uploadVersion) : message.uploadVersion;
                else
                    object.uploadVersion = options.longs === String ? $util.Long.prototype.toString.call(message.uploadVersion) : options.longs === Number ? new $util.LongBits(message.uploadVersion.low >>> 0, message.uploadVersion.high >>> 0).toNumber(true) : message.uploadVersion;
            return object;
        };

        /**
         * Converts this UploadEventMsg to JSON.
         * @function toJSON
         * @memberof file.UploadEventMsg
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        UploadEventMsg.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for UploadEventMsg
         * @function getTypeUrl
         * @memberof file.UploadEventMsg
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        UploadEventMsg.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.UploadEventMsg";
        };

        return UploadEventMsg;
    })();

    return file;
})();

$root.fs = (function() {

    /**
     * Namespace fs.
     * @exports fs
     * @namespace
     */
    var fs = {};

    fs.FS = (function() {

        /**
         * Properties of a FS.
         * @memberof fs
         * @interface IFS
         * @property {string|null} [type] FS type
         * @property {boolean|null} [isVersioned] FS isVersioned
         * @property {boolean|null} [writable] FS writable
         * @property {string|null} [name] FS name
         * @property {common.IObjectReference|null} [impl] FS impl
         * @property {boolean|null} [isSynced] FS isSynced
         */

        /**
         * Constructs a new FS.
         * @memberof fs
         * @classdesc Represents a FS.
         * @implements IFS
         * @constructor
         * @param {fs.IFS=} [properties] Properties to set
         */
        function FS(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FS type.
         * @member {string} type
         * @memberof fs.FS
         * @instance
         */
        FS.prototype.type = "";

        /**
         * FS isVersioned.
         * @member {boolean} isVersioned
         * @memberof fs.FS
         * @instance
         */
        FS.prototype.isVersioned = false;

        /**
         * FS writable.
         * @member {boolean} writable
         * @memberof fs.FS
         * @instance
         */
        FS.prototype.writable = false;

        /**
         * FS name.
         * @member {string} name
         * @memberof fs.FS
         * @instance
         */
        FS.prototype.name = "";

        /**
         * FS impl.
         * @member {common.IObjectReference|null|undefined} impl
         * @memberof fs.FS
         * @instance
         */
        FS.prototype.impl = null;

        /**
         * FS isSynced.
         * @member {boolean} isSynced
         * @memberof fs.FS
         * @instance
         */
        FS.prototype.isSynced = false;

        /**
         * Creates a new FS instance using the specified properties.
         * @function create
         * @memberof fs.FS
         * @static
         * @param {fs.IFS=} [properties] Properties to set
         * @returns {fs.FS} FS instance
         */
        FS.create = function create(properties) {
            return new FS(properties);
        };

        /**
         * Encodes the specified FS message. Does not implicitly {@link fs.FS.verify|verify} messages.
         * @function encode
         * @memberof fs.FS
         * @static
         * @param {fs.IFS} message FS message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FS.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.type);
            if (message.isVersioned != null && Object.hasOwnProperty.call(message, "isVersioned"))
                writer.uint32(/* id 2, wireType 0 =*/16).bool(message.isVersioned);
            if (message.writable != null && Object.hasOwnProperty.call(message, "writable"))
                writer.uint32(/* id 3, wireType 0 =*/24).bool(message.writable);
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                writer.uint32(/* id 4, wireType 2 =*/34).string(message.name);
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl"))
                $root.common.ObjectReference.encode(message.impl, writer.uint32(/* id 5, wireType 2 =*/42).fork(), q + 1).ldelim();
            if (message.isSynced != null && Object.hasOwnProperty.call(message, "isSynced"))
                writer.uint32(/* id 6, wireType 0 =*/48).bool(message.isSynced);
            return writer;
        };

        /**
         * Encodes the specified FS message, length delimited. Does not implicitly {@link fs.FS.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FS
         * @static
         * @param {fs.IFS} message FS message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FS.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FS message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FS
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FS} FS
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FS.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FS();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.type = reader.string();
                        break;
                    }
                case 2: {
                        message.isVersioned = reader.bool();
                        break;
                    }
                case 3: {
                        message.writable = reader.bool();
                        break;
                    }
                case 4: {
                        message.name = reader.string();
                        break;
                    }
                case 5: {
                        message.impl = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 6: {
                        message.isSynced = reader.bool();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FS message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FS
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FS} FS
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FS.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FS message.
         * @function verify
         * @memberof fs.FS
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FS.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.isVersioned != null && Object.hasOwnProperty.call(message, "isVersioned"))
                if (typeof message.isVersioned !== "boolean")
                    return "isVersioned: boolean expected";
            if (message.writable != null && Object.hasOwnProperty.call(message, "writable"))
                if (typeof message.writable !== "boolean")
                    return "writable: boolean expected";
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl")) {
                var error = $root.common.ObjectReference.verify(message.impl, long + 1);
                if (error)
                    return "impl." + error;
            }
            if (message.isSynced != null && Object.hasOwnProperty.call(message, "isSynced"))
                if (typeof message.isSynced !== "boolean")
                    return "isSynced: boolean expected";
            return null;
        };

        /**
         * Creates a FS message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FS
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FS} FS
         */
        FS.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FS)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FS: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FS();
            if (object.type != null)
                message.type = String(object.type);
            if (object.isVersioned != null)
                message.isVersioned = Boolean(object.isVersioned);
            if (object.writable != null)
                message.writable = Boolean(object.writable);
            if (object.name != null)
                message.name = String(object.name);
            if (object.impl != null) {
                if (!$util.isObject(object.impl))
                    throw TypeError(".fs.FS.impl: object expected");
                message.impl = $root.common.ObjectReference.fromObject(object.impl, long + 1);
            }
            if (object.isSynced != null)
                message.isSynced = Boolean(object.isSynced);
            return message;
        };

        /**
         * Creates a plain object from a FS message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FS
         * @static
         * @param {fs.FS} message FS
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FS.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.isVersioned = false;
                object.writable = false;
                object.name = "";
                object.impl = null;
                object.isSynced = false;
            }
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                object.type = message.type;
            if (message.isVersioned != null && Object.hasOwnProperty.call(message, "isVersioned"))
                object.isVersioned = message.isVersioned;
            if (message.writable != null && Object.hasOwnProperty.call(message, "writable"))
                object.writable = message.writable;
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                object.name = message.name;
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl"))
                object.impl = $root.common.ObjectReference.toObject(message.impl, options, q + 1);
            if (message.isSynced != null && Object.hasOwnProperty.call(message, "isSynced"))
                object.isSynced = message.isSynced;
            return object;
        };

        /**
         * Converts this FS to JSON.
         * @function toJSON
         * @memberof fs.FS
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FS.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FS
         * @function getTypeUrl
         * @memberof fs.FS
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FS.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FS";
        };

        return FS;
    })();

    fs.CheckPresenceRequestBody = (function() {

        /**
         * Properties of a CheckPresenceRequestBody.
         * @memberof fs
         * @interface ICheckPresenceRequestBody
         * @property {string|null} [path] CheckPresenceRequestBody path
         * @property {common.IBooleanValue|null} [throwIfMissing] CheckPresenceRequestBody throwIfMissing
         */

        /**
         * Constructs a new CheckPresenceRequestBody.
         * @memberof fs
         * @classdesc Represents a CheckPresenceRequestBody.
         * @implements ICheckPresenceRequestBody
         * @constructor
         * @param {fs.ICheckPresenceRequestBody=} [properties] Properties to set
         */
        function CheckPresenceRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * CheckPresenceRequestBody path.
         * @member {string} path
         * @memberof fs.CheckPresenceRequestBody
         * @instance
         */
        CheckPresenceRequestBody.prototype.path = "";

        /**
         * CheckPresenceRequestBody throwIfMissing.
         * @member {common.IBooleanValue|null|undefined} throwIfMissing
         * @memberof fs.CheckPresenceRequestBody
         * @instance
         */
        CheckPresenceRequestBody.prototype.throwIfMissing = null;

        /**
         * Creates a new CheckPresenceRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.CheckPresenceRequestBody
         * @static
         * @param {fs.ICheckPresenceRequestBody=} [properties] Properties to set
         * @returns {fs.CheckPresenceRequestBody} CheckPresenceRequestBody instance
         */
        CheckPresenceRequestBody.create = function create(properties) {
            return new CheckPresenceRequestBody(properties);
        };

        /**
         * Encodes the specified CheckPresenceRequestBody message. Does not implicitly {@link fs.CheckPresenceRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.CheckPresenceRequestBody
         * @static
         * @param {fs.ICheckPresenceRequestBody} message CheckPresenceRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CheckPresenceRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.throwIfMissing != null && Object.hasOwnProperty.call(message, "throwIfMissing"))
                $root.common.BooleanValue.encode(message.throwIfMissing, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified CheckPresenceRequestBody message, length delimited. Does not implicitly {@link fs.CheckPresenceRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.CheckPresenceRequestBody
         * @static
         * @param {fs.ICheckPresenceRequestBody} message CheckPresenceRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CheckPresenceRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a CheckPresenceRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.CheckPresenceRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.CheckPresenceRequestBody} CheckPresenceRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CheckPresenceRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.CheckPresenceRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.throwIfMissing = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a CheckPresenceRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.CheckPresenceRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.CheckPresenceRequestBody} CheckPresenceRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CheckPresenceRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a CheckPresenceRequestBody message.
         * @function verify
         * @memberof fs.CheckPresenceRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        CheckPresenceRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.throwIfMissing != null && Object.hasOwnProperty.call(message, "throwIfMissing")) {
                var error = $root.common.BooleanValue.verify(message.throwIfMissing, long + 1);
                if (error)
                    return "throwIfMissing." + error;
            }
            return null;
        };

        /**
         * Creates a CheckPresenceRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.CheckPresenceRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.CheckPresenceRequestBody} CheckPresenceRequestBody
         */
        CheckPresenceRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.CheckPresenceRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.CheckPresenceRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.CheckPresenceRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.throwIfMissing != null) {
                if (!$util.isObject(object.throwIfMissing))
                    throw TypeError(".fs.CheckPresenceRequestBody.throwIfMissing: object expected");
                message.throwIfMissing = $root.common.BooleanValue.fromObject(object.throwIfMissing, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a CheckPresenceRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.CheckPresenceRequestBody
         * @static
         * @param {fs.CheckPresenceRequestBody} message CheckPresenceRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        CheckPresenceRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.throwIfMissing = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.throwIfMissing != null && Object.hasOwnProperty.call(message, "throwIfMissing"))
                object.throwIfMissing = $root.common.BooleanValue.toObject(message.throwIfMissing, options, q + 1);
            return object;
        };

        /**
         * Converts this CheckPresenceRequestBody to JSON.
         * @function toJSON
         * @memberof fs.CheckPresenceRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        CheckPresenceRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for CheckPresenceRequestBody
         * @function getTypeUrl
         * @memberof fs.CheckPresenceRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        CheckPresenceRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.CheckPresenceRequestBody";
        };

        return CheckPresenceRequestBody;
    })();

    fs.PathOnlyRequestBody = (function() {

        /**
         * Properties of a PathOnlyRequestBody.
         * @memberof fs
         * @interface IPathOnlyRequestBody
         * @property {string|null} [path] PathOnlyRequestBody path
         */

        /**
         * Constructs a new PathOnlyRequestBody.
         * @memberof fs
         * @classdesc Represents a PathOnlyRequestBody.
         * @implements IPathOnlyRequestBody
         * @constructor
         * @param {fs.IPathOnlyRequestBody=} [properties] Properties to set
         */
        function PathOnlyRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * PathOnlyRequestBody path.
         * @member {string} path
         * @memberof fs.PathOnlyRequestBody
         * @instance
         */
        PathOnlyRequestBody.prototype.path = "";

        /**
         * Creates a new PathOnlyRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.PathOnlyRequestBody
         * @static
         * @param {fs.IPathOnlyRequestBody=} [properties] Properties to set
         * @returns {fs.PathOnlyRequestBody} PathOnlyRequestBody instance
         */
        PathOnlyRequestBody.create = function create(properties) {
            return new PathOnlyRequestBody(properties);
        };

        /**
         * Encodes the specified PathOnlyRequestBody message. Does not implicitly {@link fs.PathOnlyRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.PathOnlyRequestBody
         * @static
         * @param {fs.IPathOnlyRequestBody} message PathOnlyRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        PathOnlyRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            return writer;
        };

        /**
         * Encodes the specified PathOnlyRequestBody message, length delimited. Does not implicitly {@link fs.PathOnlyRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.PathOnlyRequestBody
         * @static
         * @param {fs.IPathOnlyRequestBody} message PathOnlyRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        PathOnlyRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a PathOnlyRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.PathOnlyRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.PathOnlyRequestBody} PathOnlyRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        PathOnlyRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.PathOnlyRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a PathOnlyRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.PathOnlyRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.PathOnlyRequestBody} PathOnlyRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        PathOnlyRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a PathOnlyRequestBody message.
         * @function verify
         * @memberof fs.PathOnlyRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        PathOnlyRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            return null;
        };

        /**
         * Creates a PathOnlyRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.PathOnlyRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.PathOnlyRequestBody} PathOnlyRequestBody
         */
        PathOnlyRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.PathOnlyRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.PathOnlyRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.PathOnlyRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            return message;
        };

        /**
         * Creates a plain object from a PathOnlyRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.PathOnlyRequestBody
         * @static
         * @param {fs.PathOnlyRequestBody} message PathOnlyRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        PathOnlyRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.path = "";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            return object;
        };

        /**
         * Converts this PathOnlyRequestBody to JSON.
         * @function toJSON
         * @memberof fs.PathOnlyRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        PathOnlyRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for PathOnlyRequestBody
         * @function getTypeUrl
         * @memberof fs.PathOnlyRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        PathOnlyRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.PathOnlyRequestBody";
        };

        return PathOnlyRequestBody;
    })();

    fs.GetXAttrRequestBody = (function() {

        /**
         * Properties of a GetXAttrRequestBody.
         * @memberof fs
         * @interface IGetXAttrRequestBody
         * @property {string|null} [path] GetXAttrRequestBody path
         * @property {string|null} [xaName] GetXAttrRequestBody xaName
         */

        /**
         * Constructs a new GetXAttrRequestBody.
         * @memberof fs
         * @classdesc Represents a GetXAttrRequestBody.
         * @implements IGetXAttrRequestBody
         * @constructor
         * @param {fs.IGetXAttrRequestBody=} [properties] Properties to set
         */
        function GetXAttrRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * GetXAttrRequestBody path.
         * @member {string} path
         * @memberof fs.GetXAttrRequestBody
         * @instance
         */
        GetXAttrRequestBody.prototype.path = "";

        /**
         * GetXAttrRequestBody xaName.
         * @member {string} xaName
         * @memberof fs.GetXAttrRequestBody
         * @instance
         */
        GetXAttrRequestBody.prototype.xaName = "";

        /**
         * Creates a new GetXAttrRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.GetXAttrRequestBody
         * @static
         * @param {fs.IGetXAttrRequestBody=} [properties] Properties to set
         * @returns {fs.GetXAttrRequestBody} GetXAttrRequestBody instance
         */
        GetXAttrRequestBody.create = function create(properties) {
            return new GetXAttrRequestBody(properties);
        };

        /**
         * Encodes the specified GetXAttrRequestBody message. Does not implicitly {@link fs.GetXAttrRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.GetXAttrRequestBody
         * @static
         * @param {fs.IGetXAttrRequestBody} message GetXAttrRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        GetXAttrRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.xaName);
            return writer;
        };

        /**
         * Encodes the specified GetXAttrRequestBody message, length delimited. Does not implicitly {@link fs.GetXAttrRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.GetXAttrRequestBody
         * @static
         * @param {fs.IGetXAttrRequestBody} message GetXAttrRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        GetXAttrRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a GetXAttrRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.GetXAttrRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.GetXAttrRequestBody} GetXAttrRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        GetXAttrRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.GetXAttrRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.xaName = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a GetXAttrRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.GetXAttrRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.GetXAttrRequestBody} GetXAttrRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        GetXAttrRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a GetXAttrRequestBody message.
         * @function verify
         * @memberof fs.GetXAttrRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        GetXAttrRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                if (!$util.isString(message.xaName))
                    return "xaName: string expected";
            return null;
        };

        /**
         * Creates a GetXAttrRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.GetXAttrRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.GetXAttrRequestBody} GetXAttrRequestBody
         */
        GetXAttrRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.GetXAttrRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.GetXAttrRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.GetXAttrRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.xaName != null)
                message.xaName = String(object.xaName);
            return message;
        };

        /**
         * Creates a plain object from a GetXAttrRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.GetXAttrRequestBody
         * @static
         * @param {fs.GetXAttrRequestBody} message GetXAttrRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        GetXAttrRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.xaName = "";
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                object.xaName = message.xaName;
            return object;
        };

        /**
         * Converts this GetXAttrRequestBody to JSON.
         * @function toJSON
         * @memberof fs.GetXAttrRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        GetXAttrRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for GetXAttrRequestBody
         * @function getTypeUrl
         * @memberof fs.GetXAttrRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        GetXAttrRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.GetXAttrRequestBody";
        };

        return GetXAttrRequestBody;
    })();

    fs.SymLink = (function() {

        /**
         * Properties of a SymLink.
         * @memberof fs
         * @interface ISymLink
         * @property {boolean|null} [readonly] SymLink readonly
         * @property {common.IBooleanValue|null} [isFile] SymLink isFile
         * @property {common.IBooleanValue|null} [isFolder] SymLink isFolder
         * @property {common.IObjectReference|null} [impl] SymLink impl
         */

        /**
         * Constructs a new SymLink.
         * @memberof fs
         * @classdesc Represents a SymLink.
         * @implements ISymLink
         * @constructor
         * @param {fs.ISymLink=} [properties] Properties to set
         */
        function SymLink(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * SymLink readonly.
         * @member {boolean} readonly
         * @memberof fs.SymLink
         * @instance
         */
        SymLink.prototype.readonly = false;

        /**
         * SymLink isFile.
         * @member {common.IBooleanValue|null|undefined} isFile
         * @memberof fs.SymLink
         * @instance
         */
        SymLink.prototype.isFile = null;

        /**
         * SymLink isFolder.
         * @member {common.IBooleanValue|null|undefined} isFolder
         * @memberof fs.SymLink
         * @instance
         */
        SymLink.prototype.isFolder = null;

        /**
         * SymLink impl.
         * @member {common.IObjectReference|null|undefined} impl
         * @memberof fs.SymLink
         * @instance
         */
        SymLink.prototype.impl = null;

        /**
         * Creates a new SymLink instance using the specified properties.
         * @function create
         * @memberof fs.SymLink
         * @static
         * @param {fs.ISymLink=} [properties] Properties to set
         * @returns {fs.SymLink} SymLink instance
         */
        SymLink.create = function create(properties) {
            return new SymLink(properties);
        };

        /**
         * Encodes the specified SymLink message. Does not implicitly {@link fs.SymLink.verify|verify} messages.
         * @function encode
         * @memberof fs.SymLink
         * @static
         * @param {fs.ISymLink} message SymLink message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SymLink.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.readonly != null && Object.hasOwnProperty.call(message, "readonly"))
                writer.uint32(/* id 1, wireType 0 =*/8).bool(message.readonly);
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                $root.common.BooleanValue.encode(message.isFile, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                $root.common.BooleanValue.encode(message.isFolder, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl"))
                $root.common.ObjectReference.encode(message.impl, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified SymLink message, length delimited. Does not implicitly {@link fs.SymLink.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.SymLink
         * @static
         * @param {fs.ISymLink} message SymLink message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SymLink.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a SymLink message from the specified reader or buffer.
         * @function decode
         * @memberof fs.SymLink
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.SymLink} SymLink
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SymLink.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SymLink();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.readonly = reader.bool();
                        break;
                    }
                case 2: {
                        message.isFile = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.isFolder = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.impl = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a SymLink message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.SymLink
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.SymLink} SymLink
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SymLink.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a SymLink message.
         * @function verify
         * @memberof fs.SymLink
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        SymLink.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.readonly != null && Object.hasOwnProperty.call(message, "readonly"))
                if (typeof message.readonly !== "boolean")
                    return "readonly: boolean expected";
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile")) {
                var error = $root.common.BooleanValue.verify(message.isFile, long + 1);
                if (error)
                    return "isFile." + error;
            }
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder")) {
                var error = $root.common.BooleanValue.verify(message.isFolder, long + 1);
                if (error)
                    return "isFolder." + error;
            }
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl")) {
                var error = $root.common.ObjectReference.verify(message.impl, long + 1);
                if (error)
                    return "impl." + error;
            }
            return null;
        };

        /**
         * Creates a SymLink message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.SymLink
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.SymLink} SymLink
         */
        SymLink.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.SymLink)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.SymLink: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.SymLink();
            if (object.readonly != null)
                message.readonly = Boolean(object.readonly);
            if (object.isFile != null) {
                if (!$util.isObject(object.isFile))
                    throw TypeError(".fs.SymLink.isFile: object expected");
                message.isFile = $root.common.BooleanValue.fromObject(object.isFile, long + 1);
            }
            if (object.isFolder != null) {
                if (!$util.isObject(object.isFolder))
                    throw TypeError(".fs.SymLink.isFolder: object expected");
                message.isFolder = $root.common.BooleanValue.fromObject(object.isFolder, long + 1);
            }
            if (object.impl != null) {
                if (!$util.isObject(object.impl))
                    throw TypeError(".fs.SymLink.impl: object expected");
                message.impl = $root.common.ObjectReference.fromObject(object.impl, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a SymLink message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.SymLink
         * @static
         * @param {fs.SymLink} message SymLink
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        SymLink.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.readonly = false;
                object.isFile = null;
                object.isFolder = null;
                object.impl = null;
            }
            if (message.readonly != null && Object.hasOwnProperty.call(message, "readonly"))
                object.readonly = message.readonly;
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                object.isFile = $root.common.BooleanValue.toObject(message.isFile, options, q + 1);
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                object.isFolder = $root.common.BooleanValue.toObject(message.isFolder, options, q + 1);
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl"))
                object.impl = $root.common.ObjectReference.toObject(message.impl, options, q + 1);
            return object;
        };

        /**
         * Converts this SymLink to JSON.
         * @function toJSON
         * @memberof fs.SymLink
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        SymLink.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for SymLink
         * @function getTypeUrl
         * @memberof fs.SymLink
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        SymLink.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.SymLink";
        };

        return SymLink;
    })();

    fs.SymLinkTargetReplyBody = (function() {

        /**
         * Properties of a SymLinkTargetReplyBody.
         * @memberof fs
         * @interface ISymLinkTargetReplyBody
         * @property {fs.IFS|null} [fs] SymLinkTargetReplyBody fs
         * @property {file.IFile|null} [file] SymLinkTargetReplyBody file
         */

        /**
         * Constructs a new SymLinkTargetReplyBody.
         * @memberof fs
         * @classdesc Represents a SymLinkTargetReplyBody.
         * @implements ISymLinkTargetReplyBody
         * @constructor
         * @param {fs.ISymLinkTargetReplyBody=} [properties] Properties to set
         */
        function SymLinkTargetReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * SymLinkTargetReplyBody fs.
         * @member {fs.IFS|null|undefined} fs
         * @memberof fs.SymLinkTargetReplyBody
         * @instance
         */
        SymLinkTargetReplyBody.prototype.fs = null;

        /**
         * SymLinkTargetReplyBody file.
         * @member {file.IFile|null|undefined} file
         * @memberof fs.SymLinkTargetReplyBody
         * @instance
         */
        SymLinkTargetReplyBody.prototype.file = null;

        /**
         * Creates a new SymLinkTargetReplyBody instance using the specified properties.
         * @function create
         * @memberof fs.SymLinkTargetReplyBody
         * @static
         * @param {fs.ISymLinkTargetReplyBody=} [properties] Properties to set
         * @returns {fs.SymLinkTargetReplyBody} SymLinkTargetReplyBody instance
         */
        SymLinkTargetReplyBody.create = function create(properties) {
            return new SymLinkTargetReplyBody(properties);
        };

        /**
         * Encodes the specified SymLinkTargetReplyBody message. Does not implicitly {@link fs.SymLinkTargetReplyBody.verify|verify} messages.
         * @function encode
         * @memberof fs.SymLinkTargetReplyBody
         * @static
         * @param {fs.ISymLinkTargetReplyBody} message SymLinkTargetReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SymLinkTargetReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.fs != null && Object.hasOwnProperty.call(message, "fs"))
                $root.fs.FS.encode(message.fs, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                $root.file.File.encode(message.file, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified SymLinkTargetReplyBody message, length delimited. Does not implicitly {@link fs.SymLinkTargetReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.SymLinkTargetReplyBody
         * @static
         * @param {fs.ISymLinkTargetReplyBody} message SymLinkTargetReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SymLinkTargetReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a SymLinkTargetReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.SymLinkTargetReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.SymLinkTargetReplyBody} SymLinkTargetReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SymLinkTargetReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SymLinkTargetReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.fs = $root.fs.FS.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.file = $root.file.File.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a SymLinkTargetReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.SymLinkTargetReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.SymLinkTargetReplyBody} SymLinkTargetReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SymLinkTargetReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a SymLinkTargetReplyBody message.
         * @function verify
         * @memberof fs.SymLinkTargetReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        SymLinkTargetReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.fs != null && Object.hasOwnProperty.call(message, "fs")) {
                var error = $root.fs.FS.verify(message.fs, long + 1);
                if (error)
                    return "fs." + error;
            }
            if (message.file != null && Object.hasOwnProperty.call(message, "file")) {
                var error = $root.file.File.verify(message.file, long + 1);
                if (error)
                    return "file." + error;
            }
            return null;
        };

        /**
         * Creates a SymLinkTargetReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.SymLinkTargetReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.SymLinkTargetReplyBody} SymLinkTargetReplyBody
         */
        SymLinkTargetReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.SymLinkTargetReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.SymLinkTargetReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.SymLinkTargetReplyBody();
            if (object.fs != null) {
                if (!$util.isObject(object.fs))
                    throw TypeError(".fs.SymLinkTargetReplyBody.fs: object expected");
                message.fs = $root.fs.FS.fromObject(object.fs, long + 1);
            }
            if (object.file != null) {
                if (!$util.isObject(object.file))
                    throw TypeError(".fs.SymLinkTargetReplyBody.file: object expected");
                message.file = $root.file.File.fromObject(object.file, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a SymLinkTargetReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.SymLinkTargetReplyBody
         * @static
         * @param {fs.SymLinkTargetReplyBody} message SymLinkTargetReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        SymLinkTargetReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.fs = null;
                object.file = null;
            }
            if (message.fs != null && Object.hasOwnProperty.call(message, "fs"))
                object.fs = $root.fs.FS.toObject(message.fs, options, q + 1);
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                object.file = $root.file.File.toObject(message.file, options, q + 1);
            return object;
        };

        /**
         * Converts this SymLinkTargetReplyBody to JSON.
         * @function toJSON
         * @memberof fs.SymLinkTargetReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        SymLinkTargetReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for SymLinkTargetReplyBody
         * @function getTypeUrl
         * @memberof fs.SymLinkTargetReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        SymLinkTargetReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.SymLinkTargetReplyBody";
        };

        return SymLinkTargetReplyBody;
    })();

    fs.WatchTreeRequestBody = (function() {

        /**
         * Properties of a WatchTreeRequestBody.
         * @memberof fs
         * @interface IWatchTreeRequestBody
         * @property {string|null} [path] WatchTreeRequestBody path
         * @property {common.IUInt32Value|null} [depth] WatchTreeRequestBody depth
         */

        /**
         * Constructs a new WatchTreeRequestBody.
         * @memberof fs
         * @classdesc Represents a WatchTreeRequestBody.
         * @implements IWatchTreeRequestBody
         * @constructor
         * @param {fs.IWatchTreeRequestBody=} [properties] Properties to set
         */
        function WatchTreeRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * WatchTreeRequestBody path.
         * @member {string} path
         * @memberof fs.WatchTreeRequestBody
         * @instance
         */
        WatchTreeRequestBody.prototype.path = "";

        /**
         * WatchTreeRequestBody depth.
         * @member {common.IUInt32Value|null|undefined} depth
         * @memberof fs.WatchTreeRequestBody
         * @instance
         */
        WatchTreeRequestBody.prototype.depth = null;

        /**
         * Creates a new WatchTreeRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.WatchTreeRequestBody
         * @static
         * @param {fs.IWatchTreeRequestBody=} [properties] Properties to set
         * @returns {fs.WatchTreeRequestBody} WatchTreeRequestBody instance
         */
        WatchTreeRequestBody.create = function create(properties) {
            return new WatchTreeRequestBody(properties);
        };

        /**
         * Encodes the specified WatchTreeRequestBody message. Does not implicitly {@link fs.WatchTreeRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.WatchTreeRequestBody
         * @static
         * @param {fs.IWatchTreeRequestBody} message WatchTreeRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WatchTreeRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.depth != null && Object.hasOwnProperty.call(message, "depth"))
                $root.common.UInt32Value.encode(message.depth, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified WatchTreeRequestBody message, length delimited. Does not implicitly {@link fs.WatchTreeRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.WatchTreeRequestBody
         * @static
         * @param {fs.IWatchTreeRequestBody} message WatchTreeRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WatchTreeRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a WatchTreeRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.WatchTreeRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.WatchTreeRequestBody} WatchTreeRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WatchTreeRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.WatchTreeRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.depth = $root.common.UInt32Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a WatchTreeRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.WatchTreeRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.WatchTreeRequestBody} WatchTreeRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WatchTreeRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a WatchTreeRequestBody message.
         * @function verify
         * @memberof fs.WatchTreeRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        WatchTreeRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.depth != null && Object.hasOwnProperty.call(message, "depth")) {
                var error = $root.common.UInt32Value.verify(message.depth, long + 1);
                if (error)
                    return "depth." + error;
            }
            return null;
        };

        /**
         * Creates a WatchTreeRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.WatchTreeRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.WatchTreeRequestBody} WatchTreeRequestBody
         */
        WatchTreeRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.WatchTreeRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.WatchTreeRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.WatchTreeRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.depth != null) {
                if (!$util.isObject(object.depth))
                    throw TypeError(".fs.WatchTreeRequestBody.depth: object expected");
                message.depth = $root.common.UInt32Value.fromObject(object.depth, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a WatchTreeRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.WatchTreeRequestBody
         * @static
         * @param {fs.WatchTreeRequestBody} message WatchTreeRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        WatchTreeRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.depth = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.depth != null && Object.hasOwnProperty.call(message, "depth"))
                object.depth = $root.common.UInt32Value.toObject(message.depth, options, q + 1);
            return object;
        };

        /**
         * Converts this WatchTreeRequestBody to JSON.
         * @function toJSON
         * @memberof fs.WatchTreeRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        WatchTreeRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for WatchTreeRequestBody
         * @function getTypeUrl
         * @memberof fs.WatchTreeRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        WatchTreeRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.WatchTreeRequestBody";
        };

        return WatchTreeRequestBody;
    })();

    fs.ListFolderReplyBody = (function() {

        /**
         * Properties of a ListFolderReplyBody.
         * @memberof fs
         * @interface IListFolderReplyBody
         * @property {Array.<fs.IListingEntryMsg>|null} [entries] ListFolderReplyBody entries
         */

        /**
         * Constructs a new ListFolderReplyBody.
         * @memberof fs
         * @classdesc Represents a ListFolderReplyBody.
         * @implements IListFolderReplyBody
         * @constructor
         * @param {fs.IListFolderReplyBody=} [properties] Properties to set
         */
        function ListFolderReplyBody(properties) {
            this.entries = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ListFolderReplyBody entries.
         * @member {Array.<fs.IListingEntryMsg>} entries
         * @memberof fs.ListFolderReplyBody
         * @instance
         */
        ListFolderReplyBody.prototype.entries = $util.emptyArray;

        /**
         * Creates a new ListFolderReplyBody instance using the specified properties.
         * @function create
         * @memberof fs.ListFolderReplyBody
         * @static
         * @param {fs.IListFolderReplyBody=} [properties] Properties to set
         * @returns {fs.ListFolderReplyBody} ListFolderReplyBody instance
         */
        ListFolderReplyBody.create = function create(properties) {
            return new ListFolderReplyBody(properties);
        };

        /**
         * Encodes the specified ListFolderReplyBody message. Does not implicitly {@link fs.ListFolderReplyBody.verify|verify} messages.
         * @function encode
         * @memberof fs.ListFolderReplyBody
         * @static
         * @param {fs.IListFolderReplyBody} message ListFolderReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ListFolderReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.entries != null && message.entries.length)
                for (var i = 0; i < message.entries.length; ++i)
                    $root.fs.ListingEntryMsg.encode(message.entries[i], writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified ListFolderReplyBody message, length delimited. Does not implicitly {@link fs.ListFolderReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.ListFolderReplyBody
         * @static
         * @param {fs.IListFolderReplyBody} message ListFolderReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ListFolderReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a ListFolderReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.ListFolderReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.ListFolderReplyBody} ListFolderReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ListFolderReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.ListFolderReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.entries && message.entries.length))
                            message.entries = [];
                        message.entries.push($root.fs.ListingEntryMsg.decode(reader, reader.uint32(), undefined, long + 1));
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a ListFolderReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.ListFolderReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.ListFolderReplyBody} ListFolderReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ListFolderReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a ListFolderReplyBody message.
         * @function verify
         * @memberof fs.ListFolderReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ListFolderReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.entries != null && Object.hasOwnProperty.call(message, "entries")) {
                if (!Array.isArray(message.entries))
                    return "entries: array expected";
                for (var i = 0; i < message.entries.length; ++i) {
                    var error = $root.fs.ListingEntryMsg.verify(message.entries[i], long + 1);
                    if (error)
                        return "entries." + error;
                }
            }
            return null;
        };

        /**
         * Creates a ListFolderReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.ListFolderReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.ListFolderReplyBody} ListFolderReplyBody
         */
        ListFolderReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.ListFolderReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.ListFolderReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.ListFolderReplyBody();
            if (object.entries) {
                if (!Array.isArray(object.entries))
                    throw TypeError(".fs.ListFolderReplyBody.entries: array expected");
                message.entries = [];
                for (var i = 0; i < object.entries.length; ++i) {
                    if (!$util.isObject(object.entries[i]))
                        throw TypeError(".fs.ListFolderReplyBody.entries: object expected");
                    message.entries[i] = $root.fs.ListingEntryMsg.fromObject(object.entries[i], long + 1);
                }
            }
            return message;
        };

        /**
         * Creates a plain object from a ListFolderReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.ListFolderReplyBody
         * @static
         * @param {fs.ListFolderReplyBody} message ListFolderReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ListFolderReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.entries = [];
            if (message.entries && message.entries.length) {
                object.entries = [];
                for (var j = 0; j < message.entries.length; ++j)
                    object.entries[j] = $root.fs.ListingEntryMsg.toObject(message.entries[j], options, q + 1);
            }
            return object;
        };

        /**
         * Converts this ListFolderReplyBody to JSON.
         * @function toJSON
         * @memberof fs.ListFolderReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ListFolderReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ListFolderReplyBody
         * @function getTypeUrl
         * @memberof fs.ListFolderReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ListFolderReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.ListFolderReplyBody";
        };

        return ListFolderReplyBody;
    })();

    fs.ListingEntryMsg = (function() {

        /**
         * Properties of a ListingEntryMsg.
         * @memberof fs
         * @interface IListingEntryMsg
         * @property {string|null} [name] ListingEntryMsg name
         * @property {common.IBooleanValue|null} [isFile] ListingEntryMsg isFile
         * @property {common.IBooleanValue|null} [isFolder] ListingEntryMsg isFolder
         * @property {common.IBooleanValue|null} [isLink] ListingEntryMsg isLink
         */

        /**
         * Constructs a new ListingEntryMsg.
         * @memberof fs
         * @classdesc Represents a ListingEntryMsg.
         * @implements IListingEntryMsg
         * @constructor
         * @param {fs.IListingEntryMsg=} [properties] Properties to set
         */
        function ListingEntryMsg(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ListingEntryMsg name.
         * @member {string} name
         * @memberof fs.ListingEntryMsg
         * @instance
         */
        ListingEntryMsg.prototype.name = "";

        /**
         * ListingEntryMsg isFile.
         * @member {common.IBooleanValue|null|undefined} isFile
         * @memberof fs.ListingEntryMsg
         * @instance
         */
        ListingEntryMsg.prototype.isFile = null;

        /**
         * ListingEntryMsg isFolder.
         * @member {common.IBooleanValue|null|undefined} isFolder
         * @memberof fs.ListingEntryMsg
         * @instance
         */
        ListingEntryMsg.prototype.isFolder = null;

        /**
         * ListingEntryMsg isLink.
         * @member {common.IBooleanValue|null|undefined} isLink
         * @memberof fs.ListingEntryMsg
         * @instance
         */
        ListingEntryMsg.prototype.isLink = null;

        /**
         * Creates a new ListingEntryMsg instance using the specified properties.
         * @function create
         * @memberof fs.ListingEntryMsg
         * @static
         * @param {fs.IListingEntryMsg=} [properties] Properties to set
         * @returns {fs.ListingEntryMsg} ListingEntryMsg instance
         */
        ListingEntryMsg.create = function create(properties) {
            return new ListingEntryMsg(properties);
        };

        /**
         * Encodes the specified ListingEntryMsg message. Does not implicitly {@link fs.ListingEntryMsg.verify|verify} messages.
         * @function encode
         * @memberof fs.ListingEntryMsg
         * @static
         * @param {fs.IListingEntryMsg} message ListingEntryMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ListingEntryMsg.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                $root.common.BooleanValue.encode(message.isFile, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                $root.common.BooleanValue.encode(message.isFolder, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink"))
                $root.common.BooleanValue.encode(message.isLink, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified ListingEntryMsg message, length delimited. Does not implicitly {@link fs.ListingEntryMsg.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.ListingEntryMsg
         * @static
         * @param {fs.IListingEntryMsg} message ListingEntryMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ListingEntryMsg.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a ListingEntryMsg message from the specified reader or buffer.
         * @function decode
         * @memberof fs.ListingEntryMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.ListingEntryMsg} ListingEntryMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ListingEntryMsg.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.ListingEntryMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.name = reader.string();
                        break;
                    }
                case 2: {
                        message.isFile = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.isFolder = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.isLink = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a ListingEntryMsg message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.ListingEntryMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.ListingEntryMsg} ListingEntryMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ListingEntryMsg.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a ListingEntryMsg message.
         * @function verify
         * @memberof fs.ListingEntryMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ListingEntryMsg.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile")) {
                var error = $root.common.BooleanValue.verify(message.isFile, long + 1);
                if (error)
                    return "isFile." + error;
            }
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder")) {
                var error = $root.common.BooleanValue.verify(message.isFolder, long + 1);
                if (error)
                    return "isFolder." + error;
            }
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink")) {
                var error = $root.common.BooleanValue.verify(message.isLink, long + 1);
                if (error)
                    return "isLink." + error;
            }
            return null;
        };

        /**
         * Creates a ListingEntryMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.ListingEntryMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.ListingEntryMsg} ListingEntryMsg
         */
        ListingEntryMsg.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.ListingEntryMsg)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.ListingEntryMsg: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.ListingEntryMsg();
            if (object.name != null)
                message.name = String(object.name);
            if (object.isFile != null) {
                if (!$util.isObject(object.isFile))
                    throw TypeError(".fs.ListingEntryMsg.isFile: object expected");
                message.isFile = $root.common.BooleanValue.fromObject(object.isFile, long + 1);
            }
            if (object.isFolder != null) {
                if (!$util.isObject(object.isFolder))
                    throw TypeError(".fs.ListingEntryMsg.isFolder: object expected");
                message.isFolder = $root.common.BooleanValue.fromObject(object.isFolder, long + 1);
            }
            if (object.isLink != null) {
                if (!$util.isObject(object.isLink))
                    throw TypeError(".fs.ListingEntryMsg.isLink: object expected");
                message.isLink = $root.common.BooleanValue.fromObject(object.isLink, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a ListingEntryMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.ListingEntryMsg
         * @static
         * @param {fs.ListingEntryMsg} message ListingEntryMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ListingEntryMsg.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.name = "";
                object.isFile = null;
                object.isFolder = null;
                object.isLink = null;
            }
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                object.name = message.name;
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                object.isFile = $root.common.BooleanValue.toObject(message.isFile, options, q + 1);
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                object.isFolder = $root.common.BooleanValue.toObject(message.isFolder, options, q + 1);
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink"))
                object.isLink = $root.common.BooleanValue.toObject(message.isLink, options, q + 1);
            return object;
        };

        /**
         * Converts this ListingEntryMsg to JSON.
         * @function toJSON
         * @memberof fs.ListingEntryMsg
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ListingEntryMsg.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ListingEntryMsg
         * @function getTypeUrl
         * @memberof fs.ListingEntryMsg
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ListingEntryMsg.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.ListingEntryMsg";
        };

        return ListingEntryMsg;
    })();

    fs.ReadBytesRequestBody = (function() {

        /**
         * Properties of a ReadBytesRequestBody.
         * @memberof fs
         * @interface IReadBytesRequestBody
         * @property {string|null} [path] ReadBytesRequestBody path
         * @property {common.IUInt64Value|null} [start] ReadBytesRequestBody start
         * @property {common.IUInt64Value|null} [end] ReadBytesRequestBody end
         */

        /**
         * Constructs a new ReadBytesRequestBody.
         * @memberof fs
         * @classdesc Represents a ReadBytesRequestBody.
         * @implements IReadBytesRequestBody
         * @constructor
         * @param {fs.IReadBytesRequestBody=} [properties] Properties to set
         */
        function ReadBytesRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ReadBytesRequestBody path.
         * @member {string} path
         * @memberof fs.ReadBytesRequestBody
         * @instance
         */
        ReadBytesRequestBody.prototype.path = "";

        /**
         * ReadBytesRequestBody start.
         * @member {common.IUInt64Value|null|undefined} start
         * @memberof fs.ReadBytesRequestBody
         * @instance
         */
        ReadBytesRequestBody.prototype.start = null;

        /**
         * ReadBytesRequestBody end.
         * @member {common.IUInt64Value|null|undefined} end
         * @memberof fs.ReadBytesRequestBody
         * @instance
         */
        ReadBytesRequestBody.prototype.end = null;

        /**
         * Creates a new ReadBytesRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.ReadBytesRequestBody
         * @static
         * @param {fs.IReadBytesRequestBody=} [properties] Properties to set
         * @returns {fs.ReadBytesRequestBody} ReadBytesRequestBody instance
         */
        ReadBytesRequestBody.create = function create(properties) {
            return new ReadBytesRequestBody(properties);
        };

        /**
         * Encodes the specified ReadBytesRequestBody message. Does not implicitly {@link fs.ReadBytesRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.ReadBytesRequestBody
         * @static
         * @param {fs.IReadBytesRequestBody} message ReadBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ReadBytesRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                $root.common.UInt64Value.encode(message.start, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                $root.common.UInt64Value.encode(message.end, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified ReadBytesRequestBody message, length delimited. Does not implicitly {@link fs.ReadBytesRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.ReadBytesRequestBody
         * @static
         * @param {fs.IReadBytesRequestBody} message ReadBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ReadBytesRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a ReadBytesRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.ReadBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.ReadBytesRequestBody} ReadBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ReadBytesRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.ReadBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.start = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.end = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a ReadBytesRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.ReadBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.ReadBytesRequestBody} ReadBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ReadBytesRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a ReadBytesRequestBody message.
         * @function verify
         * @memberof fs.ReadBytesRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ReadBytesRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.start != null && Object.hasOwnProperty.call(message, "start")) {
                var error = $root.common.UInt64Value.verify(message.start, long + 1);
                if (error)
                    return "start." + error;
            }
            if (message.end != null && Object.hasOwnProperty.call(message, "end")) {
                var error = $root.common.UInt64Value.verify(message.end, long + 1);
                if (error)
                    return "end." + error;
            }
            return null;
        };

        /**
         * Creates a ReadBytesRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.ReadBytesRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.ReadBytesRequestBody} ReadBytesRequestBody
         */
        ReadBytesRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.ReadBytesRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.ReadBytesRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.ReadBytesRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.start != null) {
                if (!$util.isObject(object.start))
                    throw TypeError(".fs.ReadBytesRequestBody.start: object expected");
                message.start = $root.common.UInt64Value.fromObject(object.start, long + 1);
            }
            if (object.end != null) {
                if (!$util.isObject(object.end))
                    throw TypeError(".fs.ReadBytesRequestBody.end: object expected");
                message.end = $root.common.UInt64Value.fromObject(object.end, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a ReadBytesRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.ReadBytesRequestBody
         * @static
         * @param {fs.ReadBytesRequestBody} message ReadBytesRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ReadBytesRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.start = null;
                object.end = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                object.start = $root.common.UInt64Value.toObject(message.start, options, q + 1);
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                object.end = $root.common.UInt64Value.toObject(message.end, options, q + 1);
            return object;
        };

        /**
         * Converts this ReadBytesRequestBody to JSON.
         * @function toJSON
         * @memberof fs.ReadBytesRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ReadBytesRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ReadBytesRequestBody
         * @function getTypeUrl
         * @memberof fs.ReadBytesRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ReadBytesRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.ReadBytesRequestBody";
        };

        return ReadBytesRequestBody;
    })();

    fs.SelectRequestBody = (function() {

        /**
         * Properties of a SelectRequestBody.
         * @memberof fs
         * @interface ISelectRequestBody
         * @property {string|null} [path] SelectRequestBody path
         * @property {fs.SelectRequestBody.ISelectCriteria|null} [criteria] SelectRequestBody criteria
         */

        /**
         * Constructs a new SelectRequestBody.
         * @memberof fs
         * @classdesc Represents a SelectRequestBody.
         * @implements ISelectRequestBody
         * @constructor
         * @param {fs.ISelectRequestBody=} [properties] Properties to set
         */
        function SelectRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * SelectRequestBody path.
         * @member {string} path
         * @memberof fs.SelectRequestBody
         * @instance
         */
        SelectRequestBody.prototype.path = "";

        /**
         * SelectRequestBody criteria.
         * @member {fs.SelectRequestBody.ISelectCriteria|null|undefined} criteria
         * @memberof fs.SelectRequestBody
         * @instance
         */
        SelectRequestBody.prototype.criteria = null;

        /**
         * Creates a new SelectRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.SelectRequestBody
         * @static
         * @param {fs.ISelectRequestBody=} [properties] Properties to set
         * @returns {fs.SelectRequestBody} SelectRequestBody instance
         */
        SelectRequestBody.create = function create(properties) {
            return new SelectRequestBody(properties);
        };

        /**
         * Encodes the specified SelectRequestBody message. Does not implicitly {@link fs.SelectRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.SelectRequestBody
         * @static
         * @param {fs.ISelectRequestBody} message SelectRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SelectRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.criteria != null && Object.hasOwnProperty.call(message, "criteria"))
                $root.fs.SelectRequestBody.SelectCriteria.encode(message.criteria, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified SelectRequestBody message, length delimited. Does not implicitly {@link fs.SelectRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.SelectRequestBody
         * @static
         * @param {fs.ISelectRequestBody} message SelectRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SelectRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a SelectRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.SelectRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.SelectRequestBody} SelectRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SelectRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SelectRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.criteria = $root.fs.SelectRequestBody.SelectCriteria.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a SelectRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.SelectRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.SelectRequestBody} SelectRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SelectRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a SelectRequestBody message.
         * @function verify
         * @memberof fs.SelectRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        SelectRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.criteria != null && Object.hasOwnProperty.call(message, "criteria")) {
                var error = $root.fs.SelectRequestBody.SelectCriteria.verify(message.criteria, long + 1);
                if (error)
                    return "criteria." + error;
            }
            return null;
        };

        /**
         * Creates a SelectRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.SelectRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.SelectRequestBody} SelectRequestBody
         */
        SelectRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.SelectRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.SelectRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.SelectRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.criteria != null) {
                if (!$util.isObject(object.criteria))
                    throw TypeError(".fs.SelectRequestBody.criteria: object expected");
                message.criteria = $root.fs.SelectRequestBody.SelectCriteria.fromObject(object.criteria, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a SelectRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.SelectRequestBody
         * @static
         * @param {fs.SelectRequestBody} message SelectRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        SelectRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.criteria = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.criteria != null && Object.hasOwnProperty.call(message, "criteria"))
                object.criteria = $root.fs.SelectRequestBody.SelectCriteria.toObject(message.criteria, options, q + 1);
            return object;
        };

        /**
         * Converts this SelectRequestBody to JSON.
         * @function toJSON
         * @memberof fs.SelectRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        SelectRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for SelectRequestBody
         * @function getTypeUrl
         * @memberof fs.SelectRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        SelectRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.SelectRequestBody";
        };

        SelectRequestBody.SelectCriteria = (function() {

            /**
             * Properties of a SelectCriteria.
             * @memberof fs.SelectRequestBody
             * @interface ISelectCriteria
             * @property {common.IStringValue|null} [exactName] SelectCriteria exactName
             * @property {common.IStringValue|null} [pattern] SelectCriteria pattern
             * @property {common.IStringValue|null} [regexp] SelectCriteria regexp
             * @property {common.IUInt32Value|null} [depth] SelectCriteria depth
             * @property {Array.<string>|null} [type] SelectCriteria type
             * @property {string|null} [action] SelectCriteria action
             */

            /**
             * Constructs a new SelectCriteria.
             * @memberof fs.SelectRequestBody
             * @classdesc Represents a SelectCriteria.
             * @implements ISelectCriteria
             * @constructor
             * @param {fs.SelectRequestBody.ISelectCriteria=} [properties] Properties to set
             */
            function SelectCriteria(properties) {
                this.type = [];
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * SelectCriteria exactName.
             * @member {common.IStringValue|null|undefined} exactName
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @instance
             */
            SelectCriteria.prototype.exactName = null;

            /**
             * SelectCriteria pattern.
             * @member {common.IStringValue|null|undefined} pattern
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @instance
             */
            SelectCriteria.prototype.pattern = null;

            /**
             * SelectCriteria regexp.
             * @member {common.IStringValue|null|undefined} regexp
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @instance
             */
            SelectCriteria.prototype.regexp = null;

            /**
             * SelectCriteria depth.
             * @member {common.IUInt32Value|null|undefined} depth
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @instance
             */
            SelectCriteria.prototype.depth = null;

            /**
             * SelectCriteria type.
             * @member {Array.<string>} type
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @instance
             */
            SelectCriteria.prototype.type = $util.emptyArray;

            /**
             * SelectCriteria action.
             * @member {string} action
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @instance
             */
            SelectCriteria.prototype.action = "";

            /**
             * Creates a new SelectCriteria instance using the specified properties.
             * @function create
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @static
             * @param {fs.SelectRequestBody.ISelectCriteria=} [properties] Properties to set
             * @returns {fs.SelectRequestBody.SelectCriteria} SelectCriteria instance
             */
            SelectCriteria.create = function create(properties) {
                return new SelectCriteria(properties);
            };

            /**
             * Encodes the specified SelectCriteria message. Does not implicitly {@link fs.SelectRequestBody.SelectCriteria.verify|verify} messages.
             * @function encode
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @static
             * @param {fs.SelectRequestBody.ISelectCriteria} message SelectCriteria message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            SelectCriteria.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.exactName != null && Object.hasOwnProperty.call(message, "exactName"))
                    $root.common.StringValue.encode(message.exactName, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
                if (message.pattern != null && Object.hasOwnProperty.call(message, "pattern"))
                    $root.common.StringValue.encode(message.pattern, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
                if (message.regexp != null && Object.hasOwnProperty.call(message, "regexp"))
                    $root.common.StringValue.encode(message.regexp, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
                if (message.depth != null && Object.hasOwnProperty.call(message, "depth"))
                    $root.common.UInt32Value.encode(message.depth, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
                if (message.type != null && message.type.length)
                    for (var i = 0; i < message.type.length; ++i)
                        writer.uint32(/* id 5, wireType 2 =*/42).string(message.type[i]);
                if (message.action != null && Object.hasOwnProperty.call(message, "action"))
                    writer.uint32(/* id 6, wireType 2 =*/50).string(message.action);
                return writer;
            };

            /**
             * Encodes the specified SelectCriteria message, length delimited. Does not implicitly {@link fs.SelectRequestBody.SelectCriteria.verify|verify} messages.
             * @function encodeDelimited
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @static
             * @param {fs.SelectRequestBody.ISelectCriteria} message SelectCriteria message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            SelectCriteria.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes a SelectCriteria message from the specified reader or buffer.
             * @function decode
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {fs.SelectRequestBody.SelectCriteria} SelectCriteria
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            SelectCriteria.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SelectRequestBody.SelectCriteria();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.exactName = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 2: {
                            message.pattern = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 3: {
                            message.regexp = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 4: {
                            message.depth = $root.common.UInt32Value.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 5: {
                            if (!(message.type && message.type.length))
                                message.type = [];
                            message.type.push(reader.string());
                            break;
                        }
                    case 6: {
                            message.action = reader.string();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a SelectCriteria message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {fs.SelectRequestBody.SelectCriteria} SelectCriteria
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            SelectCriteria.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a SelectCriteria message.
             * @function verify
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            SelectCriteria.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.exactName != null && Object.hasOwnProperty.call(message, "exactName")) {
                    var error = $root.common.StringValue.verify(message.exactName, long + 1);
                    if (error)
                        return "exactName." + error;
                }
                if (message.pattern != null && Object.hasOwnProperty.call(message, "pattern")) {
                    var error = $root.common.StringValue.verify(message.pattern, long + 1);
                    if (error)
                        return "pattern." + error;
                }
                if (message.regexp != null && Object.hasOwnProperty.call(message, "regexp")) {
                    var error = $root.common.StringValue.verify(message.regexp, long + 1);
                    if (error)
                        return "regexp." + error;
                }
                if (message.depth != null && Object.hasOwnProperty.call(message, "depth")) {
                    var error = $root.common.UInt32Value.verify(message.depth, long + 1);
                    if (error)
                        return "depth." + error;
                }
                if (message.type != null && Object.hasOwnProperty.call(message, "type")) {
                    if (!Array.isArray(message.type))
                        return "type: array expected";
                    for (var i = 0; i < message.type.length; ++i)
                        if (!$util.isString(message.type[i]))
                            return "type: string[] expected";
                }
                if (message.action != null && Object.hasOwnProperty.call(message, "action"))
                    if (!$util.isString(message.action))
                        return "action: string expected";
                return null;
            };

            /**
             * Creates a SelectCriteria message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {fs.SelectRequestBody.SelectCriteria} SelectCriteria
             */
            SelectCriteria.fromObject = function fromObject(object, long) {
                if (object instanceof $root.fs.SelectRequestBody.SelectCriteria)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".fs.SelectRequestBody.SelectCriteria: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.fs.SelectRequestBody.SelectCriteria();
                if (object.exactName != null) {
                    if (!$util.isObject(object.exactName))
                        throw TypeError(".fs.SelectRequestBody.SelectCriteria.exactName: object expected");
                    message.exactName = $root.common.StringValue.fromObject(object.exactName, long + 1);
                }
                if (object.pattern != null) {
                    if (!$util.isObject(object.pattern))
                        throw TypeError(".fs.SelectRequestBody.SelectCriteria.pattern: object expected");
                    message.pattern = $root.common.StringValue.fromObject(object.pattern, long + 1);
                }
                if (object.regexp != null) {
                    if (!$util.isObject(object.regexp))
                        throw TypeError(".fs.SelectRequestBody.SelectCriteria.regexp: object expected");
                    message.regexp = $root.common.StringValue.fromObject(object.regexp, long + 1);
                }
                if (object.depth != null) {
                    if (!$util.isObject(object.depth))
                        throw TypeError(".fs.SelectRequestBody.SelectCriteria.depth: object expected");
                    message.depth = $root.common.UInt32Value.fromObject(object.depth, long + 1);
                }
                if (object.type) {
                    if (!Array.isArray(object.type))
                        throw TypeError(".fs.SelectRequestBody.SelectCriteria.type: array expected");
                    message.type = [];
                    for (var i = 0; i < object.type.length; ++i)
                        message.type[i] = String(object.type[i]);
                }
                if (object.action != null)
                    message.action = String(object.action);
                return message;
            };

            /**
             * Creates a plain object from a SelectCriteria message. Also converts values to other types if specified.
             * @function toObject
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @static
             * @param {fs.SelectRequestBody.SelectCriteria} message SelectCriteria
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            SelectCriteria.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.arrays || options.defaults)
                    object.type = [];
                if (options.defaults) {
                    object.exactName = null;
                    object.pattern = null;
                    object.regexp = null;
                    object.depth = null;
                    object.action = "";
                }
                if (message.exactName != null && Object.hasOwnProperty.call(message, "exactName"))
                    object.exactName = $root.common.StringValue.toObject(message.exactName, options, q + 1);
                if (message.pattern != null && Object.hasOwnProperty.call(message, "pattern"))
                    object.pattern = $root.common.StringValue.toObject(message.pattern, options, q + 1);
                if (message.regexp != null && Object.hasOwnProperty.call(message, "regexp"))
                    object.regexp = $root.common.StringValue.toObject(message.regexp, options, q + 1);
                if (message.depth != null && Object.hasOwnProperty.call(message, "depth"))
                    object.depth = $root.common.UInt32Value.toObject(message.depth, options, q + 1);
                if (message.type && message.type.length) {
                    object.type = [];
                    for (var j = 0; j < message.type.length; ++j)
                        object.type[j] = message.type[j];
                }
                if (message.action != null && Object.hasOwnProperty.call(message, "action"))
                    object.action = message.action;
                return object;
            };

            /**
             * Converts this SelectCriteria to JSON.
             * @function toJSON
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            SelectCriteria.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for SelectCriteria
             * @function getTypeUrl
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            SelectCriteria.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/fs.SelectRequestBody.SelectCriteria";
            };

            return SelectCriteria;
        })();

        return SelectRequestBody;
    })();

    fs.FSCGetRequestBody = (function() {

        /**
         * Properties of a FSCGetRequestBody.
         * @memberof fs
         * @interface IFSCGetRequestBody
         * @property {string|null} [name] FSCGetRequestBody name
         */

        /**
         * Constructs a new FSCGetRequestBody.
         * @memberof fs
         * @classdesc Represents a FSCGetRequestBody.
         * @implements IFSCGetRequestBody
         * @constructor
         * @param {fs.IFSCGetRequestBody=} [properties] Properties to set
         */
        function FSCGetRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FSCGetRequestBody name.
         * @member {string} name
         * @memberof fs.FSCGetRequestBody
         * @instance
         */
        FSCGetRequestBody.prototype.name = "";

        /**
         * Creates a new FSCGetRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.FSCGetRequestBody
         * @static
         * @param {fs.IFSCGetRequestBody=} [properties] Properties to set
         * @returns {fs.FSCGetRequestBody} FSCGetRequestBody instance
         */
        FSCGetRequestBody.create = function create(properties) {
            return new FSCGetRequestBody(properties);
        };

        /**
         * Encodes the specified FSCGetRequestBody message. Does not implicitly {@link fs.FSCGetRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.FSCGetRequestBody
         * @static
         * @param {fs.IFSCGetRequestBody} message FSCGetRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSCGetRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
            return writer;
        };

        /**
         * Encodes the specified FSCGetRequestBody message, length delimited. Does not implicitly {@link fs.FSCGetRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FSCGetRequestBody
         * @static
         * @param {fs.IFSCGetRequestBody} message FSCGetRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSCGetRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FSCGetRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FSCGetRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FSCGetRequestBody} FSCGetRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSCGetRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSCGetRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.name = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FSCGetRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FSCGetRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FSCGetRequestBody} FSCGetRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSCGetRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FSCGetRequestBody message.
         * @function verify
         * @memberof fs.FSCGetRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSCGetRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            return null;
        };

        /**
         * Creates a FSCGetRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSCGetRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSCGetRequestBody} FSCGetRequestBody
         */
        FSCGetRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FSCGetRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FSCGetRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FSCGetRequestBody();
            if (object.name != null)
                message.name = String(object.name);
            return message;
        };

        /**
         * Creates a plain object from a FSCGetRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSCGetRequestBody
         * @static
         * @param {fs.FSCGetRequestBody} message FSCGetRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSCGetRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.name = "";
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                object.name = message.name;
            return object;
        };

        /**
         * Converts this FSCGetRequestBody to JSON.
         * @function toJSON
         * @memberof fs.FSCGetRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FSCGetRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FSCGetRequestBody
         * @function getTypeUrl
         * @memberof fs.FSCGetRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FSCGetRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FSCGetRequestBody";
        };

        return FSCGetRequestBody;
    })();

    fs.FSCGetReplyBody = (function() {

        /**
         * Properties of a FSCGetReplyBody.
         * @memberof fs
         * @interface IFSCGetReplyBody
         * @property {fs.IFSItem|null} [item] FSCGetReplyBody item
         */

        /**
         * Constructs a new FSCGetReplyBody.
         * @memberof fs
         * @classdesc Represents a FSCGetReplyBody.
         * @implements IFSCGetReplyBody
         * @constructor
         * @param {fs.IFSCGetReplyBody=} [properties] Properties to set
         */
        function FSCGetReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FSCGetReplyBody item.
         * @member {fs.IFSItem|null|undefined} item
         * @memberof fs.FSCGetReplyBody
         * @instance
         */
        FSCGetReplyBody.prototype.item = null;

        /**
         * Creates a new FSCGetReplyBody instance using the specified properties.
         * @function create
         * @memberof fs.FSCGetReplyBody
         * @static
         * @param {fs.IFSCGetReplyBody=} [properties] Properties to set
         * @returns {fs.FSCGetReplyBody} FSCGetReplyBody instance
         */
        FSCGetReplyBody.create = function create(properties) {
            return new FSCGetReplyBody(properties);
        };

        /**
         * Encodes the specified FSCGetReplyBody message. Does not implicitly {@link fs.FSCGetReplyBody.verify|verify} messages.
         * @function encode
         * @memberof fs.FSCGetReplyBody
         * @static
         * @param {fs.IFSCGetReplyBody} message FSCGetReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSCGetReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                $root.fs.FSItem.encode(message.item, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FSCGetReplyBody message, length delimited. Does not implicitly {@link fs.FSCGetReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FSCGetReplyBody
         * @static
         * @param {fs.IFSCGetReplyBody} message FSCGetReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSCGetReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FSCGetReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FSCGetReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FSCGetReplyBody} FSCGetReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSCGetReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSCGetReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.item = $root.fs.FSItem.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FSCGetReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FSCGetReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FSCGetReplyBody} FSCGetReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSCGetReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FSCGetReplyBody message.
         * @function verify
         * @memberof fs.FSCGetReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSCGetReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.item != null && Object.hasOwnProperty.call(message, "item")) {
                var error = $root.fs.FSItem.verify(message.item, long + 1);
                if (error)
                    return "item." + error;
            }
            return null;
        };

        /**
         * Creates a FSCGetReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSCGetReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSCGetReplyBody} FSCGetReplyBody
         */
        FSCGetReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FSCGetReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FSCGetReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FSCGetReplyBody();
            if (object.item != null) {
                if (!$util.isObject(object.item))
                    throw TypeError(".fs.FSCGetReplyBody.item: object expected");
                message.item = $root.fs.FSItem.fromObject(object.item, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a FSCGetReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSCGetReplyBody
         * @static
         * @param {fs.FSCGetReplyBody} message FSCGetReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSCGetReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.item = null;
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                object.item = $root.fs.FSItem.toObject(message.item, options, q + 1);
            return object;
        };

        /**
         * Converts this FSCGetReplyBody to JSON.
         * @function toJSON
         * @memberof fs.FSCGetReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FSCGetReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FSCGetReplyBody
         * @function getTypeUrl
         * @memberof fs.FSCGetReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FSCGetReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FSCGetReplyBody";
        };

        return FSCGetReplyBody;
    })();

    fs.FSItem = (function() {

        /**
         * Properties of a FSItem.
         * @memberof fs
         * @interface IFSItem
         * @property {common.IBooleanValue|null} [isFile] FSItem isFile
         * @property {common.IBooleanValue|null} [isFolder] FSItem isFolder
         * @property {common.IBooleanValue|null} [isLink] FSItem isLink
         * @property {common.IBooleanValue|null} [isCollection] FSItem isCollection
         * @property {fs.FSItem.IItem|null} [item] FSItem item
         * @property {fs.FSItem.ILocation|null} [location] FSItem location
         */

        /**
         * Constructs a new FSItem.
         * @memberof fs
         * @classdesc Represents a FSItem.
         * @implements IFSItem
         * @constructor
         * @param {fs.IFSItem=} [properties] Properties to set
         */
        function FSItem(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FSItem isFile.
         * @member {common.IBooleanValue|null|undefined} isFile
         * @memberof fs.FSItem
         * @instance
         */
        FSItem.prototype.isFile = null;

        /**
         * FSItem isFolder.
         * @member {common.IBooleanValue|null|undefined} isFolder
         * @memberof fs.FSItem
         * @instance
         */
        FSItem.prototype.isFolder = null;

        /**
         * FSItem isLink.
         * @member {common.IBooleanValue|null|undefined} isLink
         * @memberof fs.FSItem
         * @instance
         */
        FSItem.prototype.isLink = null;

        /**
         * FSItem isCollection.
         * @member {common.IBooleanValue|null|undefined} isCollection
         * @memberof fs.FSItem
         * @instance
         */
        FSItem.prototype.isCollection = null;

        /**
         * FSItem item.
         * @member {fs.FSItem.IItem|null|undefined} item
         * @memberof fs.FSItem
         * @instance
         */
        FSItem.prototype.item = null;

        /**
         * FSItem location.
         * @member {fs.FSItem.ILocation|null|undefined} location
         * @memberof fs.FSItem
         * @instance
         */
        FSItem.prototype.location = null;

        /**
         * Creates a new FSItem instance using the specified properties.
         * @function create
         * @memberof fs.FSItem
         * @static
         * @param {fs.IFSItem=} [properties] Properties to set
         * @returns {fs.FSItem} FSItem instance
         */
        FSItem.create = function create(properties) {
            return new FSItem(properties);
        };

        /**
         * Encodes the specified FSItem message. Does not implicitly {@link fs.FSItem.verify|verify} messages.
         * @function encode
         * @memberof fs.FSItem
         * @static
         * @param {fs.IFSItem} message FSItem message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSItem.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                $root.common.BooleanValue.encode(message.isFile, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                $root.common.BooleanValue.encode(message.isFolder, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink"))
                $root.common.BooleanValue.encode(message.isLink, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.isCollection != null && Object.hasOwnProperty.call(message, "isCollection"))
                $root.common.BooleanValue.encode(message.isCollection, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                $root.fs.FSItem.Item.encode(message.item, writer.uint32(/* id 5, wireType 2 =*/42).fork(), q + 1).ldelim();
            if (message.location != null && Object.hasOwnProperty.call(message, "location"))
                $root.fs.FSItem.Location.encode(message.location, writer.uint32(/* id 6, wireType 2 =*/50).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FSItem message, length delimited. Does not implicitly {@link fs.FSItem.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FSItem
         * @static
         * @param {fs.IFSItem} message FSItem message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSItem.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FSItem message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FSItem
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FSItem} FSItem
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSItem.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSItem();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.isFile = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.isFolder = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.isLink = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.isCollection = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 5: {
                        message.item = $root.fs.FSItem.Item.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 6: {
                        message.location = $root.fs.FSItem.Location.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FSItem message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FSItem
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FSItem} FSItem
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSItem.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FSItem message.
         * @function verify
         * @memberof fs.FSItem
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSItem.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile")) {
                var error = $root.common.BooleanValue.verify(message.isFile, long + 1);
                if (error)
                    return "isFile." + error;
            }
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder")) {
                var error = $root.common.BooleanValue.verify(message.isFolder, long + 1);
                if (error)
                    return "isFolder." + error;
            }
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink")) {
                var error = $root.common.BooleanValue.verify(message.isLink, long + 1);
                if (error)
                    return "isLink." + error;
            }
            if (message.isCollection != null && Object.hasOwnProperty.call(message, "isCollection")) {
                var error = $root.common.BooleanValue.verify(message.isCollection, long + 1);
                if (error)
                    return "isCollection." + error;
            }
            if (message.item != null && Object.hasOwnProperty.call(message, "item")) {
                var error = $root.fs.FSItem.Item.verify(message.item, long + 1);
                if (error)
                    return "item." + error;
            }
            if (message.location != null && Object.hasOwnProperty.call(message, "location")) {
                var error = $root.fs.FSItem.Location.verify(message.location, long + 1);
                if (error)
                    return "location." + error;
            }
            return null;
        };

        /**
         * Creates a FSItem message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSItem
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSItem} FSItem
         */
        FSItem.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FSItem)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FSItem: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FSItem();
            if (object.isFile != null) {
                if (!$util.isObject(object.isFile))
                    throw TypeError(".fs.FSItem.isFile: object expected");
                message.isFile = $root.common.BooleanValue.fromObject(object.isFile, long + 1);
            }
            if (object.isFolder != null) {
                if (!$util.isObject(object.isFolder))
                    throw TypeError(".fs.FSItem.isFolder: object expected");
                message.isFolder = $root.common.BooleanValue.fromObject(object.isFolder, long + 1);
            }
            if (object.isLink != null) {
                if (!$util.isObject(object.isLink))
                    throw TypeError(".fs.FSItem.isLink: object expected");
                message.isLink = $root.common.BooleanValue.fromObject(object.isLink, long + 1);
            }
            if (object.isCollection != null) {
                if (!$util.isObject(object.isCollection))
                    throw TypeError(".fs.FSItem.isCollection: object expected");
                message.isCollection = $root.common.BooleanValue.fromObject(object.isCollection, long + 1);
            }
            if (object.item != null) {
                if (!$util.isObject(object.item))
                    throw TypeError(".fs.FSItem.item: object expected");
                message.item = $root.fs.FSItem.Item.fromObject(object.item, long + 1);
            }
            if (object.location != null) {
                if (!$util.isObject(object.location))
                    throw TypeError(".fs.FSItem.location: object expected");
                message.location = $root.fs.FSItem.Location.fromObject(object.location, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a FSItem message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSItem
         * @static
         * @param {fs.FSItem} message FSItem
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSItem.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.isFile = null;
                object.isFolder = null;
                object.isLink = null;
                object.isCollection = null;
                object.item = null;
                object.location = null;
            }
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                object.isFile = $root.common.BooleanValue.toObject(message.isFile, options, q + 1);
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                object.isFolder = $root.common.BooleanValue.toObject(message.isFolder, options, q + 1);
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink"))
                object.isLink = $root.common.BooleanValue.toObject(message.isLink, options, q + 1);
            if (message.isCollection != null && Object.hasOwnProperty.call(message, "isCollection"))
                object.isCollection = $root.common.BooleanValue.toObject(message.isCollection, options, q + 1);
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                object.item = $root.fs.FSItem.Item.toObject(message.item, options, q + 1);
            if (message.location != null && Object.hasOwnProperty.call(message, "location"))
                object.location = $root.fs.FSItem.Location.toObject(message.location, options, q + 1);
            return object;
        };

        /**
         * Converts this FSItem to JSON.
         * @function toJSON
         * @memberof fs.FSItem
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FSItem.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FSItem
         * @function getTypeUrl
         * @memberof fs.FSItem
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FSItem.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FSItem";
        };

        FSItem.Location = (function() {

            /**
             * Properties of a Location.
             * @memberof fs.FSItem
             * @interface ILocation
             * @property {fs.IFS|null} [fs] Location fs
             * @property {string|null} [path] Location path
             * @property {string|null} [storageUse] Location storageUse
             * @property {string|null} [storageType] Location storageType
             */

            /**
             * Constructs a new Location.
             * @memberof fs.FSItem
             * @classdesc Represents a Location.
             * @implements ILocation
             * @constructor
             * @param {fs.FSItem.ILocation=} [properties] Properties to set
             */
            function Location(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * Location fs.
             * @member {fs.IFS|null|undefined} fs
             * @memberof fs.FSItem.Location
             * @instance
             */
            Location.prototype.fs = null;

            /**
             * Location path.
             * @member {string} path
             * @memberof fs.FSItem.Location
             * @instance
             */
            Location.prototype.path = "";

            /**
             * Location storageUse.
             * @member {string} storageUse
             * @memberof fs.FSItem.Location
             * @instance
             */
            Location.prototype.storageUse = "";

            /**
             * Location storageType.
             * @member {string} storageType
             * @memberof fs.FSItem.Location
             * @instance
             */
            Location.prototype.storageType = "";

            /**
             * Creates a new Location instance using the specified properties.
             * @function create
             * @memberof fs.FSItem.Location
             * @static
             * @param {fs.FSItem.ILocation=} [properties] Properties to set
             * @returns {fs.FSItem.Location} Location instance
             */
            Location.create = function create(properties) {
                return new Location(properties);
            };

            /**
             * Encodes the specified Location message. Does not implicitly {@link fs.FSItem.Location.verify|verify} messages.
             * @function encode
             * @memberof fs.FSItem.Location
             * @static
             * @param {fs.FSItem.ILocation} message Location message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Location.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.fs != null && Object.hasOwnProperty.call(message, "fs"))
                    $root.fs.FS.encode(message.fs, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
                if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.path);
                if (message.storageUse != null && Object.hasOwnProperty.call(message, "storageUse"))
                    writer.uint32(/* id 3, wireType 2 =*/26).string(message.storageUse);
                if (message.storageType != null && Object.hasOwnProperty.call(message, "storageType"))
                    writer.uint32(/* id 4, wireType 2 =*/34).string(message.storageType);
                return writer;
            };

            /**
             * Encodes the specified Location message, length delimited. Does not implicitly {@link fs.FSItem.Location.verify|verify} messages.
             * @function encodeDelimited
             * @memberof fs.FSItem.Location
             * @static
             * @param {fs.FSItem.ILocation} message Location message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Location.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes a Location message from the specified reader or buffer.
             * @function decode
             * @memberof fs.FSItem.Location
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {fs.FSItem.Location} Location
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Location.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSItem.Location();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.fs = $root.fs.FS.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 2: {
                            message.path = reader.string();
                            break;
                        }
                    case 3: {
                            message.storageUse = reader.string();
                            break;
                        }
                    case 4: {
                            message.storageType = reader.string();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a Location message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof fs.FSItem.Location
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {fs.FSItem.Location} Location
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Location.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a Location message.
             * @function verify
             * @memberof fs.FSItem.Location
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            Location.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.fs != null && Object.hasOwnProperty.call(message, "fs")) {
                    var error = $root.fs.FS.verify(message.fs, long + 1);
                    if (error)
                        return "fs." + error;
                }
                if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                    if (!$util.isString(message.path))
                        return "path: string expected";
                if (message.storageUse != null && Object.hasOwnProperty.call(message, "storageUse"))
                    if (!$util.isString(message.storageUse))
                        return "storageUse: string expected";
                if (message.storageType != null && Object.hasOwnProperty.call(message, "storageType"))
                    if (!$util.isString(message.storageType))
                        return "storageType: string expected";
                return null;
            };

            /**
             * Creates a Location message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof fs.FSItem.Location
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {fs.FSItem.Location} Location
             */
            Location.fromObject = function fromObject(object, long) {
                if (object instanceof $root.fs.FSItem.Location)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".fs.FSItem.Location: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.fs.FSItem.Location();
                if (object.fs != null) {
                    if (!$util.isObject(object.fs))
                        throw TypeError(".fs.FSItem.Location.fs: object expected");
                    message.fs = $root.fs.FS.fromObject(object.fs, long + 1);
                }
                if (object.path != null)
                    message.path = String(object.path);
                if (object.storageUse != null)
                    message.storageUse = String(object.storageUse);
                if (object.storageType != null)
                    message.storageType = String(object.storageType);
                return message;
            };

            /**
             * Creates a plain object from a Location message. Also converts values to other types if specified.
             * @function toObject
             * @memberof fs.FSItem.Location
             * @static
             * @param {fs.FSItem.Location} message Location
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            Location.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults) {
                    object.fs = null;
                    object.path = "";
                    object.storageUse = "";
                    object.storageType = "";
                }
                if (message.fs != null && Object.hasOwnProperty.call(message, "fs"))
                    object.fs = $root.fs.FS.toObject(message.fs, options, q + 1);
                if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                    object.path = message.path;
                if (message.storageUse != null && Object.hasOwnProperty.call(message, "storageUse"))
                    object.storageUse = message.storageUse;
                if (message.storageType != null && Object.hasOwnProperty.call(message, "storageType"))
                    object.storageType = message.storageType;
                return object;
            };

            /**
             * Converts this Location to JSON.
             * @function toJSON
             * @memberof fs.FSItem.Location
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            Location.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for Location
             * @function getTypeUrl
             * @memberof fs.FSItem.Location
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            Location.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/fs.FSItem.Location";
            };

            return Location;
        })();

        FSItem.Item = (function() {

            /**
             * Properties of an Item.
             * @memberof fs.FSItem
             * @interface IItem
             * @property {fs.IFS|null} [fs] Item fs
             * @property {file.IFile|null} [file] Item file
             * @property {common.IObjectReference|null} [collection] Item collection
             */

            /**
             * Constructs a new Item.
             * @memberof fs.FSItem
             * @classdesc Represents an Item.
             * @implements IItem
             * @constructor
             * @param {fs.FSItem.IItem=} [properties] Properties to set
             */
            function Item(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * Item fs.
             * @member {fs.IFS|null|undefined} fs
             * @memberof fs.FSItem.Item
             * @instance
             */
            Item.prototype.fs = null;

            /**
             * Item file.
             * @member {file.IFile|null|undefined} file
             * @memberof fs.FSItem.Item
             * @instance
             */
            Item.prototype.file = null;

            /**
             * Item collection.
             * @member {common.IObjectReference|null|undefined} collection
             * @memberof fs.FSItem.Item
             * @instance
             */
            Item.prototype.collection = null;

            /**
             * Creates a new Item instance using the specified properties.
             * @function create
             * @memberof fs.FSItem.Item
             * @static
             * @param {fs.FSItem.IItem=} [properties] Properties to set
             * @returns {fs.FSItem.Item} Item instance
             */
            Item.create = function create(properties) {
                return new Item(properties);
            };

            /**
             * Encodes the specified Item message. Does not implicitly {@link fs.FSItem.Item.verify|verify} messages.
             * @function encode
             * @memberof fs.FSItem.Item
             * @static
             * @param {fs.FSItem.IItem} message Item message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Item.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.fs != null && Object.hasOwnProperty.call(message, "fs"))
                    $root.fs.FS.encode(message.fs, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
                if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                    $root.file.File.encode(message.file, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
                if (message.collection != null && Object.hasOwnProperty.call(message, "collection"))
                    $root.common.ObjectReference.encode(message.collection, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
                return writer;
            };

            /**
             * Encodes the specified Item message, length delimited. Does not implicitly {@link fs.FSItem.Item.verify|verify} messages.
             * @function encodeDelimited
             * @memberof fs.FSItem.Item
             * @static
             * @param {fs.FSItem.IItem} message Item message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Item.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes an Item message from the specified reader or buffer.
             * @function decode
             * @memberof fs.FSItem.Item
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {fs.FSItem.Item} Item
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Item.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSItem.Item();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.fs = $root.fs.FS.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 2: {
                            message.file = $root.file.File.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 3: {
                            message.collection = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes an Item message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof fs.FSItem.Item
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {fs.FSItem.Item} Item
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Item.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies an Item message.
             * @function verify
             * @memberof fs.FSItem.Item
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            Item.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.fs != null && Object.hasOwnProperty.call(message, "fs")) {
                    var error = $root.fs.FS.verify(message.fs, long + 1);
                    if (error)
                        return "fs." + error;
                }
                if (message.file != null && Object.hasOwnProperty.call(message, "file")) {
                    var error = $root.file.File.verify(message.file, long + 1);
                    if (error)
                        return "file." + error;
                }
                if (message.collection != null && Object.hasOwnProperty.call(message, "collection")) {
                    var error = $root.common.ObjectReference.verify(message.collection, long + 1);
                    if (error)
                        return "collection." + error;
                }
                return null;
            };

            /**
             * Creates an Item message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof fs.FSItem.Item
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {fs.FSItem.Item} Item
             */
            Item.fromObject = function fromObject(object, long) {
                if (object instanceof $root.fs.FSItem.Item)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".fs.FSItem.Item: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.fs.FSItem.Item();
                if (object.fs != null) {
                    if (!$util.isObject(object.fs))
                        throw TypeError(".fs.FSItem.Item.fs: object expected");
                    message.fs = $root.fs.FS.fromObject(object.fs, long + 1);
                }
                if (object.file != null) {
                    if (!$util.isObject(object.file))
                        throw TypeError(".fs.FSItem.Item.file: object expected");
                    message.file = $root.file.File.fromObject(object.file, long + 1);
                }
                if (object.collection != null) {
                    if (!$util.isObject(object.collection))
                        throw TypeError(".fs.FSItem.Item.collection: object expected");
                    message.collection = $root.common.ObjectReference.fromObject(object.collection, long + 1);
                }
                return message;
            };

            /**
             * Creates a plain object from an Item message. Also converts values to other types if specified.
             * @function toObject
             * @memberof fs.FSItem.Item
             * @static
             * @param {fs.FSItem.Item} message Item
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            Item.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults) {
                    object.fs = null;
                    object.file = null;
                    object.collection = null;
                }
                if (message.fs != null && Object.hasOwnProperty.call(message, "fs"))
                    object.fs = $root.fs.FS.toObject(message.fs, options, q + 1);
                if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                    object.file = $root.file.File.toObject(message.file, options, q + 1);
                if (message.collection != null && Object.hasOwnProperty.call(message, "collection"))
                    object.collection = $root.common.ObjectReference.toObject(message.collection, options, q + 1);
                return object;
            };

            /**
             * Converts this Item to JSON.
             * @function toJSON
             * @memberof fs.FSItem.Item
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            Item.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for Item
             * @function getTypeUrl
             * @memberof fs.FSItem.Item
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            Item.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/fs.FSItem.Item";
            };

            return Item;
        })();

        return FSItem;
    })();

    fs.FSCGetAllReplyBody = (function() {

        /**
         * Properties of a FSCGetAllReplyBody.
         * @memberof fs
         * @interface IFSCGetAllReplyBody
         * @property {Array.<fs.INameAndItem>|null} [items] FSCGetAllReplyBody items
         */

        /**
         * Constructs a new FSCGetAllReplyBody.
         * @memberof fs
         * @classdesc Represents a FSCGetAllReplyBody.
         * @implements IFSCGetAllReplyBody
         * @constructor
         * @param {fs.IFSCGetAllReplyBody=} [properties] Properties to set
         */
        function FSCGetAllReplyBody(properties) {
            this.items = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FSCGetAllReplyBody items.
         * @member {Array.<fs.INameAndItem>} items
         * @memberof fs.FSCGetAllReplyBody
         * @instance
         */
        FSCGetAllReplyBody.prototype.items = $util.emptyArray;

        /**
         * Creates a new FSCGetAllReplyBody instance using the specified properties.
         * @function create
         * @memberof fs.FSCGetAllReplyBody
         * @static
         * @param {fs.IFSCGetAllReplyBody=} [properties] Properties to set
         * @returns {fs.FSCGetAllReplyBody} FSCGetAllReplyBody instance
         */
        FSCGetAllReplyBody.create = function create(properties) {
            return new FSCGetAllReplyBody(properties);
        };

        /**
         * Encodes the specified FSCGetAllReplyBody message. Does not implicitly {@link fs.FSCGetAllReplyBody.verify|verify} messages.
         * @function encode
         * @memberof fs.FSCGetAllReplyBody
         * @static
         * @param {fs.IFSCGetAllReplyBody} message FSCGetAllReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSCGetAllReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.items != null && message.items.length)
                for (var i = 0; i < message.items.length; ++i)
                    $root.fs.NameAndItem.encode(message.items[i], writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FSCGetAllReplyBody message, length delimited. Does not implicitly {@link fs.FSCGetAllReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FSCGetAllReplyBody
         * @static
         * @param {fs.IFSCGetAllReplyBody} message FSCGetAllReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSCGetAllReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FSCGetAllReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FSCGetAllReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FSCGetAllReplyBody} FSCGetAllReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSCGetAllReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSCGetAllReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.items && message.items.length))
                            message.items = [];
                        message.items.push($root.fs.NameAndItem.decode(reader, reader.uint32(), undefined, long + 1));
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FSCGetAllReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FSCGetAllReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FSCGetAllReplyBody} FSCGetAllReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSCGetAllReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FSCGetAllReplyBody message.
         * @function verify
         * @memberof fs.FSCGetAllReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSCGetAllReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.items != null && Object.hasOwnProperty.call(message, "items")) {
                if (!Array.isArray(message.items))
                    return "items: array expected";
                for (var i = 0; i < message.items.length; ++i) {
                    var error = $root.fs.NameAndItem.verify(message.items[i], long + 1);
                    if (error)
                        return "items." + error;
                }
            }
            return null;
        };

        /**
         * Creates a FSCGetAllReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSCGetAllReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSCGetAllReplyBody} FSCGetAllReplyBody
         */
        FSCGetAllReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FSCGetAllReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FSCGetAllReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FSCGetAllReplyBody();
            if (object.items) {
                if (!Array.isArray(object.items))
                    throw TypeError(".fs.FSCGetAllReplyBody.items: array expected");
                message.items = [];
                for (var i = 0; i < object.items.length; ++i) {
                    if (!$util.isObject(object.items[i]))
                        throw TypeError(".fs.FSCGetAllReplyBody.items: object expected");
                    message.items[i] = $root.fs.NameAndItem.fromObject(object.items[i], long + 1);
                }
            }
            return message;
        };

        /**
         * Creates a plain object from a FSCGetAllReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSCGetAllReplyBody
         * @static
         * @param {fs.FSCGetAllReplyBody} message FSCGetAllReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSCGetAllReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.items = [];
            if (message.items && message.items.length) {
                object.items = [];
                for (var j = 0; j < message.items.length; ++j)
                    object.items[j] = $root.fs.NameAndItem.toObject(message.items[j], options, q + 1);
            }
            return object;
        };

        /**
         * Converts this FSCGetAllReplyBody to JSON.
         * @function toJSON
         * @memberof fs.FSCGetAllReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FSCGetAllReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FSCGetAllReplyBody
         * @function getTypeUrl
         * @memberof fs.FSCGetAllReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FSCGetAllReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FSCGetAllReplyBody";
        };

        return FSCGetAllReplyBody;
    })();

    fs.NameAndItem = (function() {

        /**
         * Properties of a NameAndItem.
         * @memberof fs
         * @interface INameAndItem
         * @property {string|null} [name] NameAndItem name
         * @property {fs.IFSItem|null} [item] NameAndItem item
         */

        /**
         * Constructs a new NameAndItem.
         * @memberof fs
         * @classdesc Represents a NameAndItem.
         * @implements INameAndItem
         * @constructor
         * @param {fs.INameAndItem=} [properties] Properties to set
         */
        function NameAndItem(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * NameAndItem name.
         * @member {string} name
         * @memberof fs.NameAndItem
         * @instance
         */
        NameAndItem.prototype.name = "";

        /**
         * NameAndItem item.
         * @member {fs.IFSItem|null|undefined} item
         * @memberof fs.NameAndItem
         * @instance
         */
        NameAndItem.prototype.item = null;

        /**
         * Creates a new NameAndItem instance using the specified properties.
         * @function create
         * @memberof fs.NameAndItem
         * @static
         * @param {fs.INameAndItem=} [properties] Properties to set
         * @returns {fs.NameAndItem} NameAndItem instance
         */
        NameAndItem.create = function create(properties) {
            return new NameAndItem(properties);
        };

        /**
         * Encodes the specified NameAndItem message. Does not implicitly {@link fs.NameAndItem.verify|verify} messages.
         * @function encode
         * @memberof fs.NameAndItem
         * @static
         * @param {fs.INameAndItem} message NameAndItem message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        NameAndItem.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                $root.fs.FSItem.encode(message.item, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified NameAndItem message, length delimited. Does not implicitly {@link fs.NameAndItem.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.NameAndItem
         * @static
         * @param {fs.INameAndItem} message NameAndItem message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        NameAndItem.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a NameAndItem message from the specified reader or buffer.
         * @function decode
         * @memberof fs.NameAndItem
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.NameAndItem} NameAndItem
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        NameAndItem.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.NameAndItem();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.name = reader.string();
                        break;
                    }
                case 2: {
                        message.item = $root.fs.FSItem.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a NameAndItem message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.NameAndItem
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.NameAndItem} NameAndItem
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        NameAndItem.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a NameAndItem message.
         * @function verify
         * @memberof fs.NameAndItem
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        NameAndItem.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.item != null && Object.hasOwnProperty.call(message, "item")) {
                var error = $root.fs.FSItem.verify(message.item, long + 1);
                if (error)
                    return "item." + error;
            }
            return null;
        };

        /**
         * Creates a NameAndItem message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.NameAndItem
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.NameAndItem} NameAndItem
         */
        NameAndItem.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.NameAndItem)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.NameAndItem: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.NameAndItem();
            if (object.name != null)
                message.name = String(object.name);
            if (object.item != null) {
                if (!$util.isObject(object.item))
                    throw TypeError(".fs.NameAndItem.item: object expected");
                message.item = $root.fs.FSItem.fromObject(object.item, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a NameAndItem message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.NameAndItem
         * @static
         * @param {fs.NameAndItem} message NameAndItem
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        NameAndItem.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.name = "";
                object.item = null;
            }
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                object.name = message.name;
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                object.item = $root.fs.FSItem.toObject(message.item, options, q + 1);
            return object;
        };

        /**
         * Converts this NameAndItem to JSON.
         * @function toJSON
         * @memberof fs.NameAndItem
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        NameAndItem.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for NameAndItem
         * @function getTypeUrl
         * @memberof fs.NameAndItem
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        NameAndItem.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.NameAndItem";
        };

        return NameAndItem;
    })();

    fs.IterResMsg = (function() {

        /**
         * Properties of an IterResMsg.
         * @memberof fs
         * @interface IIterResMsg
         * @property {common.IBooleanValue|null} [done] IterResMsg done
         * @property {fs.INameAndItem|null} [value] IterResMsg value
         */

        /**
         * Constructs a new IterResMsg.
         * @memberof fs
         * @classdesc Represents an IterResMsg.
         * @implements IIterResMsg
         * @constructor
         * @param {fs.IIterResMsg=} [properties] Properties to set
         */
        function IterResMsg(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * IterResMsg done.
         * @member {common.IBooleanValue|null|undefined} done
         * @memberof fs.IterResMsg
         * @instance
         */
        IterResMsg.prototype.done = null;

        /**
         * IterResMsg value.
         * @member {fs.INameAndItem|null|undefined} value
         * @memberof fs.IterResMsg
         * @instance
         */
        IterResMsg.prototype.value = null;

        /**
         * Creates a new IterResMsg instance using the specified properties.
         * @function create
         * @memberof fs.IterResMsg
         * @static
         * @param {fs.IIterResMsg=} [properties] Properties to set
         * @returns {fs.IterResMsg} IterResMsg instance
         */
        IterResMsg.create = function create(properties) {
            return new IterResMsg(properties);
        };

        /**
         * Encodes the specified IterResMsg message. Does not implicitly {@link fs.IterResMsg.verify|verify} messages.
         * @function encode
         * @memberof fs.IterResMsg
         * @static
         * @param {fs.IIterResMsg} message IterResMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        IterResMsg.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.done != null && Object.hasOwnProperty.call(message, "done"))
                $root.common.BooleanValue.encode(message.done, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                $root.fs.NameAndItem.encode(message.value, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified IterResMsg message, length delimited. Does not implicitly {@link fs.IterResMsg.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.IterResMsg
         * @static
         * @param {fs.IIterResMsg} message IterResMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        IterResMsg.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an IterResMsg message from the specified reader or buffer.
         * @function decode
         * @memberof fs.IterResMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.IterResMsg} IterResMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        IterResMsg.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.IterResMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.done = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.value = $root.fs.NameAndItem.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an IterResMsg message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.IterResMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.IterResMsg} IterResMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        IterResMsg.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an IterResMsg message.
         * @function verify
         * @memberof fs.IterResMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        IterResMsg.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.done != null && Object.hasOwnProperty.call(message, "done")) {
                var error = $root.common.BooleanValue.verify(message.done, long + 1);
                if (error)
                    return "done." + error;
            }
            if (message.value != null && Object.hasOwnProperty.call(message, "value")) {
                var error = $root.fs.NameAndItem.verify(message.value, long + 1);
                if (error)
                    return "value." + error;
            }
            return null;
        };

        /**
         * Creates an IterResMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.IterResMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.IterResMsg} IterResMsg
         */
        IterResMsg.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.IterResMsg)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.IterResMsg: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.IterResMsg();
            if (object.done != null) {
                if (!$util.isObject(object.done))
                    throw TypeError(".fs.IterResMsg.done: object expected");
                message.done = $root.common.BooleanValue.fromObject(object.done, long + 1);
            }
            if (object.value != null) {
                if (!$util.isObject(object.value))
                    throw TypeError(".fs.IterResMsg.value: object expected");
                message.value = $root.fs.NameAndItem.fromObject(object.value, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an IterResMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.IterResMsg
         * @static
         * @param {fs.IterResMsg} message IterResMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        IterResMsg.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.done = null;
                object.value = null;
            }
            if (message.done != null && Object.hasOwnProperty.call(message, "done"))
                object.done = $root.common.BooleanValue.toObject(message.done, options, q + 1);
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = $root.fs.NameAndItem.toObject(message.value, options, q + 1);
            return object;
        };

        /**
         * Converts this IterResMsg to JSON.
         * @function toJSON
         * @memberof fs.IterResMsg
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        IterResMsg.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for IterResMsg
         * @function getTypeUrl
         * @memberof fs.IterResMsg
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        IterResMsg.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.IterResMsg";
        };

        return IterResMsg;
    })();

    fs.CollectionEvent = (function() {

        /**
         * Properties of a CollectionEvent.
         * @memberof fs
         * @interface ICollectionEvent
         * @property {string|null} [type] CollectionEvent type
         * @property {common.IStringValue|null} [path] CollectionEvent path
         * @property {fs.IFSItem|null} [item] CollectionEvent item
         */

        /**
         * Constructs a new CollectionEvent.
         * @memberof fs
         * @classdesc Represents a CollectionEvent.
         * @implements ICollectionEvent
         * @constructor
         * @param {fs.ICollectionEvent=} [properties] Properties to set
         */
        function CollectionEvent(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * CollectionEvent type.
         * @member {string} type
         * @memberof fs.CollectionEvent
         * @instance
         */
        CollectionEvent.prototype.type = "";

        /**
         * CollectionEvent path.
         * @member {common.IStringValue|null|undefined} path
         * @memberof fs.CollectionEvent
         * @instance
         */
        CollectionEvent.prototype.path = null;

        /**
         * CollectionEvent item.
         * @member {fs.IFSItem|null|undefined} item
         * @memberof fs.CollectionEvent
         * @instance
         */
        CollectionEvent.prototype.item = null;

        /**
         * Creates a new CollectionEvent instance using the specified properties.
         * @function create
         * @memberof fs.CollectionEvent
         * @static
         * @param {fs.ICollectionEvent=} [properties] Properties to set
         * @returns {fs.CollectionEvent} CollectionEvent instance
         */
        CollectionEvent.create = function create(properties) {
            return new CollectionEvent(properties);
        };

        /**
         * Encodes the specified CollectionEvent message. Does not implicitly {@link fs.CollectionEvent.verify|verify} messages.
         * @function encode
         * @memberof fs.CollectionEvent
         * @static
         * @param {fs.ICollectionEvent} message CollectionEvent message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CollectionEvent.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.type);
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                $root.common.StringValue.encode(message.path, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                $root.fs.FSItem.encode(message.item, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified CollectionEvent message, length delimited. Does not implicitly {@link fs.CollectionEvent.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.CollectionEvent
         * @static
         * @param {fs.ICollectionEvent} message CollectionEvent message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CollectionEvent.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a CollectionEvent message from the specified reader or buffer.
         * @function decode
         * @memberof fs.CollectionEvent
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.CollectionEvent} CollectionEvent
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CollectionEvent.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.CollectionEvent();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.type = reader.string();
                        break;
                    }
                case 2: {
                        message.path = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.item = $root.fs.FSItem.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a CollectionEvent message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.CollectionEvent
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.CollectionEvent} CollectionEvent
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CollectionEvent.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a CollectionEvent message.
         * @function verify
         * @memberof fs.CollectionEvent
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        CollectionEvent.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.path != null && Object.hasOwnProperty.call(message, "path")) {
                var error = $root.common.StringValue.verify(message.path, long + 1);
                if (error)
                    return "path." + error;
            }
            if (message.item != null && Object.hasOwnProperty.call(message, "item")) {
                var error = $root.fs.FSItem.verify(message.item, long + 1);
                if (error)
                    return "item." + error;
            }
            return null;
        };

        /**
         * Creates a CollectionEvent message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.CollectionEvent
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.CollectionEvent} CollectionEvent
         */
        CollectionEvent.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.CollectionEvent)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.CollectionEvent: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.CollectionEvent();
            if (object.type != null)
                message.type = String(object.type);
            if (object.path != null) {
                if (!$util.isObject(object.path))
                    throw TypeError(".fs.CollectionEvent.path: object expected");
                message.path = $root.common.StringValue.fromObject(object.path, long + 1);
            }
            if (object.item != null) {
                if (!$util.isObject(object.item))
                    throw TypeError(".fs.CollectionEvent.item: object expected");
                message.item = $root.fs.FSItem.fromObject(object.item, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a CollectionEvent message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.CollectionEvent
         * @static
         * @param {fs.CollectionEvent} message CollectionEvent
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        CollectionEvent.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.path = null;
                object.item = null;
            }
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                object.type = message.type;
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = $root.common.StringValue.toObject(message.path, options, q + 1);
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                object.item = $root.fs.FSItem.toObject(message.item, options, q + 1);
            return object;
        };

        /**
         * Converts this CollectionEvent to JSON.
         * @function toJSON
         * @memberof fs.CollectionEvent
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        CollectionEvent.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for CollectionEvent
         * @function getTypeUrl
         * @memberof fs.CollectionEvent
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        CollectionEvent.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.CollectionEvent";
        };

        return CollectionEvent;
    })();

    fs.VersionedGetXAttrRequestBody = (function() {

        /**
         * Properties of a VersionedGetXAttrRequestBody.
         * @memberof fs
         * @interface IVersionedGetXAttrRequestBody
         * @property {string|null} [path] VersionedGetXAttrRequestBody path
         * @property {string|null} [xaName] VersionedGetXAttrRequestBody xaName
         * @property {file.IVersionedReadFlags|null} [flags] VersionedGetXAttrRequestBody flags
         */

        /**
         * Constructs a new VersionedGetXAttrRequestBody.
         * @memberof fs
         * @classdesc Represents a VersionedGetXAttrRequestBody.
         * @implements IVersionedGetXAttrRequestBody
         * @constructor
         * @param {fs.IVersionedGetXAttrRequestBody=} [properties] Properties to set
         */
        function VersionedGetXAttrRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedGetXAttrRequestBody path.
         * @member {string} path
         * @memberof fs.VersionedGetXAttrRequestBody
         * @instance
         */
        VersionedGetXAttrRequestBody.prototype.path = "";

        /**
         * VersionedGetXAttrRequestBody xaName.
         * @member {string} xaName
         * @memberof fs.VersionedGetXAttrRequestBody
         * @instance
         */
        VersionedGetXAttrRequestBody.prototype.xaName = "";

        /**
         * VersionedGetXAttrRequestBody flags.
         * @member {file.IVersionedReadFlags|null|undefined} flags
         * @memberof fs.VersionedGetXAttrRequestBody
         * @instance
         */
        VersionedGetXAttrRequestBody.prototype.flags = null;

        /**
         * Creates a new VersionedGetXAttrRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.VersionedGetXAttrRequestBody
         * @static
         * @param {fs.IVersionedGetXAttrRequestBody=} [properties] Properties to set
         * @returns {fs.VersionedGetXAttrRequestBody} VersionedGetXAttrRequestBody instance
         */
        VersionedGetXAttrRequestBody.create = function create(properties) {
            return new VersionedGetXAttrRequestBody(properties);
        };

        /**
         * Encodes the specified VersionedGetXAttrRequestBody message. Does not implicitly {@link fs.VersionedGetXAttrRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.VersionedGetXAttrRequestBody
         * @static
         * @param {fs.IVersionedGetXAttrRequestBody} message VersionedGetXAttrRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetXAttrRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.xaName);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 10, wireType 2 =*/82).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedGetXAttrRequestBody message, length delimited. Does not implicitly {@link fs.VersionedGetXAttrRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.VersionedGetXAttrRequestBody
         * @static
         * @param {fs.IVersionedGetXAttrRequestBody} message VersionedGetXAttrRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetXAttrRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedGetXAttrRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.VersionedGetXAttrRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.VersionedGetXAttrRequestBody} VersionedGetXAttrRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetXAttrRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedGetXAttrRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.xaName = reader.string();
                        break;
                    }
                case 10: {
                        message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedGetXAttrRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.VersionedGetXAttrRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.VersionedGetXAttrRequestBody} VersionedGetXAttrRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetXAttrRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedGetXAttrRequestBody message.
         * @function verify
         * @memberof fs.VersionedGetXAttrRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedGetXAttrRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                if (!$util.isString(message.xaName))
                    return "xaName: string expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedGetXAttrRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.VersionedGetXAttrRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.VersionedGetXAttrRequestBody} VersionedGetXAttrRequestBody
         */
        VersionedGetXAttrRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.VersionedGetXAttrRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.VersionedGetXAttrRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.VersionedGetXAttrRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.xaName != null)
                message.xaName = String(object.xaName);
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.VersionedGetXAttrRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedGetXAttrRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.VersionedGetXAttrRequestBody
         * @static
         * @param {fs.VersionedGetXAttrRequestBody} message VersionedGetXAttrRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedGetXAttrRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.xaName = "";
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                object.xaName = message.xaName;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedGetXAttrRequestBody to JSON.
         * @function toJSON
         * @memberof fs.VersionedGetXAttrRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedGetXAttrRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedGetXAttrRequestBody
         * @function getTypeUrl
         * @memberof fs.VersionedGetXAttrRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedGetXAttrRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.VersionedGetXAttrRequestBody";
        };

        return VersionedGetXAttrRequestBody;
    })();

    fs.PathAndFlagsRequestBody = (function() {

        /**
         * Properties of a PathAndFlagsRequestBody.
         * @memberof fs
         * @interface IPathAndFlagsRequestBody
         * @property {string|null} [path] PathAndFlagsRequestBody path
         * @property {file.IVersionedReadFlags|null} [flags] PathAndFlagsRequestBody flags
         */

        /**
         * Constructs a new PathAndFlagsRequestBody.
         * @memberof fs
         * @classdesc Represents a PathAndFlagsRequestBody.
         * @implements IPathAndFlagsRequestBody
         * @constructor
         * @param {fs.IPathAndFlagsRequestBody=} [properties] Properties to set
         */
        function PathAndFlagsRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * PathAndFlagsRequestBody path.
         * @member {string} path
         * @memberof fs.PathAndFlagsRequestBody
         * @instance
         */
        PathAndFlagsRequestBody.prototype.path = "";

        /**
         * PathAndFlagsRequestBody flags.
         * @member {file.IVersionedReadFlags|null|undefined} flags
         * @memberof fs.PathAndFlagsRequestBody
         * @instance
         */
        PathAndFlagsRequestBody.prototype.flags = null;

        /**
         * Creates a new PathAndFlagsRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.PathAndFlagsRequestBody
         * @static
         * @param {fs.IPathAndFlagsRequestBody=} [properties] Properties to set
         * @returns {fs.PathAndFlagsRequestBody} PathAndFlagsRequestBody instance
         */
        PathAndFlagsRequestBody.create = function create(properties) {
            return new PathAndFlagsRequestBody(properties);
        };

        /**
         * Encodes the specified PathAndFlagsRequestBody message. Does not implicitly {@link fs.PathAndFlagsRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.PathAndFlagsRequestBody
         * @static
         * @param {fs.IPathAndFlagsRequestBody} message PathAndFlagsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        PathAndFlagsRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified PathAndFlagsRequestBody message, length delimited. Does not implicitly {@link fs.PathAndFlagsRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.PathAndFlagsRequestBody
         * @static
         * @param {fs.IPathAndFlagsRequestBody} message PathAndFlagsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        PathAndFlagsRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a PathAndFlagsRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.PathAndFlagsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.PathAndFlagsRequestBody} PathAndFlagsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        PathAndFlagsRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.PathAndFlagsRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a PathAndFlagsRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.PathAndFlagsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.PathAndFlagsRequestBody} PathAndFlagsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        PathAndFlagsRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a PathAndFlagsRequestBody message.
         * @function verify
         * @memberof fs.PathAndFlagsRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        PathAndFlagsRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a PathAndFlagsRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.PathAndFlagsRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.PathAndFlagsRequestBody} PathAndFlagsRequestBody
         */
        PathAndFlagsRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.PathAndFlagsRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.PathAndFlagsRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.PathAndFlagsRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.PathAndFlagsRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a PathAndFlagsRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.PathAndFlagsRequestBody
         * @static
         * @param {fs.PathAndFlagsRequestBody} message PathAndFlagsRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        PathAndFlagsRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this PathAndFlagsRequestBody to JSON.
         * @function toJSON
         * @memberof fs.PathAndFlagsRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        PathAndFlagsRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for PathAndFlagsRequestBody
         * @function getTypeUrl
         * @memberof fs.PathAndFlagsRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        PathAndFlagsRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.PathAndFlagsRequestBody";
        };

        return PathAndFlagsRequestBody;
    })();

    fs.VersionedListFolderReplyBody = (function() {

        /**
         * Properties of a VersionedListFolderReplyBody.
         * @memberof fs
         * @interface IVersionedListFolderReplyBody
         * @property {number|Long|null} [version] VersionedListFolderReplyBody version
         * @property {Array.<fs.IListingEntryMsg>|null} [entries] VersionedListFolderReplyBody entries
         */

        /**
         * Constructs a new VersionedListFolderReplyBody.
         * @memberof fs
         * @classdesc Represents a VersionedListFolderReplyBody.
         * @implements IVersionedListFolderReplyBody
         * @constructor
         * @param {fs.IVersionedListFolderReplyBody=} [properties] Properties to set
         */
        function VersionedListFolderReplyBody(properties) {
            this.entries = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedListFolderReplyBody version.
         * @member {number|Long} version
         * @memberof fs.VersionedListFolderReplyBody
         * @instance
         */
        VersionedListFolderReplyBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * VersionedListFolderReplyBody entries.
         * @member {Array.<fs.IListingEntryMsg>} entries
         * @memberof fs.VersionedListFolderReplyBody
         * @instance
         */
        VersionedListFolderReplyBody.prototype.entries = $util.emptyArray;

        /**
         * Creates a new VersionedListFolderReplyBody instance using the specified properties.
         * @function create
         * @memberof fs.VersionedListFolderReplyBody
         * @static
         * @param {fs.IVersionedListFolderReplyBody=} [properties] Properties to set
         * @returns {fs.VersionedListFolderReplyBody} VersionedListFolderReplyBody instance
         */
        VersionedListFolderReplyBody.create = function create(properties) {
            return new VersionedListFolderReplyBody(properties);
        };

        /**
         * Encodes the specified VersionedListFolderReplyBody message. Does not implicitly {@link fs.VersionedListFolderReplyBody.verify|verify} messages.
         * @function encode
         * @memberof fs.VersionedListFolderReplyBody
         * @static
         * @param {fs.IVersionedListFolderReplyBody} message VersionedListFolderReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedListFolderReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            if (message.entries != null && message.entries.length)
                for (var i = 0; i < message.entries.length; ++i)
                    $root.fs.ListingEntryMsg.encode(message.entries[i], writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedListFolderReplyBody message, length delimited. Does not implicitly {@link fs.VersionedListFolderReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.VersionedListFolderReplyBody
         * @static
         * @param {fs.IVersionedListFolderReplyBody} message VersionedListFolderReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedListFolderReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedListFolderReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.VersionedListFolderReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.VersionedListFolderReplyBody} VersionedListFolderReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedListFolderReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedListFolderReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        if (!(message.entries && message.entries.length))
                            message.entries = [];
                        message.entries.push($root.fs.ListingEntryMsg.decode(reader, reader.uint32(), undefined, long + 1));
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedListFolderReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.VersionedListFolderReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.VersionedListFolderReplyBody} VersionedListFolderReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedListFolderReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedListFolderReplyBody message.
         * @function verify
         * @memberof fs.VersionedListFolderReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedListFolderReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            if (message.entries != null && Object.hasOwnProperty.call(message, "entries")) {
                if (!Array.isArray(message.entries))
                    return "entries: array expected";
                for (var i = 0; i < message.entries.length; ++i) {
                    var error = $root.fs.ListingEntryMsg.verify(message.entries[i], long + 1);
                    if (error)
                        return "entries." + error;
                }
            }
            return null;
        };

        /**
         * Creates a VersionedListFolderReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.VersionedListFolderReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.VersionedListFolderReplyBody} VersionedListFolderReplyBody
         */
        VersionedListFolderReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.VersionedListFolderReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.VersionedListFolderReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.VersionedListFolderReplyBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            if (object.entries) {
                if (!Array.isArray(object.entries))
                    throw TypeError(".fs.VersionedListFolderReplyBody.entries: array expected");
                message.entries = [];
                for (var i = 0; i < object.entries.length; ++i) {
                    if (!$util.isObject(object.entries[i]))
                        throw TypeError(".fs.VersionedListFolderReplyBody.entries: object expected");
                    message.entries[i] = $root.fs.ListingEntryMsg.fromObject(object.entries[i], long + 1);
                }
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedListFolderReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.VersionedListFolderReplyBody
         * @static
         * @param {fs.VersionedListFolderReplyBody} message VersionedListFolderReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedListFolderReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.entries = [];
            if (options.defaults)
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            if (message.entries && message.entries.length) {
                object.entries = [];
                for (var j = 0; j < message.entries.length; ++j)
                    object.entries[j] = $root.fs.ListingEntryMsg.toObject(message.entries[j], options, q + 1);
            }
            return object;
        };

        /**
         * Converts this VersionedListFolderReplyBody to JSON.
         * @function toJSON
         * @memberof fs.VersionedListFolderReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedListFolderReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedListFolderReplyBody
         * @function getTypeUrl
         * @memberof fs.VersionedListFolderReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedListFolderReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.VersionedListFolderReplyBody";
        };

        return VersionedListFolderReplyBody;
    })();

    fs.VersionedReadBytesRequestBody = (function() {

        /**
         * Properties of a VersionedReadBytesRequestBody.
         * @memberof fs
         * @interface IVersionedReadBytesRequestBody
         * @property {string|null} [path] VersionedReadBytesRequestBody path
         * @property {common.IUInt64Value|null} [start] VersionedReadBytesRequestBody start
         * @property {common.IUInt64Value|null} [end] VersionedReadBytesRequestBody end
         * @property {file.IVersionedReadFlags|null} [flags] VersionedReadBytesRequestBody flags
         */

        /**
         * Constructs a new VersionedReadBytesRequestBody.
         * @memberof fs
         * @classdesc Represents a VersionedReadBytesRequestBody.
         * @implements IVersionedReadBytesRequestBody
         * @constructor
         * @param {fs.IVersionedReadBytesRequestBody=} [properties] Properties to set
         */
        function VersionedReadBytesRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedReadBytesRequestBody path.
         * @member {string} path
         * @memberof fs.VersionedReadBytesRequestBody
         * @instance
         */
        VersionedReadBytesRequestBody.prototype.path = "";

        /**
         * VersionedReadBytesRequestBody start.
         * @member {common.IUInt64Value|null|undefined} start
         * @memberof fs.VersionedReadBytesRequestBody
         * @instance
         */
        VersionedReadBytesRequestBody.prototype.start = null;

        /**
         * VersionedReadBytesRequestBody end.
         * @member {common.IUInt64Value|null|undefined} end
         * @memberof fs.VersionedReadBytesRequestBody
         * @instance
         */
        VersionedReadBytesRequestBody.prototype.end = null;

        /**
         * VersionedReadBytesRequestBody flags.
         * @member {file.IVersionedReadFlags|null|undefined} flags
         * @memberof fs.VersionedReadBytesRequestBody
         * @instance
         */
        VersionedReadBytesRequestBody.prototype.flags = null;

        /**
         * Creates a new VersionedReadBytesRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.VersionedReadBytesRequestBody
         * @static
         * @param {fs.IVersionedReadBytesRequestBody=} [properties] Properties to set
         * @returns {fs.VersionedReadBytesRequestBody} VersionedReadBytesRequestBody instance
         */
        VersionedReadBytesRequestBody.create = function create(properties) {
            return new VersionedReadBytesRequestBody(properties);
        };

        /**
         * Encodes the specified VersionedReadBytesRequestBody message. Does not implicitly {@link fs.VersionedReadBytesRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.VersionedReadBytesRequestBody
         * @static
         * @param {fs.IVersionedReadBytesRequestBody} message VersionedReadBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadBytesRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                $root.common.UInt64Value.encode(message.start, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                $root.common.UInt64Value.encode(message.end, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 10, wireType 2 =*/82).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedReadBytesRequestBody message, length delimited. Does not implicitly {@link fs.VersionedReadBytesRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.VersionedReadBytesRequestBody
         * @static
         * @param {fs.IVersionedReadBytesRequestBody} message VersionedReadBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadBytesRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedReadBytesRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.VersionedReadBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.VersionedReadBytesRequestBody} VersionedReadBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadBytesRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedReadBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.start = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.end = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 10: {
                        message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedReadBytesRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.VersionedReadBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.VersionedReadBytesRequestBody} VersionedReadBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadBytesRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedReadBytesRequestBody message.
         * @function verify
         * @memberof fs.VersionedReadBytesRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedReadBytesRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.start != null && Object.hasOwnProperty.call(message, "start")) {
                var error = $root.common.UInt64Value.verify(message.start, long + 1);
                if (error)
                    return "start." + error;
            }
            if (message.end != null && Object.hasOwnProperty.call(message, "end")) {
                var error = $root.common.UInt64Value.verify(message.end, long + 1);
                if (error)
                    return "end." + error;
            }
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedReadBytesRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.VersionedReadBytesRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.VersionedReadBytesRequestBody} VersionedReadBytesRequestBody
         */
        VersionedReadBytesRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.VersionedReadBytesRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.VersionedReadBytesRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.VersionedReadBytesRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.start != null) {
                if (!$util.isObject(object.start))
                    throw TypeError(".fs.VersionedReadBytesRequestBody.start: object expected");
                message.start = $root.common.UInt64Value.fromObject(object.start, long + 1);
            }
            if (object.end != null) {
                if (!$util.isObject(object.end))
                    throw TypeError(".fs.VersionedReadBytesRequestBody.end: object expected");
                message.end = $root.common.UInt64Value.fromObject(object.end, long + 1);
            }
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.VersionedReadBytesRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedReadBytesRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.VersionedReadBytesRequestBody
         * @static
         * @param {fs.VersionedReadBytesRequestBody} message VersionedReadBytesRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedReadBytesRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.start = null;
                object.end = null;
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                object.start = $root.common.UInt64Value.toObject(message.start, options, q + 1);
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                object.end = $root.common.UInt64Value.toObject(message.end, options, q + 1);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedReadBytesRequestBody to JSON.
         * @function toJSON
         * @memberof fs.VersionedReadBytesRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedReadBytesRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedReadBytesRequestBody
         * @function getTypeUrl
         * @memberof fs.VersionedReadBytesRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedReadBytesRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.VersionedReadBytesRequestBody";
        };

        return VersionedReadBytesRequestBody;
    })();

    fs.UpdateXAttrsRequestBody = (function() {

        /**
         * Properties of an UpdateXAttrsRequestBody.
         * @memberof fs
         * @interface IUpdateXAttrsRequestBody
         * @property {string|null} [path] UpdateXAttrsRequestBody path
         * @property {file.IXAttrsChanges|null} [changes] UpdateXAttrsRequestBody changes
         */

        /**
         * Constructs a new UpdateXAttrsRequestBody.
         * @memberof fs
         * @classdesc Represents an UpdateXAttrsRequestBody.
         * @implements IUpdateXAttrsRequestBody
         * @constructor
         * @param {fs.IUpdateXAttrsRequestBody=} [properties] Properties to set
         */
        function UpdateXAttrsRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * UpdateXAttrsRequestBody path.
         * @member {string} path
         * @memberof fs.UpdateXAttrsRequestBody
         * @instance
         */
        UpdateXAttrsRequestBody.prototype.path = "";

        /**
         * UpdateXAttrsRequestBody changes.
         * @member {file.IXAttrsChanges|null|undefined} changes
         * @memberof fs.UpdateXAttrsRequestBody
         * @instance
         */
        UpdateXAttrsRequestBody.prototype.changes = null;

        /**
         * Creates a new UpdateXAttrsRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.UpdateXAttrsRequestBody
         * @static
         * @param {fs.IUpdateXAttrsRequestBody=} [properties] Properties to set
         * @returns {fs.UpdateXAttrsRequestBody} UpdateXAttrsRequestBody instance
         */
        UpdateXAttrsRequestBody.create = function create(properties) {
            return new UpdateXAttrsRequestBody(properties);
        };

        /**
         * Encodes the specified UpdateXAttrsRequestBody message. Does not implicitly {@link fs.UpdateXAttrsRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.UpdateXAttrsRequestBody
         * @static
         * @param {fs.IUpdateXAttrsRequestBody} message UpdateXAttrsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UpdateXAttrsRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.changes != null && Object.hasOwnProperty.call(message, "changes"))
                $root.file.XAttrsChanges.encode(message.changes, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified UpdateXAttrsRequestBody message, length delimited. Does not implicitly {@link fs.UpdateXAttrsRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.UpdateXAttrsRequestBody
         * @static
         * @param {fs.IUpdateXAttrsRequestBody} message UpdateXAttrsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UpdateXAttrsRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an UpdateXAttrsRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.UpdateXAttrsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.UpdateXAttrsRequestBody} UpdateXAttrsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UpdateXAttrsRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.UpdateXAttrsRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.changes = $root.file.XAttrsChanges.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an UpdateXAttrsRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.UpdateXAttrsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.UpdateXAttrsRequestBody} UpdateXAttrsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UpdateXAttrsRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an UpdateXAttrsRequestBody message.
         * @function verify
         * @memberof fs.UpdateXAttrsRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        UpdateXAttrsRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.changes != null && Object.hasOwnProperty.call(message, "changes")) {
                var error = $root.file.XAttrsChanges.verify(message.changes, long + 1);
                if (error)
                    return "changes." + error;
            }
            return null;
        };

        /**
         * Creates an UpdateXAttrsRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.UpdateXAttrsRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.UpdateXAttrsRequestBody} UpdateXAttrsRequestBody
         */
        UpdateXAttrsRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.UpdateXAttrsRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.UpdateXAttrsRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.UpdateXAttrsRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.changes != null) {
                if (!$util.isObject(object.changes))
                    throw TypeError(".fs.UpdateXAttrsRequestBody.changes: object expected");
                message.changes = $root.file.XAttrsChanges.fromObject(object.changes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an UpdateXAttrsRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.UpdateXAttrsRequestBody
         * @static
         * @param {fs.UpdateXAttrsRequestBody} message UpdateXAttrsRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        UpdateXAttrsRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.changes = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.changes != null && Object.hasOwnProperty.call(message, "changes"))
                object.changes = $root.file.XAttrsChanges.toObject(message.changes, options, q + 1);
            return object;
        };

        /**
         * Converts this UpdateXAttrsRequestBody to JSON.
         * @function toJSON
         * @memberof fs.UpdateXAttrsRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        UpdateXAttrsRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for UpdateXAttrsRequestBody
         * @function getTypeUrl
         * @memberof fs.UpdateXAttrsRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        UpdateXAttrsRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.UpdateXAttrsRequestBody";
        };

        return UpdateXAttrsRequestBody;
    })();

    fs.MakeFolderRequestBody = (function() {

        /**
         * Properties of a MakeFolderRequestBody.
         * @memberof fs
         * @interface IMakeFolderRequestBody
         * @property {string|null} [path] MakeFolderRequestBody path
         * @property {common.IBooleanValue|null} [exclusive] MakeFolderRequestBody exclusive
         */

        /**
         * Constructs a new MakeFolderRequestBody.
         * @memberof fs
         * @classdesc Represents a MakeFolderRequestBody.
         * @implements IMakeFolderRequestBody
         * @constructor
         * @param {fs.IMakeFolderRequestBody=} [properties] Properties to set
         */
        function MakeFolderRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * MakeFolderRequestBody path.
         * @member {string} path
         * @memberof fs.MakeFolderRequestBody
         * @instance
         */
        MakeFolderRequestBody.prototype.path = "";

        /**
         * MakeFolderRequestBody exclusive.
         * @member {common.IBooleanValue|null|undefined} exclusive
         * @memberof fs.MakeFolderRequestBody
         * @instance
         */
        MakeFolderRequestBody.prototype.exclusive = null;

        /**
         * Creates a new MakeFolderRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.MakeFolderRequestBody
         * @static
         * @param {fs.IMakeFolderRequestBody=} [properties] Properties to set
         * @returns {fs.MakeFolderRequestBody} MakeFolderRequestBody instance
         */
        MakeFolderRequestBody.create = function create(properties) {
            return new MakeFolderRequestBody(properties);
        };

        /**
         * Encodes the specified MakeFolderRequestBody message. Does not implicitly {@link fs.MakeFolderRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.MakeFolderRequestBody
         * @static
         * @param {fs.IMakeFolderRequestBody} message MakeFolderRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        MakeFolderRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive"))
                $root.common.BooleanValue.encode(message.exclusive, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified MakeFolderRequestBody message, length delimited. Does not implicitly {@link fs.MakeFolderRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.MakeFolderRequestBody
         * @static
         * @param {fs.IMakeFolderRequestBody} message MakeFolderRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        MakeFolderRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a MakeFolderRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.MakeFolderRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.MakeFolderRequestBody} MakeFolderRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        MakeFolderRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.MakeFolderRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.exclusive = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a MakeFolderRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.MakeFolderRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.MakeFolderRequestBody} MakeFolderRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        MakeFolderRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a MakeFolderRequestBody message.
         * @function verify
         * @memberof fs.MakeFolderRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        MakeFolderRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive")) {
                var error = $root.common.BooleanValue.verify(message.exclusive, long + 1);
                if (error)
                    return "exclusive." + error;
            }
            return null;
        };

        /**
         * Creates a MakeFolderRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.MakeFolderRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.MakeFolderRequestBody} MakeFolderRequestBody
         */
        MakeFolderRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.MakeFolderRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.MakeFolderRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.MakeFolderRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.exclusive != null) {
                if (!$util.isObject(object.exclusive))
                    throw TypeError(".fs.MakeFolderRequestBody.exclusive: object expected");
                message.exclusive = $root.common.BooleanValue.fromObject(object.exclusive, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a MakeFolderRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.MakeFolderRequestBody
         * @static
         * @param {fs.MakeFolderRequestBody} message MakeFolderRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        MakeFolderRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.exclusive = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive"))
                object.exclusive = $root.common.BooleanValue.toObject(message.exclusive, options, q + 1);
            return object;
        };

        /**
         * Converts this MakeFolderRequestBody to JSON.
         * @function toJSON
         * @memberof fs.MakeFolderRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        MakeFolderRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for MakeFolderRequestBody
         * @function getTypeUrl
         * @memberof fs.MakeFolderRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        MakeFolderRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.MakeFolderRequestBody";
        };

        return MakeFolderRequestBody;
    })();

    fs.DeleteFolderRequestBody = (function() {

        /**
         * Properties of a DeleteFolderRequestBody.
         * @memberof fs
         * @interface IDeleteFolderRequestBody
         * @property {string|null} [path] DeleteFolderRequestBody path
         * @property {common.IBooleanValue|null} [removeContent] DeleteFolderRequestBody removeContent
         */

        /**
         * Constructs a new DeleteFolderRequestBody.
         * @memberof fs
         * @classdesc Represents a DeleteFolderRequestBody.
         * @implements IDeleteFolderRequestBody
         * @constructor
         * @param {fs.IDeleteFolderRequestBody=} [properties] Properties to set
         */
        function DeleteFolderRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * DeleteFolderRequestBody path.
         * @member {string} path
         * @memberof fs.DeleteFolderRequestBody
         * @instance
         */
        DeleteFolderRequestBody.prototype.path = "";

        /**
         * DeleteFolderRequestBody removeContent.
         * @member {common.IBooleanValue|null|undefined} removeContent
         * @memberof fs.DeleteFolderRequestBody
         * @instance
         */
        DeleteFolderRequestBody.prototype.removeContent = null;

        /**
         * Creates a new DeleteFolderRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.DeleteFolderRequestBody
         * @static
         * @param {fs.IDeleteFolderRequestBody=} [properties] Properties to set
         * @returns {fs.DeleteFolderRequestBody} DeleteFolderRequestBody instance
         */
        DeleteFolderRequestBody.create = function create(properties) {
            return new DeleteFolderRequestBody(properties);
        };

        /**
         * Encodes the specified DeleteFolderRequestBody message. Does not implicitly {@link fs.DeleteFolderRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.DeleteFolderRequestBody
         * @static
         * @param {fs.IDeleteFolderRequestBody} message DeleteFolderRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DeleteFolderRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.removeContent != null && Object.hasOwnProperty.call(message, "removeContent"))
                $root.common.BooleanValue.encode(message.removeContent, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified DeleteFolderRequestBody message, length delimited. Does not implicitly {@link fs.DeleteFolderRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.DeleteFolderRequestBody
         * @static
         * @param {fs.IDeleteFolderRequestBody} message DeleteFolderRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DeleteFolderRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a DeleteFolderRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.DeleteFolderRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.DeleteFolderRequestBody} DeleteFolderRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DeleteFolderRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.DeleteFolderRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.removeContent = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a DeleteFolderRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.DeleteFolderRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.DeleteFolderRequestBody} DeleteFolderRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DeleteFolderRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a DeleteFolderRequestBody message.
         * @function verify
         * @memberof fs.DeleteFolderRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        DeleteFolderRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.removeContent != null && Object.hasOwnProperty.call(message, "removeContent")) {
                var error = $root.common.BooleanValue.verify(message.removeContent, long + 1);
                if (error)
                    return "removeContent." + error;
            }
            return null;
        };

        /**
         * Creates a DeleteFolderRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.DeleteFolderRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.DeleteFolderRequestBody} DeleteFolderRequestBody
         */
        DeleteFolderRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.DeleteFolderRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.DeleteFolderRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.DeleteFolderRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.removeContent != null) {
                if (!$util.isObject(object.removeContent))
                    throw TypeError(".fs.DeleteFolderRequestBody.removeContent: object expected");
                message.removeContent = $root.common.BooleanValue.fromObject(object.removeContent, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a DeleteFolderRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.DeleteFolderRequestBody
         * @static
         * @param {fs.DeleteFolderRequestBody} message DeleteFolderRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        DeleteFolderRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.removeContent = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.removeContent != null && Object.hasOwnProperty.call(message, "removeContent"))
                object.removeContent = $root.common.BooleanValue.toObject(message.removeContent, options, q + 1);
            return object;
        };

        /**
         * Converts this DeleteFolderRequestBody to JSON.
         * @function toJSON
         * @memberof fs.DeleteFolderRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        DeleteFolderRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for DeleteFolderRequestBody
         * @function getTypeUrl
         * @memberof fs.DeleteFolderRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        DeleteFolderRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.DeleteFolderRequestBody";
        };

        return DeleteFolderRequestBody;
    })();

    fs.MoveRequestBody = (function() {

        /**
         * Properties of a MoveRequestBody.
         * @memberof fs
         * @interface IMoveRequestBody
         * @property {string|null} [src] MoveRequestBody src
         * @property {string|null} [dst] MoveRequestBody dst
         */

        /**
         * Constructs a new MoveRequestBody.
         * @memberof fs
         * @classdesc Represents a MoveRequestBody.
         * @implements IMoveRequestBody
         * @constructor
         * @param {fs.IMoveRequestBody=} [properties] Properties to set
         */
        function MoveRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * MoveRequestBody src.
         * @member {string} src
         * @memberof fs.MoveRequestBody
         * @instance
         */
        MoveRequestBody.prototype.src = "";

        /**
         * MoveRequestBody dst.
         * @member {string} dst
         * @memberof fs.MoveRequestBody
         * @instance
         */
        MoveRequestBody.prototype.dst = "";

        /**
         * Creates a new MoveRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.MoveRequestBody
         * @static
         * @param {fs.IMoveRequestBody=} [properties] Properties to set
         * @returns {fs.MoveRequestBody} MoveRequestBody instance
         */
        MoveRequestBody.create = function create(properties) {
            return new MoveRequestBody(properties);
        };

        /**
         * Encodes the specified MoveRequestBody message. Does not implicitly {@link fs.MoveRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.MoveRequestBody
         * @static
         * @param {fs.IMoveRequestBody} message MoveRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        MoveRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.src);
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.dst);
            return writer;
        };

        /**
         * Encodes the specified MoveRequestBody message, length delimited. Does not implicitly {@link fs.MoveRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.MoveRequestBody
         * @static
         * @param {fs.IMoveRequestBody} message MoveRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        MoveRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a MoveRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.MoveRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.MoveRequestBody} MoveRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        MoveRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.MoveRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.src = reader.string();
                        break;
                    }
                case 2: {
                        message.dst = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a MoveRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.MoveRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.MoveRequestBody} MoveRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        MoveRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a MoveRequestBody message.
         * @function verify
         * @memberof fs.MoveRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        MoveRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                if (!$util.isString(message.src))
                    return "src: string expected";
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                if (!$util.isString(message.dst))
                    return "dst: string expected";
            return null;
        };

        /**
         * Creates a MoveRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.MoveRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.MoveRequestBody} MoveRequestBody
         */
        MoveRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.MoveRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.MoveRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.MoveRequestBody();
            if (object.src != null)
                message.src = String(object.src);
            if (object.dst != null)
                message.dst = String(object.dst);
            return message;
        };

        /**
         * Creates a plain object from a MoveRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.MoveRequestBody
         * @static
         * @param {fs.MoveRequestBody} message MoveRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        MoveRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.src = "";
                object.dst = "";
            }
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                object.src = message.src;
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                object.dst = message.dst;
            return object;
        };

        /**
         * Converts this MoveRequestBody to JSON.
         * @function toJSON
         * @memberof fs.MoveRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        MoveRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for MoveRequestBody
         * @function getTypeUrl
         * @memberof fs.MoveRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        MoveRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.MoveRequestBody";
        };

        return MoveRequestBody;
    })();

    fs.CopyFileRequestBody = (function() {

        /**
         * Properties of a CopyFileRequestBody.
         * @memberof fs
         * @interface ICopyFileRequestBody
         * @property {string|null} [src] CopyFileRequestBody src
         * @property {string|null} [dst] CopyFileRequestBody dst
         * @property {common.IBooleanValue|null} [overwrite] CopyFileRequestBody overwrite
         */

        /**
         * Constructs a new CopyFileRequestBody.
         * @memberof fs
         * @classdesc Represents a CopyFileRequestBody.
         * @implements ICopyFileRequestBody
         * @constructor
         * @param {fs.ICopyFileRequestBody=} [properties] Properties to set
         */
        function CopyFileRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * CopyFileRequestBody src.
         * @member {string} src
         * @memberof fs.CopyFileRequestBody
         * @instance
         */
        CopyFileRequestBody.prototype.src = "";

        /**
         * CopyFileRequestBody dst.
         * @member {string} dst
         * @memberof fs.CopyFileRequestBody
         * @instance
         */
        CopyFileRequestBody.prototype.dst = "";

        /**
         * CopyFileRequestBody overwrite.
         * @member {common.IBooleanValue|null|undefined} overwrite
         * @memberof fs.CopyFileRequestBody
         * @instance
         */
        CopyFileRequestBody.prototype.overwrite = null;

        /**
         * Creates a new CopyFileRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.CopyFileRequestBody
         * @static
         * @param {fs.ICopyFileRequestBody=} [properties] Properties to set
         * @returns {fs.CopyFileRequestBody} CopyFileRequestBody instance
         */
        CopyFileRequestBody.create = function create(properties) {
            return new CopyFileRequestBody(properties);
        };

        /**
         * Encodes the specified CopyFileRequestBody message. Does not implicitly {@link fs.CopyFileRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.CopyFileRequestBody
         * @static
         * @param {fs.ICopyFileRequestBody} message CopyFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CopyFileRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.src);
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.dst);
            if (message.overwrite != null && Object.hasOwnProperty.call(message, "overwrite"))
                $root.common.BooleanValue.encode(message.overwrite, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified CopyFileRequestBody message, length delimited. Does not implicitly {@link fs.CopyFileRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.CopyFileRequestBody
         * @static
         * @param {fs.ICopyFileRequestBody} message CopyFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CopyFileRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a CopyFileRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.CopyFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.CopyFileRequestBody} CopyFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CopyFileRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.CopyFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.src = reader.string();
                        break;
                    }
                case 2: {
                        message.dst = reader.string();
                        break;
                    }
                case 3: {
                        message.overwrite = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a CopyFileRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.CopyFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.CopyFileRequestBody} CopyFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CopyFileRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a CopyFileRequestBody message.
         * @function verify
         * @memberof fs.CopyFileRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        CopyFileRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                if (!$util.isString(message.src))
                    return "src: string expected";
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                if (!$util.isString(message.dst))
                    return "dst: string expected";
            if (message.overwrite != null && Object.hasOwnProperty.call(message, "overwrite")) {
                var error = $root.common.BooleanValue.verify(message.overwrite, long + 1);
                if (error)
                    return "overwrite." + error;
            }
            return null;
        };

        /**
         * Creates a CopyFileRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.CopyFileRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.CopyFileRequestBody} CopyFileRequestBody
         */
        CopyFileRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.CopyFileRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.CopyFileRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.CopyFileRequestBody();
            if (object.src != null)
                message.src = String(object.src);
            if (object.dst != null)
                message.dst = String(object.dst);
            if (object.overwrite != null) {
                if (!$util.isObject(object.overwrite))
                    throw TypeError(".fs.CopyFileRequestBody.overwrite: object expected");
                message.overwrite = $root.common.BooleanValue.fromObject(object.overwrite, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a CopyFileRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.CopyFileRequestBody
         * @static
         * @param {fs.CopyFileRequestBody} message CopyFileRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        CopyFileRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.src = "";
                object.dst = "";
                object.overwrite = null;
            }
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                object.src = message.src;
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                object.dst = message.dst;
            if (message.overwrite != null && Object.hasOwnProperty.call(message, "overwrite"))
                object.overwrite = $root.common.BooleanValue.toObject(message.overwrite, options, q + 1);
            return object;
        };

        /**
         * Converts this CopyFileRequestBody to JSON.
         * @function toJSON
         * @memberof fs.CopyFileRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        CopyFileRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for CopyFileRequestBody
         * @function getTypeUrl
         * @memberof fs.CopyFileRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        CopyFileRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.CopyFileRequestBody";
        };

        return CopyFileRequestBody;
    })();

    fs.CopyFolderRequestBody = (function() {

        /**
         * Properties of a CopyFolderRequestBody.
         * @memberof fs
         * @interface ICopyFolderRequestBody
         * @property {string|null} [src] CopyFolderRequestBody src
         * @property {string|null} [dst] CopyFolderRequestBody dst
         * @property {common.IBooleanValue|null} [mergeAndOverwrite] CopyFolderRequestBody mergeAndOverwrite
         */

        /**
         * Constructs a new CopyFolderRequestBody.
         * @memberof fs
         * @classdesc Represents a CopyFolderRequestBody.
         * @implements ICopyFolderRequestBody
         * @constructor
         * @param {fs.ICopyFolderRequestBody=} [properties] Properties to set
         */
        function CopyFolderRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * CopyFolderRequestBody src.
         * @member {string} src
         * @memberof fs.CopyFolderRequestBody
         * @instance
         */
        CopyFolderRequestBody.prototype.src = "";

        /**
         * CopyFolderRequestBody dst.
         * @member {string} dst
         * @memberof fs.CopyFolderRequestBody
         * @instance
         */
        CopyFolderRequestBody.prototype.dst = "";

        /**
         * CopyFolderRequestBody mergeAndOverwrite.
         * @member {common.IBooleanValue|null|undefined} mergeAndOverwrite
         * @memberof fs.CopyFolderRequestBody
         * @instance
         */
        CopyFolderRequestBody.prototype.mergeAndOverwrite = null;

        /**
         * Creates a new CopyFolderRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.CopyFolderRequestBody
         * @static
         * @param {fs.ICopyFolderRequestBody=} [properties] Properties to set
         * @returns {fs.CopyFolderRequestBody} CopyFolderRequestBody instance
         */
        CopyFolderRequestBody.create = function create(properties) {
            return new CopyFolderRequestBody(properties);
        };

        /**
         * Encodes the specified CopyFolderRequestBody message. Does not implicitly {@link fs.CopyFolderRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.CopyFolderRequestBody
         * @static
         * @param {fs.ICopyFolderRequestBody} message CopyFolderRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CopyFolderRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.src);
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.dst);
            if (message.mergeAndOverwrite != null && Object.hasOwnProperty.call(message, "mergeAndOverwrite"))
                $root.common.BooleanValue.encode(message.mergeAndOverwrite, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified CopyFolderRequestBody message, length delimited. Does not implicitly {@link fs.CopyFolderRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.CopyFolderRequestBody
         * @static
         * @param {fs.ICopyFolderRequestBody} message CopyFolderRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CopyFolderRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a CopyFolderRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.CopyFolderRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.CopyFolderRequestBody} CopyFolderRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CopyFolderRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.CopyFolderRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.src = reader.string();
                        break;
                    }
                case 2: {
                        message.dst = reader.string();
                        break;
                    }
                case 3: {
                        message.mergeAndOverwrite = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a CopyFolderRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.CopyFolderRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.CopyFolderRequestBody} CopyFolderRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CopyFolderRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a CopyFolderRequestBody message.
         * @function verify
         * @memberof fs.CopyFolderRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        CopyFolderRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                if (!$util.isString(message.src))
                    return "src: string expected";
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                if (!$util.isString(message.dst))
                    return "dst: string expected";
            if (message.mergeAndOverwrite != null && Object.hasOwnProperty.call(message, "mergeAndOverwrite")) {
                var error = $root.common.BooleanValue.verify(message.mergeAndOverwrite, long + 1);
                if (error)
                    return "mergeAndOverwrite." + error;
            }
            return null;
        };

        /**
         * Creates a CopyFolderRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.CopyFolderRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.CopyFolderRequestBody} CopyFolderRequestBody
         */
        CopyFolderRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.CopyFolderRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.CopyFolderRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.CopyFolderRequestBody();
            if (object.src != null)
                message.src = String(object.src);
            if (object.dst != null)
                message.dst = String(object.dst);
            if (object.mergeAndOverwrite != null) {
                if (!$util.isObject(object.mergeAndOverwrite))
                    throw TypeError(".fs.CopyFolderRequestBody.mergeAndOverwrite: object expected");
                message.mergeAndOverwrite = $root.common.BooleanValue.fromObject(object.mergeAndOverwrite, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a CopyFolderRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.CopyFolderRequestBody
         * @static
         * @param {fs.CopyFolderRequestBody} message CopyFolderRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        CopyFolderRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.src = "";
                object.dst = "";
                object.mergeAndOverwrite = null;
            }
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                object.src = message.src;
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                object.dst = message.dst;
            if (message.mergeAndOverwrite != null && Object.hasOwnProperty.call(message, "mergeAndOverwrite"))
                object.mergeAndOverwrite = $root.common.BooleanValue.toObject(message.mergeAndOverwrite, options, q + 1);
            return object;
        };

        /**
         * Converts this CopyFolderRequestBody to JSON.
         * @function toJSON
         * @memberof fs.CopyFolderRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        CopyFolderRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for CopyFolderRequestBody
         * @function getTypeUrl
         * @memberof fs.CopyFolderRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        CopyFolderRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.CopyFolderRequestBody";
        };

        return CopyFolderRequestBody;
    })();

    fs.SaveFileRequestBody = (function() {

        /**
         * Properties of a SaveFileRequestBody.
         * @memberof fs
         * @interface ISaveFileRequestBody
         * @property {common.IObjectReference|null} [file] SaveFileRequestBody file
         * @property {string|null} [dst] SaveFileRequestBody dst
         * @property {common.IBooleanValue|null} [overwrite] SaveFileRequestBody overwrite
         */

        /**
         * Constructs a new SaveFileRequestBody.
         * @memberof fs
         * @classdesc Represents a SaveFileRequestBody.
         * @implements ISaveFileRequestBody
         * @constructor
         * @param {fs.ISaveFileRequestBody=} [properties] Properties to set
         */
        function SaveFileRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * SaveFileRequestBody file.
         * @member {common.IObjectReference|null|undefined} file
         * @memberof fs.SaveFileRequestBody
         * @instance
         */
        SaveFileRequestBody.prototype.file = null;

        /**
         * SaveFileRequestBody dst.
         * @member {string} dst
         * @memberof fs.SaveFileRequestBody
         * @instance
         */
        SaveFileRequestBody.prototype.dst = "";

        /**
         * SaveFileRequestBody overwrite.
         * @member {common.IBooleanValue|null|undefined} overwrite
         * @memberof fs.SaveFileRequestBody
         * @instance
         */
        SaveFileRequestBody.prototype.overwrite = null;

        /**
         * Creates a new SaveFileRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.SaveFileRequestBody
         * @static
         * @param {fs.ISaveFileRequestBody=} [properties] Properties to set
         * @returns {fs.SaveFileRequestBody} SaveFileRequestBody instance
         */
        SaveFileRequestBody.create = function create(properties) {
            return new SaveFileRequestBody(properties);
        };

        /**
         * Encodes the specified SaveFileRequestBody message. Does not implicitly {@link fs.SaveFileRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.SaveFileRequestBody
         * @static
         * @param {fs.ISaveFileRequestBody} message SaveFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SaveFileRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                $root.common.ObjectReference.encode(message.file, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.dst);
            if (message.overwrite != null && Object.hasOwnProperty.call(message, "overwrite"))
                $root.common.BooleanValue.encode(message.overwrite, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified SaveFileRequestBody message, length delimited. Does not implicitly {@link fs.SaveFileRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.SaveFileRequestBody
         * @static
         * @param {fs.ISaveFileRequestBody} message SaveFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SaveFileRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a SaveFileRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.SaveFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.SaveFileRequestBody} SaveFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SaveFileRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SaveFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.file = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.dst = reader.string();
                        break;
                    }
                case 3: {
                        message.overwrite = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a SaveFileRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.SaveFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.SaveFileRequestBody} SaveFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SaveFileRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a SaveFileRequestBody message.
         * @function verify
         * @memberof fs.SaveFileRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        SaveFileRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.file != null && Object.hasOwnProperty.call(message, "file")) {
                var error = $root.common.ObjectReference.verify(message.file, long + 1);
                if (error)
                    return "file." + error;
            }
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                if (!$util.isString(message.dst))
                    return "dst: string expected";
            if (message.overwrite != null && Object.hasOwnProperty.call(message, "overwrite")) {
                var error = $root.common.BooleanValue.verify(message.overwrite, long + 1);
                if (error)
                    return "overwrite." + error;
            }
            return null;
        };

        /**
         * Creates a SaveFileRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.SaveFileRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.SaveFileRequestBody} SaveFileRequestBody
         */
        SaveFileRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.SaveFileRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.SaveFileRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.SaveFileRequestBody();
            if (object.file != null) {
                if (!$util.isObject(object.file))
                    throw TypeError(".fs.SaveFileRequestBody.file: object expected");
                message.file = $root.common.ObjectReference.fromObject(object.file, long + 1);
            }
            if (object.dst != null)
                message.dst = String(object.dst);
            if (object.overwrite != null) {
                if (!$util.isObject(object.overwrite))
                    throw TypeError(".fs.SaveFileRequestBody.overwrite: object expected");
                message.overwrite = $root.common.BooleanValue.fromObject(object.overwrite, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a SaveFileRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.SaveFileRequestBody
         * @static
         * @param {fs.SaveFileRequestBody} message SaveFileRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        SaveFileRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.file = null;
                object.dst = "";
                object.overwrite = null;
            }
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                object.file = $root.common.ObjectReference.toObject(message.file, options, q + 1);
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                object.dst = message.dst;
            if (message.overwrite != null && Object.hasOwnProperty.call(message, "overwrite"))
                object.overwrite = $root.common.BooleanValue.toObject(message.overwrite, options, q + 1);
            return object;
        };

        /**
         * Converts this SaveFileRequestBody to JSON.
         * @function toJSON
         * @memberof fs.SaveFileRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        SaveFileRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for SaveFileRequestBody
         * @function getTypeUrl
         * @memberof fs.SaveFileRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        SaveFileRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.SaveFileRequestBody";
        };

        return SaveFileRequestBody;
    })();

    fs.SaveFolderRequestBody = (function() {

        /**
         * Properties of a SaveFolderRequestBody.
         * @memberof fs
         * @interface ISaveFolderRequestBody
         * @property {common.IObjectReference|null} [folder] SaveFolderRequestBody folder
         * @property {string|null} [dst] SaveFolderRequestBody dst
         * @property {common.IBooleanValue|null} [mergeAndOverwrite] SaveFolderRequestBody mergeAndOverwrite
         */

        /**
         * Constructs a new SaveFolderRequestBody.
         * @memberof fs
         * @classdesc Represents a SaveFolderRequestBody.
         * @implements ISaveFolderRequestBody
         * @constructor
         * @param {fs.ISaveFolderRequestBody=} [properties] Properties to set
         */
        function SaveFolderRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * SaveFolderRequestBody folder.
         * @member {common.IObjectReference|null|undefined} folder
         * @memberof fs.SaveFolderRequestBody
         * @instance
         */
        SaveFolderRequestBody.prototype.folder = null;

        /**
         * SaveFolderRequestBody dst.
         * @member {string} dst
         * @memberof fs.SaveFolderRequestBody
         * @instance
         */
        SaveFolderRequestBody.prototype.dst = "";

        /**
         * SaveFolderRequestBody mergeAndOverwrite.
         * @member {common.IBooleanValue|null|undefined} mergeAndOverwrite
         * @memberof fs.SaveFolderRequestBody
         * @instance
         */
        SaveFolderRequestBody.prototype.mergeAndOverwrite = null;

        /**
         * Creates a new SaveFolderRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.SaveFolderRequestBody
         * @static
         * @param {fs.ISaveFolderRequestBody=} [properties] Properties to set
         * @returns {fs.SaveFolderRequestBody} SaveFolderRequestBody instance
         */
        SaveFolderRequestBody.create = function create(properties) {
            return new SaveFolderRequestBody(properties);
        };

        /**
         * Encodes the specified SaveFolderRequestBody message. Does not implicitly {@link fs.SaveFolderRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.SaveFolderRequestBody
         * @static
         * @param {fs.ISaveFolderRequestBody} message SaveFolderRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SaveFolderRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.folder != null && Object.hasOwnProperty.call(message, "folder"))
                $root.common.ObjectReference.encode(message.folder, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.dst);
            if (message.mergeAndOverwrite != null && Object.hasOwnProperty.call(message, "mergeAndOverwrite"))
                $root.common.BooleanValue.encode(message.mergeAndOverwrite, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified SaveFolderRequestBody message, length delimited. Does not implicitly {@link fs.SaveFolderRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.SaveFolderRequestBody
         * @static
         * @param {fs.ISaveFolderRequestBody} message SaveFolderRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SaveFolderRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a SaveFolderRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.SaveFolderRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.SaveFolderRequestBody} SaveFolderRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SaveFolderRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SaveFolderRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.folder = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.dst = reader.string();
                        break;
                    }
                case 3: {
                        message.mergeAndOverwrite = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a SaveFolderRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.SaveFolderRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.SaveFolderRequestBody} SaveFolderRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SaveFolderRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a SaveFolderRequestBody message.
         * @function verify
         * @memberof fs.SaveFolderRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        SaveFolderRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.folder != null && Object.hasOwnProperty.call(message, "folder")) {
                var error = $root.common.ObjectReference.verify(message.folder, long + 1);
                if (error)
                    return "folder." + error;
            }
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                if (!$util.isString(message.dst))
                    return "dst: string expected";
            if (message.mergeAndOverwrite != null && Object.hasOwnProperty.call(message, "mergeAndOverwrite")) {
                var error = $root.common.BooleanValue.verify(message.mergeAndOverwrite, long + 1);
                if (error)
                    return "mergeAndOverwrite." + error;
            }
            return null;
        };

        /**
         * Creates a SaveFolderRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.SaveFolderRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.SaveFolderRequestBody} SaveFolderRequestBody
         */
        SaveFolderRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.SaveFolderRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.SaveFolderRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.SaveFolderRequestBody();
            if (object.folder != null) {
                if (!$util.isObject(object.folder))
                    throw TypeError(".fs.SaveFolderRequestBody.folder: object expected");
                message.folder = $root.common.ObjectReference.fromObject(object.folder, long + 1);
            }
            if (object.dst != null)
                message.dst = String(object.dst);
            if (object.mergeAndOverwrite != null) {
                if (!$util.isObject(object.mergeAndOverwrite))
                    throw TypeError(".fs.SaveFolderRequestBody.mergeAndOverwrite: object expected");
                message.mergeAndOverwrite = $root.common.BooleanValue.fromObject(object.mergeAndOverwrite, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a SaveFolderRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.SaveFolderRequestBody
         * @static
         * @param {fs.SaveFolderRequestBody} message SaveFolderRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        SaveFolderRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.folder = null;
                object.dst = "";
                object.mergeAndOverwrite = null;
            }
            if (message.folder != null && Object.hasOwnProperty.call(message, "folder"))
                object.folder = $root.common.ObjectReference.toObject(message.folder, options, q + 1);
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                object.dst = message.dst;
            if (message.mergeAndOverwrite != null && Object.hasOwnProperty.call(message, "mergeAndOverwrite"))
                object.mergeAndOverwrite = $root.common.BooleanValue.toObject(message.mergeAndOverwrite, options, q + 1);
            return object;
        };

        /**
         * Converts this SaveFolderRequestBody to JSON.
         * @function toJSON
         * @memberof fs.SaveFolderRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        SaveFolderRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for SaveFolderRequestBody
         * @function getTypeUrl
         * @memberof fs.SaveFolderRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        SaveFolderRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.SaveFolderRequestBody";
        };

        return SaveFolderRequestBody;
    })();

    fs.LinkRequestBody = (function() {

        /**
         * Properties of a LinkRequestBody.
         * @memberof fs
         * @interface ILinkRequestBody
         * @property {string|null} [path] LinkRequestBody path
         * @property {common.IObjectReference|null} [target] LinkRequestBody target
         */

        /**
         * Constructs a new LinkRequestBody.
         * @memberof fs
         * @classdesc Represents a LinkRequestBody.
         * @implements ILinkRequestBody
         * @constructor
         * @param {fs.ILinkRequestBody=} [properties] Properties to set
         */
        function LinkRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * LinkRequestBody path.
         * @member {string} path
         * @memberof fs.LinkRequestBody
         * @instance
         */
        LinkRequestBody.prototype.path = "";

        /**
         * LinkRequestBody target.
         * @member {common.IObjectReference|null|undefined} target
         * @memberof fs.LinkRequestBody
         * @instance
         */
        LinkRequestBody.prototype.target = null;

        /**
         * Creates a new LinkRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.LinkRequestBody
         * @static
         * @param {fs.ILinkRequestBody=} [properties] Properties to set
         * @returns {fs.LinkRequestBody} LinkRequestBody instance
         */
        LinkRequestBody.create = function create(properties) {
            return new LinkRequestBody(properties);
        };

        /**
         * Encodes the specified LinkRequestBody message. Does not implicitly {@link fs.LinkRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.LinkRequestBody
         * @static
         * @param {fs.ILinkRequestBody} message LinkRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        LinkRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.target != null && Object.hasOwnProperty.call(message, "target"))
                $root.common.ObjectReference.encode(message.target, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified LinkRequestBody message, length delimited. Does not implicitly {@link fs.LinkRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.LinkRequestBody
         * @static
         * @param {fs.ILinkRequestBody} message LinkRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        LinkRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a LinkRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.LinkRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.LinkRequestBody} LinkRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        LinkRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.LinkRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.target = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a LinkRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.LinkRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.LinkRequestBody} LinkRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        LinkRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a LinkRequestBody message.
         * @function verify
         * @memberof fs.LinkRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        LinkRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.target != null && Object.hasOwnProperty.call(message, "target")) {
                var error = $root.common.ObjectReference.verify(message.target, long + 1);
                if (error)
                    return "target." + error;
            }
            return null;
        };

        /**
         * Creates a LinkRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.LinkRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.LinkRequestBody} LinkRequestBody
         */
        LinkRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.LinkRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.LinkRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.LinkRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.target != null) {
                if (!$util.isObject(object.target))
                    throw TypeError(".fs.LinkRequestBody.target: object expected");
                message.target = $root.common.ObjectReference.fromObject(object.target, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a LinkRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.LinkRequestBody
         * @static
         * @param {fs.LinkRequestBody} message LinkRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        LinkRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.target = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.target != null && Object.hasOwnProperty.call(message, "target"))
                object.target = $root.common.ObjectReference.toObject(message.target, options, q + 1);
            return object;
        };

        /**
         * Converts this LinkRequestBody to JSON.
         * @function toJSON
         * @memberof fs.LinkRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        LinkRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for LinkRequestBody
         * @function getTypeUrl
         * @memberof fs.LinkRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        LinkRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.LinkRequestBody";
        };

        return LinkRequestBody;
    })();

    fs.PathAndOptFileFlags = (function() {

        /**
         * Properties of a PathAndOptFileFlags.
         * @memberof fs
         * @interface IPathAndOptFileFlags
         * @property {string|null} [path] PathAndOptFileFlags path
         * @property {fs.IFileFlags|null} [flags] PathAndOptFileFlags flags
         */

        /**
         * Constructs a new PathAndOptFileFlags.
         * @memberof fs
         * @classdesc Represents a PathAndOptFileFlags.
         * @implements IPathAndOptFileFlags
         * @constructor
         * @param {fs.IPathAndOptFileFlags=} [properties] Properties to set
         */
        function PathAndOptFileFlags(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * PathAndOptFileFlags path.
         * @member {string} path
         * @memberof fs.PathAndOptFileFlags
         * @instance
         */
        PathAndOptFileFlags.prototype.path = "";

        /**
         * PathAndOptFileFlags flags.
         * @member {fs.IFileFlags|null|undefined} flags
         * @memberof fs.PathAndOptFileFlags
         * @instance
         */
        PathAndOptFileFlags.prototype.flags = null;

        /**
         * Creates a new PathAndOptFileFlags instance using the specified properties.
         * @function create
         * @memberof fs.PathAndOptFileFlags
         * @static
         * @param {fs.IPathAndOptFileFlags=} [properties] Properties to set
         * @returns {fs.PathAndOptFileFlags} PathAndOptFileFlags instance
         */
        PathAndOptFileFlags.create = function create(properties) {
            return new PathAndOptFileFlags(properties);
        };

        /**
         * Encodes the specified PathAndOptFileFlags message. Does not implicitly {@link fs.PathAndOptFileFlags.verify|verify} messages.
         * @function encode
         * @memberof fs.PathAndOptFileFlags
         * @static
         * @param {fs.IPathAndOptFileFlags} message PathAndOptFileFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        PathAndOptFileFlags.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.fs.FileFlags.encode(message.flags, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified PathAndOptFileFlags message, length delimited. Does not implicitly {@link fs.PathAndOptFileFlags.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.PathAndOptFileFlags
         * @static
         * @param {fs.IPathAndOptFileFlags} message PathAndOptFileFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        PathAndOptFileFlags.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a PathAndOptFileFlags message from the specified reader or buffer.
         * @function decode
         * @memberof fs.PathAndOptFileFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.PathAndOptFileFlags} PathAndOptFileFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        PathAndOptFileFlags.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.PathAndOptFileFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.flags = $root.fs.FileFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a PathAndOptFileFlags message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.PathAndOptFileFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.PathAndOptFileFlags} PathAndOptFileFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        PathAndOptFileFlags.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a PathAndOptFileFlags message.
         * @function verify
         * @memberof fs.PathAndOptFileFlags
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        PathAndOptFileFlags.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.fs.FileFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a PathAndOptFileFlags message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.PathAndOptFileFlags
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.PathAndOptFileFlags} PathAndOptFileFlags
         */
        PathAndOptFileFlags.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.PathAndOptFileFlags)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.PathAndOptFileFlags: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.PathAndOptFileFlags();
            if (object.path != null)
                message.path = String(object.path);
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.PathAndOptFileFlags.flags: object expected");
                message.flags = $root.fs.FileFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a PathAndOptFileFlags message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.PathAndOptFileFlags
         * @static
         * @param {fs.PathAndOptFileFlags} message PathAndOptFileFlags
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        PathAndOptFileFlags.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.fs.FileFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this PathAndOptFileFlags to JSON.
         * @function toJSON
         * @memberof fs.PathAndOptFileFlags
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        PathAndOptFileFlags.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for PathAndOptFileFlags
         * @function getTypeUrl
         * @memberof fs.PathAndOptFileFlags
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        PathAndOptFileFlags.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.PathAndOptFileFlags";
        };

        return PathAndOptFileFlags;
    })();

    fs.FileFlags = (function() {

        /**
         * Properties of a FileFlags.
         * @memberof fs
         * @interface IFileFlags
         * @property {common.IBooleanValue|null} [truncate] FileFlags truncate
         * @property {common.IBooleanValue|null} [create] FileFlags create
         * @property {common.IBooleanValue|null} [exclusive] FileFlags exclusive
         */

        /**
         * Constructs a new FileFlags.
         * @memberof fs
         * @classdesc Represents a FileFlags.
         * @implements IFileFlags
         * @constructor
         * @param {fs.IFileFlags=} [properties] Properties to set
         */
        function FileFlags(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileFlags truncate.
         * @member {common.IBooleanValue|null|undefined} truncate
         * @memberof fs.FileFlags
         * @instance
         */
        FileFlags.prototype.truncate = null;

        /**
         * FileFlags create.
         * @member {common.IBooleanValue|null|undefined} create
         * @memberof fs.FileFlags
         * @instance
         */
        FileFlags.prototype.create = null;

        /**
         * FileFlags exclusive.
         * @member {common.IBooleanValue|null|undefined} exclusive
         * @memberof fs.FileFlags
         * @instance
         */
        FileFlags.prototype.exclusive = null;

        /**
         * Creates a new FileFlags instance using the specified properties.
         * @function create
         * @memberof fs.FileFlags
         * @static
         * @param {fs.IFileFlags=} [properties] Properties to set
         * @returns {fs.FileFlags} FileFlags instance
         */
        FileFlags.create = function create(properties) {
            return new FileFlags(properties);
        };

        /**
         * Encodes the specified FileFlags message. Does not implicitly {@link fs.FileFlags.verify|verify} messages.
         * @function encode
         * @memberof fs.FileFlags
         * @static
         * @param {fs.IFileFlags} message FileFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileFlags.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.truncate != null && Object.hasOwnProperty.call(message, "truncate"))
                $root.common.BooleanValue.encode(message.truncate, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.create != null && Object.hasOwnProperty.call(message, "create"))
                $root.common.BooleanValue.encode(message.create, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive"))
                $root.common.BooleanValue.encode(message.exclusive, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FileFlags message, length delimited. Does not implicitly {@link fs.FileFlags.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FileFlags
         * @static
         * @param {fs.IFileFlags} message FileFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileFlags.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileFlags message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FileFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FileFlags} FileFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileFlags.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FileFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.truncate = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.create = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.exclusive = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileFlags message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FileFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FileFlags} FileFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileFlags.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileFlags message.
         * @function verify
         * @memberof fs.FileFlags
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileFlags.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.truncate != null && Object.hasOwnProperty.call(message, "truncate")) {
                var error = $root.common.BooleanValue.verify(message.truncate, long + 1);
                if (error)
                    return "truncate." + error;
            }
            if (message.create != null && Object.hasOwnProperty.call(message, "create")) {
                var error = $root.common.BooleanValue.verify(message.create, long + 1);
                if (error)
                    return "create." + error;
            }
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive")) {
                var error = $root.common.BooleanValue.verify(message.exclusive, long + 1);
                if (error)
                    return "exclusive." + error;
            }
            return null;
        };

        /**
         * Creates a FileFlags message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FileFlags
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FileFlags} FileFlags
         */
        FileFlags.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FileFlags)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FileFlags: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FileFlags();
            if (object.truncate != null) {
                if (!$util.isObject(object.truncate))
                    throw TypeError(".fs.FileFlags.truncate: object expected");
                message.truncate = $root.common.BooleanValue.fromObject(object.truncate, long + 1);
            }
            if (object.create != null) {
                if (!$util.isObject(object.create))
                    throw TypeError(".fs.FileFlags.create: object expected");
                message.create = $root.common.BooleanValue.fromObject(object.create, long + 1);
            }
            if (object.exclusive != null) {
                if (!$util.isObject(object.exclusive))
                    throw TypeError(".fs.FileFlags.exclusive: object expected");
                message.exclusive = $root.common.BooleanValue.fromObject(object.exclusive, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a FileFlags message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FileFlags
         * @static
         * @param {fs.FileFlags} message FileFlags
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileFlags.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.truncate = null;
                object.create = null;
                object.exclusive = null;
            }
            if (message.truncate != null && Object.hasOwnProperty.call(message, "truncate"))
                object.truncate = $root.common.BooleanValue.toObject(message.truncate, options, q + 1);
            if (message.create != null && Object.hasOwnProperty.call(message, "create"))
                object.create = $root.common.BooleanValue.toObject(message.create, options, q + 1);
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive"))
                object.exclusive = $root.common.BooleanValue.toObject(message.exclusive, options, q + 1);
            return object;
        };

        /**
         * Converts this FileFlags to JSON.
         * @function toJSON
         * @memberof fs.FileFlags
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileFlags.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileFlags
         * @function getTypeUrl
         * @memberof fs.FileFlags
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileFlags.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FileFlags";
        };

        return FileFlags;
    })();

    fs.WriteJsonFileRequestBody = (function() {

        /**
         * Properties of a WriteJsonFileRequestBody.
         * @memberof fs
         * @interface IWriteJsonFileRequestBody
         * @property {string|null} [path] WriteJsonFileRequestBody path
         * @property {string|null} [json] WriteJsonFileRequestBody json
         * @property {fs.IFileFlags|null} [flags] WriteJsonFileRequestBody flags
         */

        /**
         * Constructs a new WriteJsonFileRequestBody.
         * @memberof fs
         * @classdesc Represents a WriteJsonFileRequestBody.
         * @implements IWriteJsonFileRequestBody
         * @constructor
         * @param {fs.IWriteJsonFileRequestBody=} [properties] Properties to set
         */
        function WriteJsonFileRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * WriteJsonFileRequestBody path.
         * @member {string} path
         * @memberof fs.WriteJsonFileRequestBody
         * @instance
         */
        WriteJsonFileRequestBody.prototype.path = "";

        /**
         * WriteJsonFileRequestBody json.
         * @member {string} json
         * @memberof fs.WriteJsonFileRequestBody
         * @instance
         */
        WriteJsonFileRequestBody.prototype.json = "";

        /**
         * WriteJsonFileRequestBody flags.
         * @member {fs.IFileFlags|null|undefined} flags
         * @memberof fs.WriteJsonFileRequestBody
         * @instance
         */
        WriteJsonFileRequestBody.prototype.flags = null;

        /**
         * Creates a new WriteJsonFileRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.WriteJsonFileRequestBody
         * @static
         * @param {fs.IWriteJsonFileRequestBody=} [properties] Properties to set
         * @returns {fs.WriteJsonFileRequestBody} WriteJsonFileRequestBody instance
         */
        WriteJsonFileRequestBody.create = function create(properties) {
            return new WriteJsonFileRequestBody(properties);
        };

        /**
         * Encodes the specified WriteJsonFileRequestBody message. Does not implicitly {@link fs.WriteJsonFileRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.WriteJsonFileRequestBody
         * @static
         * @param {fs.IWriteJsonFileRequestBody} message WriteJsonFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteJsonFileRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.json);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.fs.FileFlags.encode(message.flags, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified WriteJsonFileRequestBody message, length delimited. Does not implicitly {@link fs.WriteJsonFileRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.WriteJsonFileRequestBody
         * @static
         * @param {fs.IWriteJsonFileRequestBody} message WriteJsonFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteJsonFileRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a WriteJsonFileRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.WriteJsonFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.WriteJsonFileRequestBody} WriteJsonFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteJsonFileRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.WriteJsonFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.json = reader.string();
                        break;
                    }
                case 3: {
                        message.flags = $root.fs.FileFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a WriteJsonFileRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.WriteJsonFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.WriteJsonFileRequestBody} WriteJsonFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteJsonFileRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a WriteJsonFileRequestBody message.
         * @function verify
         * @memberof fs.WriteJsonFileRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        WriteJsonFileRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                if (!$util.isString(message.json))
                    return "json: string expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.fs.FileFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a WriteJsonFileRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.WriteJsonFileRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.WriteJsonFileRequestBody} WriteJsonFileRequestBody
         */
        WriteJsonFileRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.WriteJsonFileRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.WriteJsonFileRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.WriteJsonFileRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.json != null)
                message.json = String(object.json);
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.WriteJsonFileRequestBody.flags: object expected");
                message.flags = $root.fs.FileFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a WriteJsonFileRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.WriteJsonFileRequestBody
         * @static
         * @param {fs.WriteJsonFileRequestBody} message WriteJsonFileRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        WriteJsonFileRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.json = "";
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = message.json;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.fs.FileFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this WriteJsonFileRequestBody to JSON.
         * @function toJSON
         * @memberof fs.WriteJsonFileRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        WriteJsonFileRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for WriteJsonFileRequestBody
         * @function getTypeUrl
         * @memberof fs.WriteJsonFileRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        WriteJsonFileRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.WriteJsonFileRequestBody";
        };

        return WriteJsonFileRequestBody;
    })();

    fs.WriteTxtFileRequestBody = (function() {

        /**
         * Properties of a WriteTxtFileRequestBody.
         * @memberof fs
         * @interface IWriteTxtFileRequestBody
         * @property {string|null} [path] WriteTxtFileRequestBody path
         * @property {string|null} [txt] WriteTxtFileRequestBody txt
         * @property {fs.IFileFlags|null} [flags] WriteTxtFileRequestBody flags
         */

        /**
         * Constructs a new WriteTxtFileRequestBody.
         * @memberof fs
         * @classdesc Represents a WriteTxtFileRequestBody.
         * @implements IWriteTxtFileRequestBody
         * @constructor
         * @param {fs.IWriteTxtFileRequestBody=} [properties] Properties to set
         */
        function WriteTxtFileRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * WriteTxtFileRequestBody path.
         * @member {string} path
         * @memberof fs.WriteTxtFileRequestBody
         * @instance
         */
        WriteTxtFileRequestBody.prototype.path = "";

        /**
         * WriteTxtFileRequestBody txt.
         * @member {string} txt
         * @memberof fs.WriteTxtFileRequestBody
         * @instance
         */
        WriteTxtFileRequestBody.prototype.txt = "";

        /**
         * WriteTxtFileRequestBody flags.
         * @member {fs.IFileFlags|null|undefined} flags
         * @memberof fs.WriteTxtFileRequestBody
         * @instance
         */
        WriteTxtFileRequestBody.prototype.flags = null;

        /**
         * Creates a new WriteTxtFileRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.WriteTxtFileRequestBody
         * @static
         * @param {fs.IWriteTxtFileRequestBody=} [properties] Properties to set
         * @returns {fs.WriteTxtFileRequestBody} WriteTxtFileRequestBody instance
         */
        WriteTxtFileRequestBody.create = function create(properties) {
            return new WriteTxtFileRequestBody(properties);
        };

        /**
         * Encodes the specified WriteTxtFileRequestBody message. Does not implicitly {@link fs.WriteTxtFileRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.WriteTxtFileRequestBody
         * @static
         * @param {fs.IWriteTxtFileRequestBody} message WriteTxtFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteTxtFileRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.txt);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.fs.FileFlags.encode(message.flags, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified WriteTxtFileRequestBody message, length delimited. Does not implicitly {@link fs.WriteTxtFileRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.WriteTxtFileRequestBody
         * @static
         * @param {fs.IWriteTxtFileRequestBody} message WriteTxtFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteTxtFileRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a WriteTxtFileRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.WriteTxtFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.WriteTxtFileRequestBody} WriteTxtFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteTxtFileRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.WriteTxtFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.txt = reader.string();
                        break;
                    }
                case 3: {
                        message.flags = $root.fs.FileFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a WriteTxtFileRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.WriteTxtFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.WriteTxtFileRequestBody} WriteTxtFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteTxtFileRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a WriteTxtFileRequestBody message.
         * @function verify
         * @memberof fs.WriteTxtFileRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        WriteTxtFileRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                if (!$util.isString(message.txt))
                    return "txt: string expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.fs.FileFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a WriteTxtFileRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.WriteTxtFileRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.WriteTxtFileRequestBody} WriteTxtFileRequestBody
         */
        WriteTxtFileRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.WriteTxtFileRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.WriteTxtFileRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.WriteTxtFileRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.txt != null)
                message.txt = String(object.txt);
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.WriteTxtFileRequestBody.flags: object expected");
                message.flags = $root.fs.FileFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a WriteTxtFileRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.WriteTxtFileRequestBody
         * @static
         * @param {fs.WriteTxtFileRequestBody} message WriteTxtFileRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        WriteTxtFileRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.txt = "";
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                object.txt = message.txt;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.fs.FileFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this WriteTxtFileRequestBody to JSON.
         * @function toJSON
         * @memberof fs.WriteTxtFileRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        WriteTxtFileRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for WriteTxtFileRequestBody
         * @function getTypeUrl
         * @memberof fs.WriteTxtFileRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        WriteTxtFileRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.WriteTxtFileRequestBody";
        };

        return WriteTxtFileRequestBody;
    })();

    fs.WriteBytesRequestBody = (function() {

        /**
         * Properties of a WriteBytesRequestBody.
         * @memberof fs
         * @interface IWriteBytesRequestBody
         * @property {string|null} [path] WriteBytesRequestBody path
         * @property {Uint8Array|null} [bytes] WriteBytesRequestBody bytes
         * @property {fs.IFileFlags|null} [flags] WriteBytesRequestBody flags
         */

        /**
         * Constructs a new WriteBytesRequestBody.
         * @memberof fs
         * @classdesc Represents a WriteBytesRequestBody.
         * @implements IWriteBytesRequestBody
         * @constructor
         * @param {fs.IWriteBytesRequestBody=} [properties] Properties to set
         */
        function WriteBytesRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * WriteBytesRequestBody path.
         * @member {string} path
         * @memberof fs.WriteBytesRequestBody
         * @instance
         */
        WriteBytesRequestBody.prototype.path = "";

        /**
         * WriteBytesRequestBody bytes.
         * @member {Uint8Array} bytes
         * @memberof fs.WriteBytesRequestBody
         * @instance
         */
        WriteBytesRequestBody.prototype.bytes = $util.newBuffer([]);

        /**
         * WriteBytesRequestBody flags.
         * @member {fs.IFileFlags|null|undefined} flags
         * @memberof fs.WriteBytesRequestBody
         * @instance
         */
        WriteBytesRequestBody.prototype.flags = null;

        /**
         * Creates a new WriteBytesRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.WriteBytesRequestBody
         * @static
         * @param {fs.IWriteBytesRequestBody=} [properties] Properties to set
         * @returns {fs.WriteBytesRequestBody} WriteBytesRequestBody instance
         */
        WriteBytesRequestBody.create = function create(properties) {
            return new WriteBytesRequestBody(properties);
        };

        /**
         * Encodes the specified WriteBytesRequestBody message. Does not implicitly {@link fs.WriteBytesRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.WriteBytesRequestBody
         * @static
         * @param {fs.IWriteBytesRequestBody} message WriteBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteBytesRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.bytes);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.fs.FileFlags.encode(message.flags, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified WriteBytesRequestBody message, length delimited. Does not implicitly {@link fs.WriteBytesRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.WriteBytesRequestBody
         * @static
         * @param {fs.IWriteBytesRequestBody} message WriteBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteBytesRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a WriteBytesRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.WriteBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.WriteBytesRequestBody} WriteBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteBytesRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.WriteBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.bytes = reader.bytes();
                        break;
                    }
                case 3: {
                        message.flags = $root.fs.FileFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a WriteBytesRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.WriteBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.WriteBytesRequestBody} WriteBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteBytesRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a WriteBytesRequestBody message.
         * @function verify
         * @memberof fs.WriteBytesRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        WriteBytesRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                if (!(message.bytes && typeof message.bytes.length === "number" || $util.isString(message.bytes)))
                    return "bytes: buffer expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.fs.FileFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a WriteBytesRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.WriteBytesRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.WriteBytesRequestBody} WriteBytesRequestBody
         */
        WriteBytesRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.WriteBytesRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.WriteBytesRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.WriteBytesRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.bytes != null)
                if (typeof object.bytes === "string")
                    $util.base64.decode(object.bytes, message.bytes = $util.newBuffer($util.base64.length(object.bytes)), 0);
                else if (object.bytes.length >= 0)
                    message.bytes = object.bytes;
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.WriteBytesRequestBody.flags: object expected");
                message.flags = $root.fs.FileFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a WriteBytesRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.WriteBytesRequestBody
         * @static
         * @param {fs.WriteBytesRequestBody} message WriteBytesRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        WriteBytesRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                if (options.bytes === String)
                    object.bytes = "";
                else {
                    object.bytes = [];
                    if (options.bytes !== Array)
                        object.bytes = $util.newBuffer(object.bytes);
                }
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = options.bytes === String ? $util.base64.encode(message.bytes, 0, message.bytes.length) : options.bytes === Array ? Array.prototype.slice.call(message.bytes) : message.bytes;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.fs.FileFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this WriteBytesRequestBody to JSON.
         * @function toJSON
         * @memberof fs.WriteBytesRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        WriteBytesRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for WriteBytesRequestBody
         * @function getTypeUrl
         * @memberof fs.WriteBytesRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        WriteBytesRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.WriteBytesRequestBody";
        };

        return WriteBytesRequestBody;
    })();

    fs.VersionedWriteJsonFileRequestBody = (function() {

        /**
         * Properties of a VersionedWriteJsonFileRequestBody.
         * @memberof fs
         * @interface IVersionedWriteJsonFileRequestBody
         * @property {string|null} [path] VersionedWriteJsonFileRequestBody path
         * @property {string|null} [json] VersionedWriteJsonFileRequestBody json
         * @property {fs.IVersionedFileWriteFlags|null} [flags] VersionedWriteJsonFileRequestBody flags
         */

        /**
         * Constructs a new VersionedWriteJsonFileRequestBody.
         * @memberof fs
         * @classdesc Represents a VersionedWriteJsonFileRequestBody.
         * @implements IVersionedWriteJsonFileRequestBody
         * @constructor
         * @param {fs.IVersionedWriteJsonFileRequestBody=} [properties] Properties to set
         */
        function VersionedWriteJsonFileRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedWriteJsonFileRequestBody path.
         * @member {string} path
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @instance
         */
        VersionedWriteJsonFileRequestBody.prototype.path = "";

        /**
         * VersionedWriteJsonFileRequestBody json.
         * @member {string} json
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @instance
         */
        VersionedWriteJsonFileRequestBody.prototype.json = "";

        /**
         * VersionedWriteJsonFileRequestBody flags.
         * @member {fs.IVersionedFileWriteFlags|null|undefined} flags
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @instance
         */
        VersionedWriteJsonFileRequestBody.prototype.flags = null;

        /**
         * Creates a new VersionedWriteJsonFileRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @static
         * @param {fs.IVersionedWriteJsonFileRequestBody=} [properties] Properties to set
         * @returns {fs.VersionedWriteJsonFileRequestBody} VersionedWriteJsonFileRequestBody instance
         */
        VersionedWriteJsonFileRequestBody.create = function create(properties) {
            return new VersionedWriteJsonFileRequestBody(properties);
        };

        /**
         * Encodes the specified VersionedWriteJsonFileRequestBody message. Does not implicitly {@link fs.VersionedWriteJsonFileRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @static
         * @param {fs.IVersionedWriteJsonFileRequestBody} message VersionedWriteJsonFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedWriteJsonFileRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.json);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.fs.VersionedFileWriteFlags.encode(message.flags, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedWriteJsonFileRequestBody message, length delimited. Does not implicitly {@link fs.VersionedWriteJsonFileRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @static
         * @param {fs.IVersionedWriteJsonFileRequestBody} message VersionedWriteJsonFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedWriteJsonFileRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedWriteJsonFileRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.VersionedWriteJsonFileRequestBody} VersionedWriteJsonFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedWriteJsonFileRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedWriteJsonFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.json = reader.string();
                        break;
                    }
                case 3: {
                        message.flags = $root.fs.VersionedFileWriteFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedWriteJsonFileRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.VersionedWriteJsonFileRequestBody} VersionedWriteJsonFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedWriteJsonFileRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedWriteJsonFileRequestBody message.
         * @function verify
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedWriteJsonFileRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                if (!$util.isString(message.json))
                    return "json: string expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.fs.VersionedFileWriteFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedWriteJsonFileRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.VersionedWriteJsonFileRequestBody} VersionedWriteJsonFileRequestBody
         */
        VersionedWriteJsonFileRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.VersionedWriteJsonFileRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.VersionedWriteJsonFileRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.VersionedWriteJsonFileRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.json != null)
                message.json = String(object.json);
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.VersionedWriteJsonFileRequestBody.flags: object expected");
                message.flags = $root.fs.VersionedFileWriteFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedWriteJsonFileRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @static
         * @param {fs.VersionedWriteJsonFileRequestBody} message VersionedWriteJsonFileRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedWriteJsonFileRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.json = "";
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = message.json;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.fs.VersionedFileWriteFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedWriteJsonFileRequestBody to JSON.
         * @function toJSON
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedWriteJsonFileRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedWriteJsonFileRequestBody
         * @function getTypeUrl
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedWriteJsonFileRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.VersionedWriteJsonFileRequestBody";
        };

        return VersionedWriteJsonFileRequestBody;
    })();

    fs.VersionedFileWriteFlags = (function() {

        /**
         * Properties of a VersionedFileWriteFlags.
         * @memberof fs
         * @interface IVersionedFileWriteFlags
         * @property {common.IBooleanValue|null} [truncate] VersionedFileWriteFlags truncate
         * @property {common.IBooleanValue|null} [create] VersionedFileWriteFlags create
         * @property {common.IBooleanValue|null} [exclusive] VersionedFileWriteFlags exclusive
         * @property {common.IUInt64Value|null} [currentVersion] VersionedFileWriteFlags currentVersion
         */

        /**
         * Constructs a new VersionedFileWriteFlags.
         * @memberof fs
         * @classdesc Represents a VersionedFileWriteFlags.
         * @implements IVersionedFileWriteFlags
         * @constructor
         * @param {fs.IVersionedFileWriteFlags=} [properties] Properties to set
         */
        function VersionedFileWriteFlags(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedFileWriteFlags truncate.
         * @member {common.IBooleanValue|null|undefined} truncate
         * @memberof fs.VersionedFileWriteFlags
         * @instance
         */
        VersionedFileWriteFlags.prototype.truncate = null;

        /**
         * VersionedFileWriteFlags create.
         * @member {common.IBooleanValue|null|undefined} create
         * @memberof fs.VersionedFileWriteFlags
         * @instance
         */
        VersionedFileWriteFlags.prototype.create = null;

        /**
         * VersionedFileWriteFlags exclusive.
         * @member {common.IBooleanValue|null|undefined} exclusive
         * @memberof fs.VersionedFileWriteFlags
         * @instance
         */
        VersionedFileWriteFlags.prototype.exclusive = null;

        /**
         * VersionedFileWriteFlags currentVersion.
         * @member {common.IUInt64Value|null|undefined} currentVersion
         * @memberof fs.VersionedFileWriteFlags
         * @instance
         */
        VersionedFileWriteFlags.prototype.currentVersion = null;

        /**
         * Creates a new VersionedFileWriteFlags instance using the specified properties.
         * @function create
         * @memberof fs.VersionedFileWriteFlags
         * @static
         * @param {fs.IVersionedFileWriteFlags=} [properties] Properties to set
         * @returns {fs.VersionedFileWriteFlags} VersionedFileWriteFlags instance
         */
        VersionedFileWriteFlags.create = function create(properties) {
            return new VersionedFileWriteFlags(properties);
        };

        /**
         * Encodes the specified VersionedFileWriteFlags message. Does not implicitly {@link fs.VersionedFileWriteFlags.verify|verify} messages.
         * @function encode
         * @memberof fs.VersionedFileWriteFlags
         * @static
         * @param {fs.IVersionedFileWriteFlags} message VersionedFileWriteFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedFileWriteFlags.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.truncate != null && Object.hasOwnProperty.call(message, "truncate"))
                $root.common.BooleanValue.encode(message.truncate, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.create != null && Object.hasOwnProperty.call(message, "create"))
                $root.common.BooleanValue.encode(message.create, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive"))
                $root.common.BooleanValue.encode(message.exclusive, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                $root.common.UInt64Value.encode(message.currentVersion, writer.uint32(/* id 10, wireType 2 =*/82).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedFileWriteFlags message, length delimited. Does not implicitly {@link fs.VersionedFileWriteFlags.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.VersionedFileWriteFlags
         * @static
         * @param {fs.IVersionedFileWriteFlags} message VersionedFileWriteFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedFileWriteFlags.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedFileWriteFlags message from the specified reader or buffer.
         * @function decode
         * @memberof fs.VersionedFileWriteFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.VersionedFileWriteFlags} VersionedFileWriteFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedFileWriteFlags.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedFileWriteFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.truncate = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.create = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.exclusive = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 10: {
                        message.currentVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedFileWriteFlags message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.VersionedFileWriteFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.VersionedFileWriteFlags} VersionedFileWriteFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedFileWriteFlags.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedFileWriteFlags message.
         * @function verify
         * @memberof fs.VersionedFileWriteFlags
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedFileWriteFlags.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.truncate != null && Object.hasOwnProperty.call(message, "truncate")) {
                var error = $root.common.BooleanValue.verify(message.truncate, long + 1);
                if (error)
                    return "truncate." + error;
            }
            if (message.create != null && Object.hasOwnProperty.call(message, "create")) {
                var error = $root.common.BooleanValue.verify(message.create, long + 1);
                if (error)
                    return "create." + error;
            }
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive")) {
                var error = $root.common.BooleanValue.verify(message.exclusive, long + 1);
                if (error)
                    return "exclusive." + error;
            }
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion")) {
                var error = $root.common.UInt64Value.verify(message.currentVersion, long + 1);
                if (error)
                    return "currentVersion." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedFileWriteFlags message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.VersionedFileWriteFlags
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.VersionedFileWriteFlags} VersionedFileWriteFlags
         */
        VersionedFileWriteFlags.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.VersionedFileWriteFlags)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.VersionedFileWriteFlags: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.VersionedFileWriteFlags();
            if (object.truncate != null) {
                if (!$util.isObject(object.truncate))
                    throw TypeError(".fs.VersionedFileWriteFlags.truncate: object expected");
                message.truncate = $root.common.BooleanValue.fromObject(object.truncate, long + 1);
            }
            if (object.create != null) {
                if (!$util.isObject(object.create))
                    throw TypeError(".fs.VersionedFileWriteFlags.create: object expected");
                message.create = $root.common.BooleanValue.fromObject(object.create, long + 1);
            }
            if (object.exclusive != null) {
                if (!$util.isObject(object.exclusive))
                    throw TypeError(".fs.VersionedFileWriteFlags.exclusive: object expected");
                message.exclusive = $root.common.BooleanValue.fromObject(object.exclusive, long + 1);
            }
            if (object.currentVersion != null) {
                if (!$util.isObject(object.currentVersion))
                    throw TypeError(".fs.VersionedFileWriteFlags.currentVersion: object expected");
                message.currentVersion = $root.common.UInt64Value.fromObject(object.currentVersion, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedFileWriteFlags message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.VersionedFileWriteFlags
         * @static
         * @param {fs.VersionedFileWriteFlags} message VersionedFileWriteFlags
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedFileWriteFlags.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.truncate = null;
                object.create = null;
                object.exclusive = null;
                object.currentVersion = null;
            }
            if (message.truncate != null && Object.hasOwnProperty.call(message, "truncate"))
                object.truncate = $root.common.BooleanValue.toObject(message.truncate, options, q + 1);
            if (message.create != null && Object.hasOwnProperty.call(message, "create"))
                object.create = $root.common.BooleanValue.toObject(message.create, options, q + 1);
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive"))
                object.exclusive = $root.common.BooleanValue.toObject(message.exclusive, options, q + 1);
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                object.currentVersion = $root.common.UInt64Value.toObject(message.currentVersion, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedFileWriteFlags to JSON.
         * @function toJSON
         * @memberof fs.VersionedFileWriteFlags
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedFileWriteFlags.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedFileWriteFlags
         * @function getTypeUrl
         * @memberof fs.VersionedFileWriteFlags
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedFileWriteFlags.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.VersionedFileWriteFlags";
        };

        return VersionedFileWriteFlags;
    })();

    fs.VersionedWriteTxtFileRequestBody = (function() {

        /**
         * Properties of a VersionedWriteTxtFileRequestBody.
         * @memberof fs
         * @interface IVersionedWriteTxtFileRequestBody
         * @property {string|null} [path] VersionedWriteTxtFileRequestBody path
         * @property {string|null} [txt] VersionedWriteTxtFileRequestBody txt
         * @property {fs.IVersionedFileWriteFlags|null} [flags] VersionedWriteTxtFileRequestBody flags
         */

        /**
         * Constructs a new VersionedWriteTxtFileRequestBody.
         * @memberof fs
         * @classdesc Represents a VersionedWriteTxtFileRequestBody.
         * @implements IVersionedWriteTxtFileRequestBody
         * @constructor
         * @param {fs.IVersionedWriteTxtFileRequestBody=} [properties] Properties to set
         */
        function VersionedWriteTxtFileRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedWriteTxtFileRequestBody path.
         * @member {string} path
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @instance
         */
        VersionedWriteTxtFileRequestBody.prototype.path = "";

        /**
         * VersionedWriteTxtFileRequestBody txt.
         * @member {string} txt
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @instance
         */
        VersionedWriteTxtFileRequestBody.prototype.txt = "";

        /**
         * VersionedWriteTxtFileRequestBody flags.
         * @member {fs.IVersionedFileWriteFlags|null|undefined} flags
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @instance
         */
        VersionedWriteTxtFileRequestBody.prototype.flags = null;

        /**
         * Creates a new VersionedWriteTxtFileRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @static
         * @param {fs.IVersionedWriteTxtFileRequestBody=} [properties] Properties to set
         * @returns {fs.VersionedWriteTxtFileRequestBody} VersionedWriteTxtFileRequestBody instance
         */
        VersionedWriteTxtFileRequestBody.create = function create(properties) {
            return new VersionedWriteTxtFileRequestBody(properties);
        };

        /**
         * Encodes the specified VersionedWriteTxtFileRequestBody message. Does not implicitly {@link fs.VersionedWriteTxtFileRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @static
         * @param {fs.IVersionedWriteTxtFileRequestBody} message VersionedWriteTxtFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedWriteTxtFileRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.txt);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.fs.VersionedFileWriteFlags.encode(message.flags, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedWriteTxtFileRequestBody message, length delimited. Does not implicitly {@link fs.VersionedWriteTxtFileRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @static
         * @param {fs.IVersionedWriteTxtFileRequestBody} message VersionedWriteTxtFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedWriteTxtFileRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedWriteTxtFileRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.VersionedWriteTxtFileRequestBody} VersionedWriteTxtFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedWriteTxtFileRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedWriteTxtFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.txt = reader.string();
                        break;
                    }
                case 3: {
                        message.flags = $root.fs.VersionedFileWriteFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedWriteTxtFileRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.VersionedWriteTxtFileRequestBody} VersionedWriteTxtFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedWriteTxtFileRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedWriteTxtFileRequestBody message.
         * @function verify
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedWriteTxtFileRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                if (!$util.isString(message.txt))
                    return "txt: string expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.fs.VersionedFileWriteFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedWriteTxtFileRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.VersionedWriteTxtFileRequestBody} VersionedWriteTxtFileRequestBody
         */
        VersionedWriteTxtFileRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.VersionedWriteTxtFileRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.VersionedWriteTxtFileRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.VersionedWriteTxtFileRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.txt != null)
                message.txt = String(object.txt);
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.VersionedWriteTxtFileRequestBody.flags: object expected");
                message.flags = $root.fs.VersionedFileWriteFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedWriteTxtFileRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @static
         * @param {fs.VersionedWriteTxtFileRequestBody} message VersionedWriteTxtFileRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedWriteTxtFileRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.txt = "";
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                object.txt = message.txt;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.fs.VersionedFileWriteFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedWriteTxtFileRequestBody to JSON.
         * @function toJSON
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedWriteTxtFileRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedWriteTxtFileRequestBody
         * @function getTypeUrl
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedWriteTxtFileRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.VersionedWriteTxtFileRequestBody";
        };

        return VersionedWriteTxtFileRequestBody;
    })();

    fs.VersionedWriteBytesRequestBody = (function() {

        /**
         * Properties of a VersionedWriteBytesRequestBody.
         * @memberof fs
         * @interface IVersionedWriteBytesRequestBody
         * @property {string|null} [path] VersionedWriteBytesRequestBody path
         * @property {Uint8Array|null} [bytes] VersionedWriteBytesRequestBody bytes
         * @property {fs.IVersionedFileWriteFlags|null} [flags] VersionedWriteBytesRequestBody flags
         */

        /**
         * Constructs a new VersionedWriteBytesRequestBody.
         * @memberof fs
         * @classdesc Represents a VersionedWriteBytesRequestBody.
         * @implements IVersionedWriteBytesRequestBody
         * @constructor
         * @param {fs.IVersionedWriteBytesRequestBody=} [properties] Properties to set
         */
        function VersionedWriteBytesRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedWriteBytesRequestBody path.
         * @member {string} path
         * @memberof fs.VersionedWriteBytesRequestBody
         * @instance
         */
        VersionedWriteBytesRequestBody.prototype.path = "";

        /**
         * VersionedWriteBytesRequestBody bytes.
         * @member {Uint8Array} bytes
         * @memberof fs.VersionedWriteBytesRequestBody
         * @instance
         */
        VersionedWriteBytesRequestBody.prototype.bytes = $util.newBuffer([]);

        /**
         * VersionedWriteBytesRequestBody flags.
         * @member {fs.IVersionedFileWriteFlags|null|undefined} flags
         * @memberof fs.VersionedWriteBytesRequestBody
         * @instance
         */
        VersionedWriteBytesRequestBody.prototype.flags = null;

        /**
         * Creates a new VersionedWriteBytesRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.VersionedWriteBytesRequestBody
         * @static
         * @param {fs.IVersionedWriteBytesRequestBody=} [properties] Properties to set
         * @returns {fs.VersionedWriteBytesRequestBody} VersionedWriteBytesRequestBody instance
         */
        VersionedWriteBytesRequestBody.create = function create(properties) {
            return new VersionedWriteBytesRequestBody(properties);
        };

        /**
         * Encodes the specified VersionedWriteBytesRequestBody message. Does not implicitly {@link fs.VersionedWriteBytesRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.VersionedWriteBytesRequestBody
         * @static
         * @param {fs.IVersionedWriteBytesRequestBody} message VersionedWriteBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedWriteBytesRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.bytes);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.fs.VersionedFileWriteFlags.encode(message.flags, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedWriteBytesRequestBody message, length delimited. Does not implicitly {@link fs.VersionedWriteBytesRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.VersionedWriteBytesRequestBody
         * @static
         * @param {fs.IVersionedWriteBytesRequestBody} message VersionedWriteBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedWriteBytesRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedWriteBytesRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.VersionedWriteBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.VersionedWriteBytesRequestBody} VersionedWriteBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedWriteBytesRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedWriteBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.bytes = reader.bytes();
                        break;
                    }
                case 3: {
                        message.flags = $root.fs.VersionedFileWriteFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedWriteBytesRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.VersionedWriteBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.VersionedWriteBytesRequestBody} VersionedWriteBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedWriteBytesRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedWriteBytesRequestBody message.
         * @function verify
         * @memberof fs.VersionedWriteBytesRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedWriteBytesRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                if (!(message.bytes && typeof message.bytes.length === "number" || $util.isString(message.bytes)))
                    return "bytes: buffer expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.fs.VersionedFileWriteFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedWriteBytesRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.VersionedWriteBytesRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.VersionedWriteBytesRequestBody} VersionedWriteBytesRequestBody
         */
        VersionedWriteBytesRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.VersionedWriteBytesRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.VersionedWriteBytesRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.VersionedWriteBytesRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.bytes != null)
                if (typeof object.bytes === "string")
                    $util.base64.decode(object.bytes, message.bytes = $util.newBuffer($util.base64.length(object.bytes)), 0);
                else if (object.bytes.length >= 0)
                    message.bytes = object.bytes;
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.VersionedWriteBytesRequestBody.flags: object expected");
                message.flags = $root.fs.VersionedFileWriteFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedWriteBytesRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.VersionedWriteBytesRequestBody
         * @static
         * @param {fs.VersionedWriteBytesRequestBody} message VersionedWriteBytesRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedWriteBytesRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                if (options.bytes === String)
                    object.bytes = "";
                else {
                    object.bytes = [];
                    if (options.bytes !== Array)
                        object.bytes = $util.newBuffer(object.bytes);
                }
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = options.bytes === String ? $util.base64.encode(message.bytes, 0, message.bytes.length) : options.bytes === Array ? Array.prototype.slice.call(message.bytes) : message.bytes;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.fs.VersionedFileWriteFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedWriteBytesRequestBody to JSON.
         * @function toJSON
         * @memberof fs.VersionedWriteBytesRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedWriteBytesRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedWriteBytesRequestBody
         * @function getTypeUrl
         * @memberof fs.VersionedWriteBytesRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedWriteBytesRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.VersionedWriteBytesRequestBody";
        };

        return VersionedWriteBytesRequestBody;
    })();

    fs.VersionedGetByteSinkRequestBody = (function() {

        /**
         * Properties of a VersionedGetByteSinkRequestBody.
         * @memberof fs
         * @interface IVersionedGetByteSinkRequestBody
         * @property {string|null} [path] VersionedGetByteSinkRequestBody path
         * @property {fs.IVersionedFileWriteFlags|null} [flags] VersionedGetByteSinkRequestBody flags
         */

        /**
         * Constructs a new VersionedGetByteSinkRequestBody.
         * @memberof fs
         * @classdesc Represents a VersionedGetByteSinkRequestBody.
         * @implements IVersionedGetByteSinkRequestBody
         * @constructor
         * @param {fs.IVersionedGetByteSinkRequestBody=} [properties] Properties to set
         */
        function VersionedGetByteSinkRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedGetByteSinkRequestBody path.
         * @member {string} path
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @instance
         */
        VersionedGetByteSinkRequestBody.prototype.path = "";

        /**
         * VersionedGetByteSinkRequestBody flags.
         * @member {fs.IVersionedFileWriteFlags|null|undefined} flags
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @instance
         */
        VersionedGetByteSinkRequestBody.prototype.flags = null;

        /**
         * Creates a new VersionedGetByteSinkRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @static
         * @param {fs.IVersionedGetByteSinkRequestBody=} [properties] Properties to set
         * @returns {fs.VersionedGetByteSinkRequestBody} VersionedGetByteSinkRequestBody instance
         */
        VersionedGetByteSinkRequestBody.create = function create(properties) {
            return new VersionedGetByteSinkRequestBody(properties);
        };

        /**
         * Encodes the specified VersionedGetByteSinkRequestBody message. Does not implicitly {@link fs.VersionedGetByteSinkRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @static
         * @param {fs.IVersionedGetByteSinkRequestBody} message VersionedGetByteSinkRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetByteSinkRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.fs.VersionedFileWriteFlags.encode(message.flags, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedGetByteSinkRequestBody message, length delimited. Does not implicitly {@link fs.VersionedGetByteSinkRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @static
         * @param {fs.IVersionedGetByteSinkRequestBody} message VersionedGetByteSinkRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetByteSinkRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedGetByteSinkRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.VersionedGetByteSinkRequestBody} VersionedGetByteSinkRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetByteSinkRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedGetByteSinkRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.flags = $root.fs.VersionedFileWriteFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedGetByteSinkRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.VersionedGetByteSinkRequestBody} VersionedGetByteSinkRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetByteSinkRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedGetByteSinkRequestBody message.
         * @function verify
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedGetByteSinkRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.fs.VersionedFileWriteFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedGetByteSinkRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.VersionedGetByteSinkRequestBody} VersionedGetByteSinkRequestBody
         */
        VersionedGetByteSinkRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.VersionedGetByteSinkRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.VersionedGetByteSinkRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.VersionedGetByteSinkRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.VersionedGetByteSinkRequestBody.flags: object expected");
                message.flags = $root.fs.VersionedFileWriteFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedGetByteSinkRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @static
         * @param {fs.VersionedGetByteSinkRequestBody} message VersionedGetByteSinkRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedGetByteSinkRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.fs.VersionedFileWriteFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedGetByteSinkRequestBody to JSON.
         * @function toJSON
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedGetByteSinkRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedGetByteSinkRequestBody
         * @function getTypeUrl
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedGetByteSinkRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.VersionedGetByteSinkRequestBody";
        };

        return VersionedGetByteSinkRequestBody;
    })();

    fs.ArchiveCurrentRequestBody = (function() {

        /**
         * Properties of an ArchiveCurrentRequestBody.
         * @memberof fs
         * @interface IArchiveCurrentRequestBody
         * @property {string|null} [path] ArchiveCurrentRequestBody path
         * @property {common.IUInt64Value|null} [version] ArchiveCurrentRequestBody version
         */

        /**
         * Constructs a new ArchiveCurrentRequestBody.
         * @memberof fs
         * @classdesc Represents an ArchiveCurrentRequestBody.
         * @implements IArchiveCurrentRequestBody
         * @constructor
         * @param {fs.IArchiveCurrentRequestBody=} [properties] Properties to set
         */
        function ArchiveCurrentRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ArchiveCurrentRequestBody path.
         * @member {string} path
         * @memberof fs.ArchiveCurrentRequestBody
         * @instance
         */
        ArchiveCurrentRequestBody.prototype.path = "";

        /**
         * ArchiveCurrentRequestBody version.
         * @member {common.IUInt64Value|null|undefined} version
         * @memberof fs.ArchiveCurrentRequestBody
         * @instance
         */
        ArchiveCurrentRequestBody.prototype.version = null;

        /**
         * Creates a new ArchiveCurrentRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.ArchiveCurrentRequestBody
         * @static
         * @param {fs.IArchiveCurrentRequestBody=} [properties] Properties to set
         * @returns {fs.ArchiveCurrentRequestBody} ArchiveCurrentRequestBody instance
         */
        ArchiveCurrentRequestBody.create = function create(properties) {
            return new ArchiveCurrentRequestBody(properties);
        };

        /**
         * Encodes the specified ArchiveCurrentRequestBody message. Does not implicitly {@link fs.ArchiveCurrentRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.ArchiveCurrentRequestBody
         * @static
         * @param {fs.IArchiveCurrentRequestBody} message ArchiveCurrentRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ArchiveCurrentRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                $root.common.UInt64Value.encode(message.version, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified ArchiveCurrentRequestBody message, length delimited. Does not implicitly {@link fs.ArchiveCurrentRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.ArchiveCurrentRequestBody
         * @static
         * @param {fs.IArchiveCurrentRequestBody} message ArchiveCurrentRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ArchiveCurrentRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an ArchiveCurrentRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.ArchiveCurrentRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.ArchiveCurrentRequestBody} ArchiveCurrentRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ArchiveCurrentRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.ArchiveCurrentRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.version = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an ArchiveCurrentRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.ArchiveCurrentRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.ArchiveCurrentRequestBody} ArchiveCurrentRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ArchiveCurrentRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an ArchiveCurrentRequestBody message.
         * @function verify
         * @memberof fs.ArchiveCurrentRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ArchiveCurrentRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.version != null && Object.hasOwnProperty.call(message, "version")) {
                var error = $root.common.UInt64Value.verify(message.version, long + 1);
                if (error)
                    return "version." + error;
            }
            return null;
        };

        /**
         * Creates an ArchiveCurrentRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.ArchiveCurrentRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.ArchiveCurrentRequestBody} ArchiveCurrentRequestBody
         */
        ArchiveCurrentRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.ArchiveCurrentRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.ArchiveCurrentRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.ArchiveCurrentRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.version != null) {
                if (!$util.isObject(object.version))
                    throw TypeError(".fs.ArchiveCurrentRequestBody.version: object expected");
                message.version = $root.common.UInt64Value.fromObject(object.version, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an ArchiveCurrentRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.ArchiveCurrentRequestBody
         * @static
         * @param {fs.ArchiveCurrentRequestBody} message ArchiveCurrentRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ArchiveCurrentRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.version = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                object.version = $root.common.UInt64Value.toObject(message.version, options, q + 1);
            return object;
        };

        /**
         * Converts this ArchiveCurrentRequestBody to JSON.
         * @function toJSON
         * @memberof fs.ArchiveCurrentRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ArchiveCurrentRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ArchiveCurrentRequestBody
         * @function getTypeUrl
         * @memberof fs.ArchiveCurrentRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ArchiveCurrentRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.ArchiveCurrentRequestBody";
        };

        return ArchiveCurrentRequestBody;
    })();

    fs.FSSyncStatusRequestBody = (function() {

        /**
         * Properties of a FSSyncStatusRequestBody.
         * @memberof fs
         * @interface IFSSyncStatusRequestBody
         * @property {string|null} [path] FSSyncStatusRequestBody path
         * @property {boolean|null} [skipServerCheck] FSSyncStatusRequestBody skipServerCheck
         */

        /**
         * Constructs a new FSSyncStatusRequestBody.
         * @memberof fs
         * @classdesc Represents a FSSyncStatusRequestBody.
         * @implements IFSSyncStatusRequestBody
         * @constructor
         * @param {fs.IFSSyncStatusRequestBody=} [properties] Properties to set
         */
        function FSSyncStatusRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FSSyncStatusRequestBody path.
         * @member {string} path
         * @memberof fs.FSSyncStatusRequestBody
         * @instance
         */
        FSSyncStatusRequestBody.prototype.path = "";

        /**
         * FSSyncStatusRequestBody skipServerCheck.
         * @member {boolean} skipServerCheck
         * @memberof fs.FSSyncStatusRequestBody
         * @instance
         */
        FSSyncStatusRequestBody.prototype.skipServerCheck = false;

        /**
         * Creates a new FSSyncStatusRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.FSSyncStatusRequestBody
         * @static
         * @param {fs.IFSSyncStatusRequestBody=} [properties] Properties to set
         * @returns {fs.FSSyncStatusRequestBody} FSSyncStatusRequestBody instance
         */
        FSSyncStatusRequestBody.create = function create(properties) {
            return new FSSyncStatusRequestBody(properties);
        };

        /**
         * Encodes the specified FSSyncStatusRequestBody message. Does not implicitly {@link fs.FSSyncStatusRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.FSSyncStatusRequestBody
         * @static
         * @param {fs.IFSSyncStatusRequestBody} message FSSyncStatusRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncStatusRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.skipServerCheck != null && Object.hasOwnProperty.call(message, "skipServerCheck"))
                writer.uint32(/* id 2, wireType 0 =*/16).bool(message.skipServerCheck);
            return writer;
        };

        /**
         * Encodes the specified FSSyncStatusRequestBody message, length delimited. Does not implicitly {@link fs.FSSyncStatusRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FSSyncStatusRequestBody
         * @static
         * @param {fs.IFSSyncStatusRequestBody} message FSSyncStatusRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncStatusRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FSSyncStatusRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FSSyncStatusRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FSSyncStatusRequestBody} FSSyncStatusRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSSyncStatusRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSSyncStatusRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.skipServerCheck = reader.bool();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FSSyncStatusRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FSSyncStatusRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FSSyncStatusRequestBody} FSSyncStatusRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSSyncStatusRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FSSyncStatusRequestBody message.
         * @function verify
         * @memberof fs.FSSyncStatusRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSSyncStatusRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.skipServerCheck != null && Object.hasOwnProperty.call(message, "skipServerCheck"))
                if (typeof message.skipServerCheck !== "boolean")
                    return "skipServerCheck: boolean expected";
            return null;
        };

        /**
         * Creates a FSSyncStatusRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSSyncStatusRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSSyncStatusRequestBody} FSSyncStatusRequestBody
         */
        FSSyncStatusRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FSSyncStatusRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FSSyncStatusRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FSSyncStatusRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.skipServerCheck != null)
                message.skipServerCheck = Boolean(object.skipServerCheck);
            return message;
        };

        /**
         * Creates a plain object from a FSSyncStatusRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSSyncStatusRequestBody
         * @static
         * @param {fs.FSSyncStatusRequestBody} message FSSyncStatusRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSSyncStatusRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.skipServerCheck = false;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.skipServerCheck != null && Object.hasOwnProperty.call(message, "skipServerCheck"))
                object.skipServerCheck = message.skipServerCheck;
            return object;
        };

        /**
         * Converts this FSSyncStatusRequestBody to JSON.
         * @function toJSON
         * @memberof fs.FSSyncStatusRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FSSyncStatusRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FSSyncStatusRequestBody
         * @function getTypeUrl
         * @memberof fs.FSSyncStatusRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FSSyncStatusRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FSSyncStatusRequestBody";
        };

        return FSSyncStatusRequestBody;
    })();

    fs.FSSyncIsOnDiskRequestBody = (function() {

        /**
         * Properties of a FSSyncIsOnDiskRequestBody.
         * @memberof fs
         * @interface IFSSyncIsOnDiskRequestBody
         * @property {string|null} [path] FSSyncIsOnDiskRequestBody path
         * @property {number|Long|null} [version] FSSyncIsOnDiskRequestBody version
         */

        /**
         * Constructs a new FSSyncIsOnDiskRequestBody.
         * @memberof fs
         * @classdesc Represents a FSSyncIsOnDiskRequestBody.
         * @implements IFSSyncIsOnDiskRequestBody
         * @constructor
         * @param {fs.IFSSyncIsOnDiskRequestBody=} [properties] Properties to set
         */
        function FSSyncIsOnDiskRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FSSyncIsOnDiskRequestBody path.
         * @member {string} path
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @instance
         */
        FSSyncIsOnDiskRequestBody.prototype.path = "";

        /**
         * FSSyncIsOnDiskRequestBody version.
         * @member {number|Long} version
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @instance
         */
        FSSyncIsOnDiskRequestBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new FSSyncIsOnDiskRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @static
         * @param {fs.IFSSyncIsOnDiskRequestBody=} [properties] Properties to set
         * @returns {fs.FSSyncIsOnDiskRequestBody} FSSyncIsOnDiskRequestBody instance
         */
        FSSyncIsOnDiskRequestBody.create = function create(properties) {
            return new FSSyncIsOnDiskRequestBody(properties);
        };

        /**
         * Encodes the specified FSSyncIsOnDiskRequestBody message. Does not implicitly {@link fs.FSSyncIsOnDiskRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @static
         * @param {fs.IFSSyncIsOnDiskRequestBody} message FSSyncIsOnDiskRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncIsOnDiskRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.version);
            return writer;
        };

        /**
         * Encodes the specified FSSyncIsOnDiskRequestBody message, length delimited. Does not implicitly {@link fs.FSSyncIsOnDiskRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @static
         * @param {fs.IFSSyncIsOnDiskRequestBody} message FSSyncIsOnDiskRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncIsOnDiskRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FSSyncIsOnDiskRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FSSyncIsOnDiskRequestBody} FSSyncIsOnDiskRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSSyncIsOnDiskRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSSyncIsOnDiskRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.version = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FSSyncIsOnDiskRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FSSyncIsOnDiskRequestBody} FSSyncIsOnDiskRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSSyncIsOnDiskRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FSSyncIsOnDiskRequestBody message.
         * @function verify
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSSyncIsOnDiskRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            return null;
        };

        /**
         * Creates a FSSyncIsOnDiskRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSSyncIsOnDiskRequestBody} FSSyncIsOnDiskRequestBody
         */
        FSSyncIsOnDiskRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FSSyncIsOnDiskRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FSSyncIsOnDiskRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FSSyncIsOnDiskRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from a FSSyncIsOnDiskRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @static
         * @param {fs.FSSyncIsOnDiskRequestBody} message FSSyncIsOnDiskRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSSyncIsOnDiskRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            return object;
        };

        /**
         * Converts this FSSyncIsOnDiskRequestBody to JSON.
         * @function toJSON
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FSSyncIsOnDiskRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FSSyncIsOnDiskRequestBody
         * @function getTypeUrl
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FSSyncIsOnDiskRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FSSyncIsOnDiskRequestBody";
        };

        return FSSyncIsOnDiskRequestBody;
    })();

    fs.FSSyncIsOnDiskReplyBody = (function() {

        /**
         * Properties of a FSSyncIsOnDiskReplyBody.
         * @memberof fs
         * @interface IFSSyncIsOnDiskReplyBody
         * @property {string|null} [status] FSSyncIsOnDiskReplyBody status
         */

        /**
         * Constructs a new FSSyncIsOnDiskReplyBody.
         * @memberof fs
         * @classdesc Represents a FSSyncIsOnDiskReplyBody.
         * @implements IFSSyncIsOnDiskReplyBody
         * @constructor
         * @param {fs.IFSSyncIsOnDiskReplyBody=} [properties] Properties to set
         */
        function FSSyncIsOnDiskReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FSSyncIsOnDiskReplyBody status.
         * @member {string} status
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @instance
         */
        FSSyncIsOnDiskReplyBody.prototype.status = "";

        /**
         * Creates a new FSSyncIsOnDiskReplyBody instance using the specified properties.
         * @function create
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @static
         * @param {fs.IFSSyncIsOnDiskReplyBody=} [properties] Properties to set
         * @returns {fs.FSSyncIsOnDiskReplyBody} FSSyncIsOnDiskReplyBody instance
         */
        FSSyncIsOnDiskReplyBody.create = function create(properties) {
            return new FSSyncIsOnDiskReplyBody(properties);
        };

        /**
         * Encodes the specified FSSyncIsOnDiskReplyBody message. Does not implicitly {@link fs.FSSyncIsOnDiskReplyBody.verify|verify} messages.
         * @function encode
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @static
         * @param {fs.IFSSyncIsOnDiskReplyBody} message FSSyncIsOnDiskReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncIsOnDiskReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.status != null && Object.hasOwnProperty.call(message, "status"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.status);
            return writer;
        };

        /**
         * Encodes the specified FSSyncIsOnDiskReplyBody message, length delimited. Does not implicitly {@link fs.FSSyncIsOnDiskReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @static
         * @param {fs.IFSSyncIsOnDiskReplyBody} message FSSyncIsOnDiskReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncIsOnDiskReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FSSyncIsOnDiskReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FSSyncIsOnDiskReplyBody} FSSyncIsOnDiskReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSSyncIsOnDiskReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSSyncIsOnDiskReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.status = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FSSyncIsOnDiskReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FSSyncIsOnDiskReplyBody} FSSyncIsOnDiskReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSSyncIsOnDiskReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FSSyncIsOnDiskReplyBody message.
         * @function verify
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSSyncIsOnDiskReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.status != null && Object.hasOwnProperty.call(message, "status"))
                if (!$util.isString(message.status))
                    return "status: string expected";
            return null;
        };

        /**
         * Creates a FSSyncIsOnDiskReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSSyncIsOnDiskReplyBody} FSSyncIsOnDiskReplyBody
         */
        FSSyncIsOnDiskReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FSSyncIsOnDiskReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FSSyncIsOnDiskReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FSSyncIsOnDiskReplyBody();
            if (object.status != null)
                message.status = String(object.status);
            return message;
        };

        /**
         * Creates a plain object from a FSSyncIsOnDiskReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @static
         * @param {fs.FSSyncIsOnDiskReplyBody} message FSSyncIsOnDiskReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSSyncIsOnDiskReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.status = "";
            if (message.status != null && Object.hasOwnProperty.call(message, "status"))
                object.status = message.status;
            return object;
        };

        /**
         * Converts this FSSyncIsOnDiskReplyBody to JSON.
         * @function toJSON
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FSSyncIsOnDiskReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FSSyncIsOnDiskReplyBody
         * @function getTypeUrl
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FSSyncIsOnDiskReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FSSyncIsOnDiskReplyBody";
        };

        return FSSyncIsOnDiskReplyBody;
    })();

    fs.FSSyncStartDownloadRequestBody = (function() {

        /**
         * Properties of a FSSyncStartDownloadRequestBody.
         * @memberof fs
         * @interface IFSSyncStartDownloadRequestBody
         * @property {string|null} [path] FSSyncStartDownloadRequestBody path
         * @property {number|Long|null} [version] FSSyncStartDownloadRequestBody version
         */

        /**
         * Constructs a new FSSyncStartDownloadRequestBody.
         * @memberof fs
         * @classdesc Represents a FSSyncStartDownloadRequestBody.
         * @implements IFSSyncStartDownloadRequestBody
         * @constructor
         * @param {fs.IFSSyncStartDownloadRequestBody=} [properties] Properties to set
         */
        function FSSyncStartDownloadRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FSSyncStartDownloadRequestBody path.
         * @member {string} path
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @instance
         */
        FSSyncStartDownloadRequestBody.prototype.path = "";

        /**
         * FSSyncStartDownloadRequestBody version.
         * @member {number|Long} version
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @instance
         */
        FSSyncStartDownloadRequestBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new FSSyncStartDownloadRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @static
         * @param {fs.IFSSyncStartDownloadRequestBody=} [properties] Properties to set
         * @returns {fs.FSSyncStartDownloadRequestBody} FSSyncStartDownloadRequestBody instance
         */
        FSSyncStartDownloadRequestBody.create = function create(properties) {
            return new FSSyncStartDownloadRequestBody(properties);
        };

        /**
         * Encodes the specified FSSyncStartDownloadRequestBody message. Does not implicitly {@link fs.FSSyncStartDownloadRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @static
         * @param {fs.IFSSyncStartDownloadRequestBody} message FSSyncStartDownloadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncStartDownloadRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.version);
            return writer;
        };

        /**
         * Encodes the specified FSSyncStartDownloadRequestBody message, length delimited. Does not implicitly {@link fs.FSSyncStartDownloadRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @static
         * @param {fs.IFSSyncStartDownloadRequestBody} message FSSyncStartDownloadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncStartDownloadRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FSSyncStartDownloadRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FSSyncStartDownloadRequestBody} FSSyncStartDownloadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSSyncStartDownloadRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSSyncStartDownloadRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.version = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FSSyncStartDownloadRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FSSyncStartDownloadRequestBody} FSSyncStartDownloadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSSyncStartDownloadRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FSSyncStartDownloadRequestBody message.
         * @function verify
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSSyncStartDownloadRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            return null;
        };

        /**
         * Creates a FSSyncStartDownloadRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSSyncStartDownloadRequestBody} FSSyncStartDownloadRequestBody
         */
        FSSyncStartDownloadRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FSSyncStartDownloadRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FSSyncStartDownloadRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FSSyncStartDownloadRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from a FSSyncStartDownloadRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @static
         * @param {fs.FSSyncStartDownloadRequestBody} message FSSyncStartDownloadRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSSyncStartDownloadRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            return object;
        };

        /**
         * Converts this FSSyncStartDownloadRequestBody to JSON.
         * @function toJSON
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FSSyncStartDownloadRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FSSyncStartDownloadRequestBody
         * @function getTypeUrl
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FSSyncStartDownloadRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FSSyncStartDownloadRequestBody";
        };

        return FSSyncStartDownloadRequestBody;
    })();

    fs.AdoptRemoteRequestBody = (function() {

        /**
         * Properties of an AdoptRemoteRequestBody.
         * @memberof fs
         * @interface IAdoptRemoteRequestBody
         * @property {string|null} [path] AdoptRemoteRequestBody path
         * @property {file.IOptionsToAdopteRemote|null} [opts] AdoptRemoteRequestBody opts
         */

        /**
         * Constructs a new AdoptRemoteRequestBody.
         * @memberof fs
         * @classdesc Represents an AdoptRemoteRequestBody.
         * @implements IAdoptRemoteRequestBody
         * @constructor
         * @param {fs.IAdoptRemoteRequestBody=} [properties] Properties to set
         */
        function AdoptRemoteRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * AdoptRemoteRequestBody path.
         * @member {string} path
         * @memberof fs.AdoptRemoteRequestBody
         * @instance
         */
        AdoptRemoteRequestBody.prototype.path = "";

        /**
         * AdoptRemoteRequestBody opts.
         * @member {file.IOptionsToAdopteRemote|null|undefined} opts
         * @memberof fs.AdoptRemoteRequestBody
         * @instance
         */
        AdoptRemoteRequestBody.prototype.opts = null;

        /**
         * Creates a new AdoptRemoteRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.AdoptRemoteRequestBody
         * @static
         * @param {fs.IAdoptRemoteRequestBody=} [properties] Properties to set
         * @returns {fs.AdoptRemoteRequestBody} AdoptRemoteRequestBody instance
         */
        AdoptRemoteRequestBody.create = function create(properties) {
            return new AdoptRemoteRequestBody(properties);
        };

        /**
         * Encodes the specified AdoptRemoteRequestBody message. Does not implicitly {@link fs.AdoptRemoteRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.AdoptRemoteRequestBody
         * @static
         * @param {fs.IAdoptRemoteRequestBody} message AdoptRemoteRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AdoptRemoteRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.file.OptionsToAdopteRemote.encode(message.opts, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified AdoptRemoteRequestBody message, length delimited. Does not implicitly {@link fs.AdoptRemoteRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.AdoptRemoteRequestBody
         * @static
         * @param {fs.IAdoptRemoteRequestBody} message AdoptRemoteRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AdoptRemoteRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an AdoptRemoteRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.AdoptRemoteRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.AdoptRemoteRequestBody} AdoptRemoteRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AdoptRemoteRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.AdoptRemoteRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.opts = $root.file.OptionsToAdopteRemote.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an AdoptRemoteRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.AdoptRemoteRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.AdoptRemoteRequestBody} AdoptRemoteRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AdoptRemoteRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an AdoptRemoteRequestBody message.
         * @function verify
         * @memberof fs.AdoptRemoteRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        AdoptRemoteRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts")) {
                var error = $root.file.OptionsToAdopteRemote.verify(message.opts, long + 1);
                if (error)
                    return "opts." + error;
            }
            return null;
        };

        /**
         * Creates an AdoptRemoteRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.AdoptRemoteRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.AdoptRemoteRequestBody} AdoptRemoteRequestBody
         */
        AdoptRemoteRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.AdoptRemoteRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.AdoptRemoteRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.AdoptRemoteRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.opts != null) {
                if (!$util.isObject(object.opts))
                    throw TypeError(".fs.AdoptRemoteRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToAdopteRemote.fromObject(object.opts, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an AdoptRemoteRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.AdoptRemoteRequestBody
         * @static
         * @param {fs.AdoptRemoteRequestBody} message AdoptRemoteRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        AdoptRemoteRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.opts = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                object.opts = $root.file.OptionsToAdopteRemote.toObject(message.opts, options, q + 1);
            return object;
        };

        /**
         * Converts this AdoptRemoteRequestBody to JSON.
         * @function toJSON
         * @memberof fs.AdoptRemoteRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        AdoptRemoteRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for AdoptRemoteRequestBody
         * @function getTypeUrl
         * @memberof fs.AdoptRemoteRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        AdoptRemoteRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.AdoptRemoteRequestBody";
        };

        return AdoptRemoteRequestBody;
    })();

    fs.DiffCurrentAndRemoteFileVersionsRequestBody = (function() {

        /**
         * Properties of a DiffCurrentAndRemoteFileVersionsRequestBody.
         * @memberof fs
         * @interface IDiffCurrentAndRemoteFileVersionsRequestBody
         * @property {string|null} [path] DiffCurrentAndRemoteFileVersionsRequestBody path
         * @property {file.IOptionsToDiffFileVersions|null} [opts] DiffCurrentAndRemoteFileVersionsRequestBody opts
         */

        /**
         * Constructs a new DiffCurrentAndRemoteFileVersionsRequestBody.
         * @memberof fs
         * @classdesc Represents a DiffCurrentAndRemoteFileVersionsRequestBody.
         * @implements IDiffCurrentAndRemoteFileVersionsRequestBody
         * @constructor
         * @param {fs.IDiffCurrentAndRemoteFileVersionsRequestBody=} [properties] Properties to set
         */
        function DiffCurrentAndRemoteFileVersionsRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * DiffCurrentAndRemoteFileVersionsRequestBody path.
         * @member {string} path
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @instance
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.prototype.path = "";

        /**
         * DiffCurrentAndRemoteFileVersionsRequestBody opts.
         * @member {file.IOptionsToDiffFileVersions|null|undefined} opts
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @instance
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.prototype.opts = null;

        /**
         * Creates a new DiffCurrentAndRemoteFileVersionsRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @static
         * @param {fs.IDiffCurrentAndRemoteFileVersionsRequestBody=} [properties] Properties to set
         * @returns {fs.DiffCurrentAndRemoteFileVersionsRequestBody} DiffCurrentAndRemoteFileVersionsRequestBody instance
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.create = function create(properties) {
            return new DiffCurrentAndRemoteFileVersionsRequestBody(properties);
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteFileVersionsRequestBody message. Does not implicitly {@link fs.DiffCurrentAndRemoteFileVersionsRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @static
         * @param {fs.IDiffCurrentAndRemoteFileVersionsRequestBody} message DiffCurrentAndRemoteFileVersionsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.file.OptionsToDiffFileVersions.encode(message.opts, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteFileVersionsRequestBody message, length delimited. Does not implicitly {@link fs.DiffCurrentAndRemoteFileVersionsRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @static
         * @param {fs.IDiffCurrentAndRemoteFileVersionsRequestBody} message DiffCurrentAndRemoteFileVersionsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a DiffCurrentAndRemoteFileVersionsRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.DiffCurrentAndRemoteFileVersionsRequestBody} DiffCurrentAndRemoteFileVersionsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.DiffCurrentAndRemoteFileVersionsRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.opts = $root.file.OptionsToDiffFileVersions.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a DiffCurrentAndRemoteFileVersionsRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.DiffCurrentAndRemoteFileVersionsRequestBody} DiffCurrentAndRemoteFileVersionsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a DiffCurrentAndRemoteFileVersionsRequestBody message.
         * @function verify
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts")) {
                var error = $root.file.OptionsToDiffFileVersions.verify(message.opts, long + 1);
                if (error)
                    return "opts." + error;
            }
            return null;
        };

        /**
         * Creates a DiffCurrentAndRemoteFileVersionsRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.DiffCurrentAndRemoteFileVersionsRequestBody} DiffCurrentAndRemoteFileVersionsRequestBody
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.DiffCurrentAndRemoteFileVersionsRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.DiffCurrentAndRemoteFileVersionsRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.DiffCurrentAndRemoteFileVersionsRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.opts != null) {
                if (!$util.isObject(object.opts))
                    throw TypeError(".fs.DiffCurrentAndRemoteFileVersionsRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToDiffFileVersions.fromObject(object.opts, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a DiffCurrentAndRemoteFileVersionsRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @static
         * @param {fs.DiffCurrentAndRemoteFileVersionsRequestBody} message DiffCurrentAndRemoteFileVersionsRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.opts = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                object.opts = $root.file.OptionsToDiffFileVersions.toObject(message.opts, options, q + 1);
            return object;
        };

        /**
         * Converts this DiffCurrentAndRemoteFileVersionsRequestBody to JSON.
         * @function toJSON
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for DiffCurrentAndRemoteFileVersionsRequestBody
         * @function getTypeUrl
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.DiffCurrentAndRemoteFileVersionsRequestBody";
        };

        return DiffCurrentAndRemoteFileVersionsRequestBody;
    })();

    fs.DiffCurrentAndRemoteFolderVersionsRequestBody = (function() {

        /**
         * Properties of a DiffCurrentAndRemoteFolderVersionsRequestBody.
         * @memberof fs
         * @interface IDiffCurrentAndRemoteFolderVersionsRequestBody
         * @property {string|null} [path] DiffCurrentAndRemoteFolderVersionsRequestBody path
         * @property {common.IUInt64Value|null} [remoteVersion] DiffCurrentAndRemoteFolderVersionsRequestBody remoteVersion
         */

        /**
         * Constructs a new DiffCurrentAndRemoteFolderVersionsRequestBody.
         * @memberof fs
         * @classdesc Represents a DiffCurrentAndRemoteFolderVersionsRequestBody.
         * @implements IDiffCurrentAndRemoteFolderVersionsRequestBody
         * @constructor
         * @param {fs.IDiffCurrentAndRemoteFolderVersionsRequestBody=} [properties] Properties to set
         */
        function DiffCurrentAndRemoteFolderVersionsRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * DiffCurrentAndRemoteFolderVersionsRequestBody path.
         * @member {string} path
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @instance
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.prototype.path = "";

        /**
         * DiffCurrentAndRemoteFolderVersionsRequestBody remoteVersion.
         * @member {common.IUInt64Value|null|undefined} remoteVersion
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @instance
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.prototype.remoteVersion = null;

        /**
         * Creates a new DiffCurrentAndRemoteFolderVersionsRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @static
         * @param {fs.IDiffCurrentAndRemoteFolderVersionsRequestBody=} [properties] Properties to set
         * @returns {fs.DiffCurrentAndRemoteFolderVersionsRequestBody} DiffCurrentAndRemoteFolderVersionsRequestBody instance
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.create = function create(properties) {
            return new DiffCurrentAndRemoteFolderVersionsRequestBody(properties);
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteFolderVersionsRequestBody message. Does not implicitly {@link fs.DiffCurrentAndRemoteFolderVersionsRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @static
         * @param {fs.IDiffCurrentAndRemoteFolderVersionsRequestBody} message DiffCurrentAndRemoteFolderVersionsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteFolderVersionsRequestBody message, length delimited. Does not implicitly {@link fs.DiffCurrentAndRemoteFolderVersionsRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @static
         * @param {fs.IDiffCurrentAndRemoteFolderVersionsRequestBody} message DiffCurrentAndRemoteFolderVersionsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a DiffCurrentAndRemoteFolderVersionsRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.DiffCurrentAndRemoteFolderVersionsRequestBody} DiffCurrentAndRemoteFolderVersionsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.DiffCurrentAndRemoteFolderVersionsRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a DiffCurrentAndRemoteFolderVersionsRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.DiffCurrentAndRemoteFolderVersionsRequestBody} DiffCurrentAndRemoteFolderVersionsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a DiffCurrentAndRemoteFolderVersionsRequestBody message.
         * @function verify
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion, long + 1);
                if (error)
                    return "remoteVersion." + error;
            }
            return null;
        };

        /**
         * Creates a DiffCurrentAndRemoteFolderVersionsRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.DiffCurrentAndRemoteFolderVersionsRequestBody} DiffCurrentAndRemoteFolderVersionsRequestBody
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.DiffCurrentAndRemoteFolderVersionsRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.DiffCurrentAndRemoteFolderVersionsRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.DiffCurrentAndRemoteFolderVersionsRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.remoteVersion != null) {
                if (!$util.isObject(object.remoteVersion))
                    throw TypeError(".fs.DiffCurrentAndRemoteFolderVersionsRequestBody.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a DiffCurrentAndRemoteFolderVersionsRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @static
         * @param {fs.DiffCurrentAndRemoteFolderVersionsRequestBody} message DiffCurrentAndRemoteFolderVersionsRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.remoteVersion = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options, q + 1);
            return object;
        };

        /**
         * Converts this DiffCurrentAndRemoteFolderVersionsRequestBody to JSON.
         * @function toJSON
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for DiffCurrentAndRemoteFolderVersionsRequestBody
         * @function getTypeUrl
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.DiffCurrentAndRemoteFolderVersionsRequestBody";
        };

        return DiffCurrentAndRemoteFolderVersionsRequestBody;
    })();

    fs.DiffCurrentAndRemoteReplyBody = (function() {

        /**
         * Properties of a DiffCurrentAndRemoteReplyBody.
         * @memberof fs
         * @interface IDiffCurrentAndRemoteReplyBody
         * @property {fs.IFolderDiff|null} [diff] DiffCurrentAndRemoteReplyBody diff
         */

        /**
         * Constructs a new DiffCurrentAndRemoteReplyBody.
         * @memberof fs
         * @classdesc Represents a DiffCurrentAndRemoteReplyBody.
         * @implements IDiffCurrentAndRemoteReplyBody
         * @constructor
         * @param {fs.IDiffCurrentAndRemoteReplyBody=} [properties] Properties to set
         */
        function DiffCurrentAndRemoteReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * DiffCurrentAndRemoteReplyBody diff.
         * @member {fs.IFolderDiff|null|undefined} diff
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @instance
         */
        DiffCurrentAndRemoteReplyBody.prototype.diff = null;

        /**
         * Creates a new DiffCurrentAndRemoteReplyBody instance using the specified properties.
         * @function create
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {fs.IDiffCurrentAndRemoteReplyBody=} [properties] Properties to set
         * @returns {fs.DiffCurrentAndRemoteReplyBody} DiffCurrentAndRemoteReplyBody instance
         */
        DiffCurrentAndRemoteReplyBody.create = function create(properties) {
            return new DiffCurrentAndRemoteReplyBody(properties);
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteReplyBody message. Does not implicitly {@link fs.DiffCurrentAndRemoteReplyBody.verify|verify} messages.
         * @function encode
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {fs.IDiffCurrentAndRemoteReplyBody} message DiffCurrentAndRemoteReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.diff != null && Object.hasOwnProperty.call(message, "diff"))
                $root.fs.FolderDiff.encode(message.diff, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteReplyBody message, length delimited. Does not implicitly {@link fs.DiffCurrentAndRemoteReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {fs.IDiffCurrentAndRemoteReplyBody} message DiffCurrentAndRemoteReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a DiffCurrentAndRemoteReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.DiffCurrentAndRemoteReplyBody} DiffCurrentAndRemoteReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.DiffCurrentAndRemoteReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.diff = $root.fs.FolderDiff.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a DiffCurrentAndRemoteReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.DiffCurrentAndRemoteReplyBody} DiffCurrentAndRemoteReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a DiffCurrentAndRemoteReplyBody message.
         * @function verify
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        DiffCurrentAndRemoteReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.diff != null && Object.hasOwnProperty.call(message, "diff")) {
                var error = $root.fs.FolderDiff.verify(message.diff, long + 1);
                if (error)
                    return "diff." + error;
            }
            return null;
        };

        /**
         * Creates a DiffCurrentAndRemoteReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.DiffCurrentAndRemoteReplyBody} DiffCurrentAndRemoteReplyBody
         */
        DiffCurrentAndRemoteReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.DiffCurrentAndRemoteReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.DiffCurrentAndRemoteReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.DiffCurrentAndRemoteReplyBody();
            if (object.diff != null) {
                if (!$util.isObject(object.diff))
                    throw TypeError(".fs.DiffCurrentAndRemoteReplyBody.diff: object expected");
                message.diff = $root.fs.FolderDiff.fromObject(object.diff, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a DiffCurrentAndRemoteReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {fs.DiffCurrentAndRemoteReplyBody} message DiffCurrentAndRemoteReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        DiffCurrentAndRemoteReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.diff = null;
            if (message.diff != null && Object.hasOwnProperty.call(message, "diff"))
                object.diff = $root.fs.FolderDiff.toObject(message.diff, options, q + 1);
            return object;
        };

        /**
         * Converts this DiffCurrentAndRemoteReplyBody to JSON.
         * @function toJSON
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        DiffCurrentAndRemoteReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for DiffCurrentAndRemoteReplyBody
         * @function getTypeUrl
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        DiffCurrentAndRemoteReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.DiffCurrentAndRemoteReplyBody";
        };

        return DiffCurrentAndRemoteReplyBody;
    })();

    fs.FolderDiff = (function() {

        /**
         * Properties of a FolderDiff.
         * @memberof fs
         * @interface IFolderDiff
         * @property {number|Long|null} [currentVersion] FolderDiff currentVersion
         * @property {boolean|null} [isCurrentLocal] FolderDiff isCurrentLocal
         * @property {common.IUInt64Value|null} [remoteVersion] FolderDiff remoteVersion
         * @property {common.IUInt64Value|null} [syncedVersion] FolderDiff syncedVersion
         * @property {boolean|null} [isRemoteRemoved] FolderDiff isRemoteRemoved
         * @property {file.ITimeStampsDiff|null} [ctime] FolderDiff ctime
         * @property {file.ITimeStampsDiff|null} [mtime] FolderDiff mtime
         * @property {Array.<file.IXAttrDiff>|null} [xattrs] FolderDiff xattrs
         * @property {fs.FolderDiff.IItemsByBranches|null} [removed] FolderDiff removed
         * @property {Array.<fs.FolderDiff.IRenamed>|null} [renamed] FolderDiff renamed
         * @property {fs.FolderDiff.IItemsByBranches|null} [added] FolderDiff added
         * @property {Array.<fs.FolderDiff.IRekeyed>|null} [rekeyed] FolderDiff rekeyed
         * @property {Array.<string>|null} [nameOverlaps] FolderDiff nameOverlaps
         */

        /**
         * Constructs a new FolderDiff.
         * @memberof fs
         * @classdesc Represents a FolderDiff.
         * @implements IFolderDiff
         * @constructor
         * @param {fs.IFolderDiff=} [properties] Properties to set
         */
        function FolderDiff(properties) {
            this.xattrs = [];
            this.renamed = [];
            this.rekeyed = [];
            this.nameOverlaps = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FolderDiff currentVersion.
         * @member {number|Long} currentVersion
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.currentVersion = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * FolderDiff isCurrentLocal.
         * @member {boolean} isCurrentLocal
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.isCurrentLocal = false;

        /**
         * FolderDiff remoteVersion.
         * @member {common.IUInt64Value|null|undefined} remoteVersion
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.remoteVersion = null;

        /**
         * FolderDiff syncedVersion.
         * @member {common.IUInt64Value|null|undefined} syncedVersion
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.syncedVersion = null;

        /**
         * FolderDiff isRemoteRemoved.
         * @member {boolean} isRemoteRemoved
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.isRemoteRemoved = false;

        /**
         * FolderDiff ctime.
         * @member {file.ITimeStampsDiff|null|undefined} ctime
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.ctime = null;

        /**
         * FolderDiff mtime.
         * @member {file.ITimeStampsDiff|null|undefined} mtime
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.mtime = null;

        /**
         * FolderDiff xattrs.
         * @member {Array.<file.IXAttrDiff>} xattrs
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.xattrs = $util.emptyArray;

        /**
         * FolderDiff removed.
         * @member {fs.FolderDiff.IItemsByBranches|null|undefined} removed
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.removed = null;

        /**
         * FolderDiff renamed.
         * @member {Array.<fs.FolderDiff.IRenamed>} renamed
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.renamed = $util.emptyArray;

        /**
         * FolderDiff added.
         * @member {fs.FolderDiff.IItemsByBranches|null|undefined} added
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.added = null;

        /**
         * FolderDiff rekeyed.
         * @member {Array.<fs.FolderDiff.IRekeyed>} rekeyed
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.rekeyed = $util.emptyArray;

        /**
         * FolderDiff nameOverlaps.
         * @member {Array.<string>} nameOverlaps
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.nameOverlaps = $util.emptyArray;

        /**
         * Creates a new FolderDiff instance using the specified properties.
         * @function create
         * @memberof fs.FolderDiff
         * @static
         * @param {fs.IFolderDiff=} [properties] Properties to set
         * @returns {fs.FolderDiff} FolderDiff instance
         */
        FolderDiff.create = function create(properties) {
            return new FolderDiff(properties);
        };

        /**
         * Encodes the specified FolderDiff message. Does not implicitly {@link fs.FolderDiff.verify|verify} messages.
         * @function encode
         * @memberof fs.FolderDiff
         * @static
         * @param {fs.IFolderDiff} message FolderDiff message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FolderDiff.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.currentVersion);
            if (message.isCurrentLocal != null && Object.hasOwnProperty.call(message, "isCurrentLocal"))
                writer.uint32(/* id 2, wireType 0 =*/16).bool(message.isCurrentLocal);
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.syncedVersion != null && Object.hasOwnProperty.call(message, "syncedVersion"))
                $root.common.UInt64Value.encode(message.syncedVersion, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            if (message.isRemoteRemoved != null && Object.hasOwnProperty.call(message, "isRemoteRemoved"))
                writer.uint32(/* id 5, wireType 0 =*/40).bool(message.isRemoteRemoved);
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime"))
                $root.file.TimeStampsDiff.encode(message.ctime, writer.uint32(/* id 6, wireType 2 =*/50).fork(), q + 1).ldelim();
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime"))
                $root.file.TimeStampsDiff.encode(message.mtime, writer.uint32(/* id 7, wireType 2 =*/58).fork(), q + 1).ldelim();
            if (message.xattrs != null && message.xattrs.length)
                for (var i = 0; i < message.xattrs.length; ++i)
                    $root.file.XAttrDiff.encode(message.xattrs[i], writer.uint32(/* id 8, wireType 2 =*/66).fork(), q + 1).ldelim();
            if (message.removed != null && Object.hasOwnProperty.call(message, "removed"))
                $root.fs.FolderDiff.ItemsByBranches.encode(message.removed, writer.uint32(/* id 11, wireType 2 =*/90).fork(), q + 1).ldelim();
            if (message.renamed != null && message.renamed.length)
                for (var i = 0; i < message.renamed.length; ++i)
                    $root.fs.FolderDiff.Renamed.encode(message.renamed[i], writer.uint32(/* id 12, wireType 2 =*/98).fork(), q + 1).ldelim();
            if (message.added != null && Object.hasOwnProperty.call(message, "added"))
                $root.fs.FolderDiff.ItemsByBranches.encode(message.added, writer.uint32(/* id 13, wireType 2 =*/106).fork(), q + 1).ldelim();
            if (message.rekeyed != null && message.rekeyed.length)
                for (var i = 0; i < message.rekeyed.length; ++i)
                    $root.fs.FolderDiff.Rekeyed.encode(message.rekeyed[i], writer.uint32(/* id 14, wireType 2 =*/114).fork(), q + 1).ldelim();
            if (message.nameOverlaps != null && message.nameOverlaps.length)
                for (var i = 0; i < message.nameOverlaps.length; ++i)
                    writer.uint32(/* id 15, wireType 2 =*/122).string(message.nameOverlaps[i]);
            return writer;
        };

        /**
         * Encodes the specified FolderDiff message, length delimited. Does not implicitly {@link fs.FolderDiff.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FolderDiff
         * @static
         * @param {fs.IFolderDiff} message FolderDiff message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FolderDiff.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FolderDiff message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FolderDiff
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FolderDiff} FolderDiff
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FolderDiff.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FolderDiff();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.currentVersion = reader.uint64();
                        break;
                    }
                case 2: {
                        message.isCurrentLocal = reader.bool();
                        break;
                    }
                case 3: {
                        message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.syncedVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 5: {
                        message.isRemoteRemoved = reader.bool();
                        break;
                    }
                case 6: {
                        message.ctime = $root.file.TimeStampsDiff.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 7: {
                        message.mtime = $root.file.TimeStampsDiff.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 8: {
                        if (!(message.xattrs && message.xattrs.length))
                            message.xattrs = [];
                        message.xattrs.push($root.file.XAttrDiff.decode(reader, reader.uint32(), undefined, long + 1));
                        break;
                    }
                case 11: {
                        message.removed = $root.fs.FolderDiff.ItemsByBranches.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 12: {
                        if (!(message.renamed && message.renamed.length))
                            message.renamed = [];
                        message.renamed.push($root.fs.FolderDiff.Renamed.decode(reader, reader.uint32(), undefined, long + 1));
                        break;
                    }
                case 13: {
                        message.added = $root.fs.FolderDiff.ItemsByBranches.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 14: {
                        if (!(message.rekeyed && message.rekeyed.length))
                            message.rekeyed = [];
                        message.rekeyed.push($root.fs.FolderDiff.Rekeyed.decode(reader, reader.uint32(), undefined, long + 1));
                        break;
                    }
                case 15: {
                        if (!(message.nameOverlaps && message.nameOverlaps.length))
                            message.nameOverlaps = [];
                        message.nameOverlaps.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FolderDiff message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FolderDiff
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FolderDiff} FolderDiff
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FolderDiff.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FolderDiff message.
         * @function verify
         * @memberof fs.FolderDiff
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FolderDiff.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                if (!$util.isInteger(message.currentVersion) && !(message.currentVersion && $util.isInteger(message.currentVersion.low) && $util.isInteger(message.currentVersion.high)))
                    return "currentVersion: integer|Long expected";
            if (message.isCurrentLocal != null && Object.hasOwnProperty.call(message, "isCurrentLocal"))
                if (typeof message.isCurrentLocal !== "boolean")
                    return "isCurrentLocal: boolean expected";
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion, long + 1);
                if (error)
                    return "remoteVersion." + error;
            }
            if (message.syncedVersion != null && Object.hasOwnProperty.call(message, "syncedVersion")) {
                var error = $root.common.UInt64Value.verify(message.syncedVersion, long + 1);
                if (error)
                    return "syncedVersion." + error;
            }
            if (message.isRemoteRemoved != null && Object.hasOwnProperty.call(message, "isRemoteRemoved"))
                if (typeof message.isRemoteRemoved !== "boolean")
                    return "isRemoteRemoved: boolean expected";
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime")) {
                var error = $root.file.TimeStampsDiff.verify(message.ctime, long + 1);
                if (error)
                    return "ctime." + error;
            }
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime")) {
                var error = $root.file.TimeStampsDiff.verify(message.mtime, long + 1);
                if (error)
                    return "mtime." + error;
            }
            if (message.xattrs != null && Object.hasOwnProperty.call(message, "xattrs")) {
                if (!Array.isArray(message.xattrs))
                    return "xattrs: array expected";
                for (var i = 0; i < message.xattrs.length; ++i) {
                    var error = $root.file.XAttrDiff.verify(message.xattrs[i], long + 1);
                    if (error)
                        return "xattrs." + error;
                }
            }
            if (message.removed != null && Object.hasOwnProperty.call(message, "removed")) {
                var error = $root.fs.FolderDiff.ItemsByBranches.verify(message.removed, long + 1);
                if (error)
                    return "removed." + error;
            }
            if (message.renamed != null && Object.hasOwnProperty.call(message, "renamed")) {
                if (!Array.isArray(message.renamed))
                    return "renamed: array expected";
                for (var i = 0; i < message.renamed.length; ++i) {
                    var error = $root.fs.FolderDiff.Renamed.verify(message.renamed[i], long + 1);
                    if (error)
                        return "renamed." + error;
                }
            }
            if (message.added != null && Object.hasOwnProperty.call(message, "added")) {
                var error = $root.fs.FolderDiff.ItemsByBranches.verify(message.added, long + 1);
                if (error)
                    return "added." + error;
            }
            if (message.rekeyed != null && Object.hasOwnProperty.call(message, "rekeyed")) {
                if (!Array.isArray(message.rekeyed))
                    return "rekeyed: array expected";
                for (var i = 0; i < message.rekeyed.length; ++i) {
                    var error = $root.fs.FolderDiff.Rekeyed.verify(message.rekeyed[i], long + 1);
                    if (error)
                        return "rekeyed." + error;
                }
            }
            if (message.nameOverlaps != null && Object.hasOwnProperty.call(message, "nameOverlaps")) {
                if (!Array.isArray(message.nameOverlaps))
                    return "nameOverlaps: array expected";
                for (var i = 0; i < message.nameOverlaps.length; ++i)
                    if (!$util.isString(message.nameOverlaps[i]))
                        return "nameOverlaps: string[] expected";
            }
            return null;
        };

        /**
         * Creates a FolderDiff message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FolderDiff
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FolderDiff} FolderDiff
         */
        FolderDiff.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FolderDiff)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FolderDiff: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FolderDiff();
            if (object.currentVersion != null)
                if ($util.Long)
                    message.currentVersion = $util.Long.fromValue(object.currentVersion, true);
                else if (typeof object.currentVersion === "string")
                    message.currentVersion = parseInt(object.currentVersion, 10);
                else if (typeof object.currentVersion === "number")
                    message.currentVersion = object.currentVersion;
                else if (typeof object.currentVersion === "object")
                    message.currentVersion = new $util.LongBits(object.currentVersion.low >>> 0, object.currentVersion.high >>> 0).toNumber(true);
            if (object.isCurrentLocal != null)
                message.isCurrentLocal = Boolean(object.isCurrentLocal);
            if (object.remoteVersion != null) {
                if (!$util.isObject(object.remoteVersion))
                    throw TypeError(".fs.FolderDiff.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion, long + 1);
            }
            if (object.syncedVersion != null) {
                if (!$util.isObject(object.syncedVersion))
                    throw TypeError(".fs.FolderDiff.syncedVersion: object expected");
                message.syncedVersion = $root.common.UInt64Value.fromObject(object.syncedVersion, long + 1);
            }
            if (object.isRemoteRemoved != null)
                message.isRemoteRemoved = Boolean(object.isRemoteRemoved);
            if (object.ctime != null) {
                if (!$util.isObject(object.ctime))
                    throw TypeError(".fs.FolderDiff.ctime: object expected");
                message.ctime = $root.file.TimeStampsDiff.fromObject(object.ctime, long + 1);
            }
            if (object.mtime != null) {
                if (!$util.isObject(object.mtime))
                    throw TypeError(".fs.FolderDiff.mtime: object expected");
                message.mtime = $root.file.TimeStampsDiff.fromObject(object.mtime, long + 1);
            }
            if (object.xattrs) {
                if (!Array.isArray(object.xattrs))
                    throw TypeError(".fs.FolderDiff.xattrs: array expected");
                message.xattrs = [];
                for (var i = 0; i < object.xattrs.length; ++i) {
                    if (!$util.isObject(object.xattrs[i]))
                        throw TypeError(".fs.FolderDiff.xattrs: object expected");
                    message.xattrs[i] = $root.file.XAttrDiff.fromObject(object.xattrs[i], long + 1);
                }
            }
            if (object.removed != null) {
                if (!$util.isObject(object.removed))
                    throw TypeError(".fs.FolderDiff.removed: object expected");
                message.removed = $root.fs.FolderDiff.ItemsByBranches.fromObject(object.removed, long + 1);
            }
            if (object.renamed) {
                if (!Array.isArray(object.renamed))
                    throw TypeError(".fs.FolderDiff.renamed: array expected");
                message.renamed = [];
                for (var i = 0; i < object.renamed.length; ++i) {
                    if (!$util.isObject(object.renamed[i]))
                        throw TypeError(".fs.FolderDiff.renamed: object expected");
                    message.renamed[i] = $root.fs.FolderDiff.Renamed.fromObject(object.renamed[i], long + 1);
                }
            }
            if (object.added != null) {
                if (!$util.isObject(object.added))
                    throw TypeError(".fs.FolderDiff.added: object expected");
                message.added = $root.fs.FolderDiff.ItemsByBranches.fromObject(object.added, long + 1);
            }
            if (object.rekeyed) {
                if (!Array.isArray(object.rekeyed))
                    throw TypeError(".fs.FolderDiff.rekeyed: array expected");
                message.rekeyed = [];
                for (var i = 0; i < object.rekeyed.length; ++i) {
                    if (!$util.isObject(object.rekeyed[i]))
                        throw TypeError(".fs.FolderDiff.rekeyed: object expected");
                    message.rekeyed[i] = $root.fs.FolderDiff.Rekeyed.fromObject(object.rekeyed[i], long + 1);
                }
            }
            if (object.nameOverlaps) {
                if (!Array.isArray(object.nameOverlaps))
                    throw TypeError(".fs.FolderDiff.nameOverlaps: array expected");
                message.nameOverlaps = [];
                for (var i = 0; i < object.nameOverlaps.length; ++i)
                    message.nameOverlaps[i] = String(object.nameOverlaps[i]);
            }
            return message;
        };

        /**
         * Creates a plain object from a FolderDiff message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FolderDiff
         * @static
         * @param {fs.FolderDiff} message FolderDiff
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FolderDiff.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults) {
                object.xattrs = [];
                object.renamed = [];
                object.rekeyed = [];
                object.nameOverlaps = [];
            }
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.currentVersion = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.currentVersion = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.isCurrentLocal = false;
                object.remoteVersion = null;
                object.syncedVersion = null;
                object.isRemoteRemoved = false;
                object.ctime = null;
                object.mtime = null;
                object.removed = null;
                object.added = null;
            }
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.currentVersion = typeof message.currentVersion === "number" ? BigInt(message.currentVersion) : $util.Long.fromBits(message.currentVersion.low >>> 0, message.currentVersion.high >>> 0, true).toBigInt();
                else if (typeof message.currentVersion === "number")
                    object.currentVersion = options.longs === String ? String(message.currentVersion) : message.currentVersion;
                else
                    object.currentVersion = options.longs === String ? $util.Long.prototype.toString.call(message.currentVersion) : options.longs === Number ? new $util.LongBits(message.currentVersion.low >>> 0, message.currentVersion.high >>> 0).toNumber(true) : message.currentVersion;
            if (message.isCurrentLocal != null && Object.hasOwnProperty.call(message, "isCurrentLocal"))
                object.isCurrentLocal = message.isCurrentLocal;
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options, q + 1);
            if (message.syncedVersion != null && Object.hasOwnProperty.call(message, "syncedVersion"))
                object.syncedVersion = $root.common.UInt64Value.toObject(message.syncedVersion, options, q + 1);
            if (message.isRemoteRemoved != null && Object.hasOwnProperty.call(message, "isRemoteRemoved"))
                object.isRemoteRemoved = message.isRemoteRemoved;
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime"))
                object.ctime = $root.file.TimeStampsDiff.toObject(message.ctime, options, q + 1);
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime"))
                object.mtime = $root.file.TimeStampsDiff.toObject(message.mtime, options, q + 1);
            if (message.xattrs && message.xattrs.length) {
                object.xattrs = [];
                for (var j = 0; j < message.xattrs.length; ++j)
                    object.xattrs[j] = $root.file.XAttrDiff.toObject(message.xattrs[j], options, q + 1);
            }
            if (message.removed != null && Object.hasOwnProperty.call(message, "removed"))
                object.removed = $root.fs.FolderDiff.ItemsByBranches.toObject(message.removed, options, q + 1);
            if (message.renamed && message.renamed.length) {
                object.renamed = [];
                for (var j = 0; j < message.renamed.length; ++j)
                    object.renamed[j] = $root.fs.FolderDiff.Renamed.toObject(message.renamed[j], options, q + 1);
            }
            if (message.added != null && Object.hasOwnProperty.call(message, "added"))
                object.added = $root.fs.FolderDiff.ItemsByBranches.toObject(message.added, options, q + 1);
            if (message.rekeyed && message.rekeyed.length) {
                object.rekeyed = [];
                for (var j = 0; j < message.rekeyed.length; ++j)
                    object.rekeyed[j] = $root.fs.FolderDiff.Rekeyed.toObject(message.rekeyed[j], options, q + 1);
            }
            if (message.nameOverlaps && message.nameOverlaps.length) {
                object.nameOverlaps = [];
                for (var j = 0; j < message.nameOverlaps.length; ++j)
                    object.nameOverlaps[j] = message.nameOverlaps[j];
            }
            return object;
        };

        /**
         * Converts this FolderDiff to JSON.
         * @function toJSON
         * @memberof fs.FolderDiff
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FolderDiff.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FolderDiff
         * @function getTypeUrl
         * @memberof fs.FolderDiff
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FolderDiff.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FolderDiff";
        };

        FolderDiff.ItemsByBranches = (function() {

            /**
             * Properties of an ItemsByBranches.
             * @memberof fs.FolderDiff
             * @interface IItemsByBranches
             * @property {Array.<string>|null} [inLocal] ItemsByBranches inLocal
             * @property {Array.<string>|null} [inRemote] ItemsByBranches inRemote
             */

            /**
             * Constructs a new ItemsByBranches.
             * @memberof fs.FolderDiff
             * @classdesc Represents an ItemsByBranches.
             * @implements IItemsByBranches
             * @constructor
             * @param {fs.FolderDiff.IItemsByBranches=} [properties] Properties to set
             */
            function ItemsByBranches(properties) {
                this.inLocal = [];
                this.inRemote = [];
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * ItemsByBranches inLocal.
             * @member {Array.<string>} inLocal
             * @memberof fs.FolderDiff.ItemsByBranches
             * @instance
             */
            ItemsByBranches.prototype.inLocal = $util.emptyArray;

            /**
             * ItemsByBranches inRemote.
             * @member {Array.<string>} inRemote
             * @memberof fs.FolderDiff.ItemsByBranches
             * @instance
             */
            ItemsByBranches.prototype.inRemote = $util.emptyArray;

            /**
             * Creates a new ItemsByBranches instance using the specified properties.
             * @function create
             * @memberof fs.FolderDiff.ItemsByBranches
             * @static
             * @param {fs.FolderDiff.IItemsByBranches=} [properties] Properties to set
             * @returns {fs.FolderDiff.ItemsByBranches} ItemsByBranches instance
             */
            ItemsByBranches.create = function create(properties) {
                return new ItemsByBranches(properties);
            };

            /**
             * Encodes the specified ItemsByBranches message. Does not implicitly {@link fs.FolderDiff.ItemsByBranches.verify|verify} messages.
             * @function encode
             * @memberof fs.FolderDiff.ItemsByBranches
             * @static
             * @param {fs.FolderDiff.IItemsByBranches} message ItemsByBranches message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            ItemsByBranches.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.inLocal != null && message.inLocal.length)
                    for (var i = 0; i < message.inLocal.length; ++i)
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.inLocal[i]);
                if (message.inRemote != null && message.inRemote.length)
                    for (var i = 0; i < message.inRemote.length; ++i)
                        writer.uint32(/* id 2, wireType 2 =*/18).string(message.inRemote[i]);
                return writer;
            };

            /**
             * Encodes the specified ItemsByBranches message, length delimited. Does not implicitly {@link fs.FolderDiff.ItemsByBranches.verify|verify} messages.
             * @function encodeDelimited
             * @memberof fs.FolderDiff.ItemsByBranches
             * @static
             * @param {fs.FolderDiff.IItemsByBranches} message ItemsByBranches message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            ItemsByBranches.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes an ItemsByBranches message from the specified reader or buffer.
             * @function decode
             * @memberof fs.FolderDiff.ItemsByBranches
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {fs.FolderDiff.ItemsByBranches} ItemsByBranches
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            ItemsByBranches.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FolderDiff.ItemsByBranches();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            if (!(message.inLocal && message.inLocal.length))
                                message.inLocal = [];
                            message.inLocal.push(reader.string());
                            break;
                        }
                    case 2: {
                            if (!(message.inRemote && message.inRemote.length))
                                message.inRemote = [];
                            message.inRemote.push(reader.string());
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes an ItemsByBranches message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof fs.FolderDiff.ItemsByBranches
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {fs.FolderDiff.ItemsByBranches} ItemsByBranches
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            ItemsByBranches.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies an ItemsByBranches message.
             * @function verify
             * @memberof fs.FolderDiff.ItemsByBranches
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            ItemsByBranches.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.inLocal != null && Object.hasOwnProperty.call(message, "inLocal")) {
                    if (!Array.isArray(message.inLocal))
                        return "inLocal: array expected";
                    for (var i = 0; i < message.inLocal.length; ++i)
                        if (!$util.isString(message.inLocal[i]))
                            return "inLocal: string[] expected";
                }
                if (message.inRemote != null && Object.hasOwnProperty.call(message, "inRemote")) {
                    if (!Array.isArray(message.inRemote))
                        return "inRemote: array expected";
                    for (var i = 0; i < message.inRemote.length; ++i)
                        if (!$util.isString(message.inRemote[i]))
                            return "inRemote: string[] expected";
                }
                return null;
            };

            /**
             * Creates an ItemsByBranches message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof fs.FolderDiff.ItemsByBranches
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {fs.FolderDiff.ItemsByBranches} ItemsByBranches
             */
            ItemsByBranches.fromObject = function fromObject(object, long) {
                if (object instanceof $root.fs.FolderDiff.ItemsByBranches)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".fs.FolderDiff.ItemsByBranches: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.fs.FolderDiff.ItemsByBranches();
                if (object.inLocal) {
                    if (!Array.isArray(object.inLocal))
                        throw TypeError(".fs.FolderDiff.ItemsByBranches.inLocal: array expected");
                    message.inLocal = [];
                    for (var i = 0; i < object.inLocal.length; ++i)
                        message.inLocal[i] = String(object.inLocal[i]);
                }
                if (object.inRemote) {
                    if (!Array.isArray(object.inRemote))
                        throw TypeError(".fs.FolderDiff.ItemsByBranches.inRemote: array expected");
                    message.inRemote = [];
                    for (var i = 0; i < object.inRemote.length; ++i)
                        message.inRemote[i] = String(object.inRemote[i]);
                }
                return message;
            };

            /**
             * Creates a plain object from an ItemsByBranches message. Also converts values to other types if specified.
             * @function toObject
             * @memberof fs.FolderDiff.ItemsByBranches
             * @static
             * @param {fs.FolderDiff.ItemsByBranches} message ItemsByBranches
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            ItemsByBranches.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.arrays || options.defaults) {
                    object.inLocal = [];
                    object.inRemote = [];
                }
                if (message.inLocal && message.inLocal.length) {
                    object.inLocal = [];
                    for (var j = 0; j < message.inLocal.length; ++j)
                        object.inLocal[j] = message.inLocal[j];
                }
                if (message.inRemote && message.inRemote.length) {
                    object.inRemote = [];
                    for (var j = 0; j < message.inRemote.length; ++j)
                        object.inRemote[j] = message.inRemote[j];
                }
                return object;
            };

            /**
             * Converts this ItemsByBranches to JSON.
             * @function toJSON
             * @memberof fs.FolderDiff.ItemsByBranches
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            ItemsByBranches.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for ItemsByBranches
             * @function getTypeUrl
             * @memberof fs.FolderDiff.ItemsByBranches
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            ItemsByBranches.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/fs.FolderDiff.ItemsByBranches";
            };

            return ItemsByBranches;
        })();

        FolderDiff.Renamed = (function() {

            /**
             * Properties of a Renamed.
             * @memberof fs.FolderDiff
             * @interface IRenamed
             * @property {string|null} [local] Renamed local
             * @property {string|null} [remote] Renamed remote
             * @property {string|null} [renamedIn] Renamed renamedIn
             */

            /**
             * Constructs a new Renamed.
             * @memberof fs.FolderDiff
             * @classdesc Represents a Renamed.
             * @implements IRenamed
             * @constructor
             * @param {fs.FolderDiff.IRenamed=} [properties] Properties to set
             */
            function Renamed(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * Renamed local.
             * @member {string} local
             * @memberof fs.FolderDiff.Renamed
             * @instance
             */
            Renamed.prototype.local = "";

            /**
             * Renamed remote.
             * @member {string} remote
             * @memberof fs.FolderDiff.Renamed
             * @instance
             */
            Renamed.prototype.remote = "";

            /**
             * Renamed renamedIn.
             * @member {string} renamedIn
             * @memberof fs.FolderDiff.Renamed
             * @instance
             */
            Renamed.prototype.renamedIn = "";

            /**
             * Creates a new Renamed instance using the specified properties.
             * @function create
             * @memberof fs.FolderDiff.Renamed
             * @static
             * @param {fs.FolderDiff.IRenamed=} [properties] Properties to set
             * @returns {fs.FolderDiff.Renamed} Renamed instance
             */
            Renamed.create = function create(properties) {
                return new Renamed(properties);
            };

            /**
             * Encodes the specified Renamed message. Does not implicitly {@link fs.FolderDiff.Renamed.verify|verify} messages.
             * @function encode
             * @memberof fs.FolderDiff.Renamed
             * @static
             * @param {fs.FolderDiff.IRenamed} message Renamed message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Renamed.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.local != null && Object.hasOwnProperty.call(message, "local"))
                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.local);
                if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.remote);
                if (message.renamedIn != null && Object.hasOwnProperty.call(message, "renamedIn"))
                    writer.uint32(/* id 3, wireType 2 =*/26).string(message.renamedIn);
                return writer;
            };

            /**
             * Encodes the specified Renamed message, length delimited. Does not implicitly {@link fs.FolderDiff.Renamed.verify|verify} messages.
             * @function encodeDelimited
             * @memberof fs.FolderDiff.Renamed
             * @static
             * @param {fs.FolderDiff.IRenamed} message Renamed message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Renamed.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes a Renamed message from the specified reader or buffer.
             * @function decode
             * @memberof fs.FolderDiff.Renamed
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {fs.FolderDiff.Renamed} Renamed
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Renamed.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FolderDiff.Renamed();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.local = reader.string();
                            break;
                        }
                    case 2: {
                            message.remote = reader.string();
                            break;
                        }
                    case 3: {
                            message.renamedIn = reader.string();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a Renamed message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof fs.FolderDiff.Renamed
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {fs.FolderDiff.Renamed} Renamed
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Renamed.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a Renamed message.
             * @function verify
             * @memberof fs.FolderDiff.Renamed
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            Renamed.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.local != null && Object.hasOwnProperty.call(message, "local"))
                    if (!$util.isString(message.local))
                        return "local: string expected";
                if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                    if (!$util.isString(message.remote))
                        return "remote: string expected";
                if (message.renamedIn != null && Object.hasOwnProperty.call(message, "renamedIn"))
                    if (!$util.isString(message.renamedIn))
                        return "renamedIn: string expected";
                return null;
            };

            /**
             * Creates a Renamed message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof fs.FolderDiff.Renamed
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {fs.FolderDiff.Renamed} Renamed
             */
            Renamed.fromObject = function fromObject(object, long) {
                if (object instanceof $root.fs.FolderDiff.Renamed)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".fs.FolderDiff.Renamed: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.fs.FolderDiff.Renamed();
                if (object.local != null)
                    message.local = String(object.local);
                if (object.remote != null)
                    message.remote = String(object.remote);
                if (object.renamedIn != null)
                    message.renamedIn = String(object.renamedIn);
                return message;
            };

            /**
             * Creates a plain object from a Renamed message. Also converts values to other types if specified.
             * @function toObject
             * @memberof fs.FolderDiff.Renamed
             * @static
             * @param {fs.FolderDiff.Renamed} message Renamed
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            Renamed.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults) {
                    object.local = "";
                    object.remote = "";
                    object.renamedIn = "";
                }
                if (message.local != null && Object.hasOwnProperty.call(message, "local"))
                    object.local = message.local;
                if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                    object.remote = message.remote;
                if (message.renamedIn != null && Object.hasOwnProperty.call(message, "renamedIn"))
                    object.renamedIn = message.renamedIn;
                return object;
            };

            /**
             * Converts this Renamed to JSON.
             * @function toJSON
             * @memberof fs.FolderDiff.Renamed
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            Renamed.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for Renamed
             * @function getTypeUrl
             * @memberof fs.FolderDiff.Renamed
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            Renamed.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/fs.FolderDiff.Renamed";
            };

            return Renamed;
        })();

        FolderDiff.Rekeyed = (function() {

            /**
             * Properties of a Rekeyed.
             * @memberof fs.FolderDiff
             * @interface IRekeyed
             * @property {string|null} [local] Rekeyed local
             * @property {string|null} [remote] Rekeyed remote
             * @property {string|null} [rekeyedIn] Rekeyed rekeyedIn
             */

            /**
             * Constructs a new Rekeyed.
             * @memberof fs.FolderDiff
             * @classdesc Represents a Rekeyed.
             * @implements IRekeyed
             * @constructor
             * @param {fs.FolderDiff.IRekeyed=} [properties] Properties to set
             */
            function Rekeyed(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * Rekeyed local.
             * @member {string} local
             * @memberof fs.FolderDiff.Rekeyed
             * @instance
             */
            Rekeyed.prototype.local = "";

            /**
             * Rekeyed remote.
             * @member {string} remote
             * @memberof fs.FolderDiff.Rekeyed
             * @instance
             */
            Rekeyed.prototype.remote = "";

            /**
             * Rekeyed rekeyedIn.
             * @member {string} rekeyedIn
             * @memberof fs.FolderDiff.Rekeyed
             * @instance
             */
            Rekeyed.prototype.rekeyedIn = "";

            /**
             * Creates a new Rekeyed instance using the specified properties.
             * @function create
             * @memberof fs.FolderDiff.Rekeyed
             * @static
             * @param {fs.FolderDiff.IRekeyed=} [properties] Properties to set
             * @returns {fs.FolderDiff.Rekeyed} Rekeyed instance
             */
            Rekeyed.create = function create(properties) {
                return new Rekeyed(properties);
            };

            /**
             * Encodes the specified Rekeyed message. Does not implicitly {@link fs.FolderDiff.Rekeyed.verify|verify} messages.
             * @function encode
             * @memberof fs.FolderDiff.Rekeyed
             * @static
             * @param {fs.FolderDiff.IRekeyed} message Rekeyed message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Rekeyed.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.local != null && Object.hasOwnProperty.call(message, "local"))
                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.local);
                if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.remote);
                if (message.rekeyedIn != null && Object.hasOwnProperty.call(message, "rekeyedIn"))
                    writer.uint32(/* id 3, wireType 2 =*/26).string(message.rekeyedIn);
                return writer;
            };

            /**
             * Encodes the specified Rekeyed message, length delimited. Does not implicitly {@link fs.FolderDiff.Rekeyed.verify|verify} messages.
             * @function encodeDelimited
             * @memberof fs.FolderDiff.Rekeyed
             * @static
             * @param {fs.FolderDiff.IRekeyed} message Rekeyed message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Rekeyed.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes a Rekeyed message from the specified reader or buffer.
             * @function decode
             * @memberof fs.FolderDiff.Rekeyed
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {fs.FolderDiff.Rekeyed} Rekeyed
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Rekeyed.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FolderDiff.Rekeyed();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.local = reader.string();
                            break;
                        }
                    case 2: {
                            message.remote = reader.string();
                            break;
                        }
                    case 3: {
                            message.rekeyedIn = reader.string();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a Rekeyed message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof fs.FolderDiff.Rekeyed
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {fs.FolderDiff.Rekeyed} Rekeyed
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Rekeyed.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a Rekeyed message.
             * @function verify
             * @memberof fs.FolderDiff.Rekeyed
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            Rekeyed.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.local != null && Object.hasOwnProperty.call(message, "local"))
                    if (!$util.isString(message.local))
                        return "local: string expected";
                if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                    if (!$util.isString(message.remote))
                        return "remote: string expected";
                if (message.rekeyedIn != null && Object.hasOwnProperty.call(message, "rekeyedIn"))
                    if (!$util.isString(message.rekeyedIn))
                        return "rekeyedIn: string expected";
                return null;
            };

            /**
             * Creates a Rekeyed message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof fs.FolderDiff.Rekeyed
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {fs.FolderDiff.Rekeyed} Rekeyed
             */
            Rekeyed.fromObject = function fromObject(object, long) {
                if (object instanceof $root.fs.FolderDiff.Rekeyed)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".fs.FolderDiff.Rekeyed: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.fs.FolderDiff.Rekeyed();
                if (object.local != null)
                    message.local = String(object.local);
                if (object.remote != null)
                    message.remote = String(object.remote);
                if (object.rekeyedIn != null)
                    message.rekeyedIn = String(object.rekeyedIn);
                return message;
            };

            /**
             * Creates a plain object from a Rekeyed message. Also converts values to other types if specified.
             * @function toObject
             * @memberof fs.FolderDiff.Rekeyed
             * @static
             * @param {fs.FolderDiff.Rekeyed} message Rekeyed
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            Rekeyed.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults) {
                    object.local = "";
                    object.remote = "";
                    object.rekeyedIn = "";
                }
                if (message.local != null && Object.hasOwnProperty.call(message, "local"))
                    object.local = message.local;
                if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                    object.remote = message.remote;
                if (message.rekeyedIn != null && Object.hasOwnProperty.call(message, "rekeyedIn"))
                    object.rekeyedIn = message.rekeyedIn;
                return object;
            };

            /**
             * Converts this Rekeyed to JSON.
             * @function toJSON
             * @memberof fs.FolderDiff.Rekeyed
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            Rekeyed.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for Rekeyed
             * @function getTypeUrl
             * @memberof fs.FolderDiff.Rekeyed
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            Rekeyed.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/fs.FolderDiff.Rekeyed";
            };

            return Rekeyed;
        })();

        return FolderDiff;
    })();

    fs.RemoteChildRequestBody = (function() {

        /**
         * Properties of a RemoteChildRequestBody.
         * @memberof fs
         * @interface IRemoteChildRequestBody
         * @property {string|null} [path] RemoteChildRequestBody path
         * @property {string|null} [remoteItemName] RemoteChildRequestBody remoteItemName
         * @property {common.IUInt64Value|null} [remoteVersion] RemoteChildRequestBody remoteVersion
         */

        /**
         * Constructs a new RemoteChildRequestBody.
         * @memberof fs
         * @classdesc Represents a RemoteChildRequestBody.
         * @implements IRemoteChildRequestBody
         * @constructor
         * @param {fs.IRemoteChildRequestBody=} [properties] Properties to set
         */
        function RemoteChildRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * RemoteChildRequestBody path.
         * @member {string} path
         * @memberof fs.RemoteChildRequestBody
         * @instance
         */
        RemoteChildRequestBody.prototype.path = "";

        /**
         * RemoteChildRequestBody remoteItemName.
         * @member {string} remoteItemName
         * @memberof fs.RemoteChildRequestBody
         * @instance
         */
        RemoteChildRequestBody.prototype.remoteItemName = "";

        /**
         * RemoteChildRequestBody remoteVersion.
         * @member {common.IUInt64Value|null|undefined} remoteVersion
         * @memberof fs.RemoteChildRequestBody
         * @instance
         */
        RemoteChildRequestBody.prototype.remoteVersion = null;

        /**
         * Creates a new RemoteChildRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.RemoteChildRequestBody
         * @static
         * @param {fs.IRemoteChildRequestBody=} [properties] Properties to set
         * @returns {fs.RemoteChildRequestBody} RemoteChildRequestBody instance
         */
        RemoteChildRequestBody.create = function create(properties) {
            return new RemoteChildRequestBody(properties);
        };

        /**
         * Encodes the specified RemoteChildRequestBody message. Does not implicitly {@link fs.RemoteChildRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.RemoteChildRequestBody
         * @static
         * @param {fs.IRemoteChildRequestBody} message RemoteChildRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        RemoteChildRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.remoteItemName != null && Object.hasOwnProperty.call(message, "remoteItemName"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.remoteItemName);
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified RemoteChildRequestBody message, length delimited. Does not implicitly {@link fs.RemoteChildRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.RemoteChildRequestBody
         * @static
         * @param {fs.IRemoteChildRequestBody} message RemoteChildRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        RemoteChildRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a RemoteChildRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.RemoteChildRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.RemoteChildRequestBody} RemoteChildRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        RemoteChildRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.RemoteChildRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.remoteItemName = reader.string();
                        break;
                    }
                case 3: {
                        message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a RemoteChildRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.RemoteChildRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.RemoteChildRequestBody} RemoteChildRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        RemoteChildRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a RemoteChildRequestBody message.
         * @function verify
         * @memberof fs.RemoteChildRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        RemoteChildRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.remoteItemName != null && Object.hasOwnProperty.call(message, "remoteItemName"))
                if (!$util.isString(message.remoteItemName))
                    return "remoteItemName: string expected";
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion, long + 1);
                if (error)
                    return "remoteVersion." + error;
            }
            return null;
        };

        /**
         * Creates a RemoteChildRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.RemoteChildRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.RemoteChildRequestBody} RemoteChildRequestBody
         */
        RemoteChildRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.RemoteChildRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.RemoteChildRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.RemoteChildRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.remoteItemName != null)
                message.remoteItemName = String(object.remoteItemName);
            if (object.remoteVersion != null) {
                if (!$util.isObject(object.remoteVersion))
                    throw TypeError(".fs.RemoteChildRequestBody.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a RemoteChildRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.RemoteChildRequestBody
         * @static
         * @param {fs.RemoteChildRequestBody} message RemoteChildRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        RemoteChildRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.remoteItemName = "";
                object.remoteVersion = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.remoteItemName != null && Object.hasOwnProperty.call(message, "remoteItemName"))
                object.remoteItemName = message.remoteItemName;
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options, q + 1);
            return object;
        };

        /**
         * Converts this RemoteChildRequestBody to JSON.
         * @function toJSON
         * @memberof fs.RemoteChildRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        RemoteChildRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for RemoteChildRequestBody
         * @function getTypeUrl
         * @memberof fs.RemoteChildRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        RemoteChildRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.RemoteChildRequestBody";
        };

        return RemoteChildRequestBody;
    })();

    fs.FSSyncUploadRequestBody = (function() {

        /**
         * Properties of a FSSyncUploadRequestBody.
         * @memberof fs
         * @interface IFSSyncUploadRequestBody
         * @property {string|null} [path] FSSyncUploadRequestBody path
         * @property {file.IOptionsToUploadLocal|null} [opts] FSSyncUploadRequestBody opts
         */

        /**
         * Constructs a new FSSyncUploadRequestBody.
         * @memberof fs
         * @classdesc Represents a FSSyncUploadRequestBody.
         * @implements IFSSyncUploadRequestBody
         * @constructor
         * @param {fs.IFSSyncUploadRequestBody=} [properties] Properties to set
         */
        function FSSyncUploadRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FSSyncUploadRequestBody path.
         * @member {string} path
         * @memberof fs.FSSyncUploadRequestBody
         * @instance
         */
        FSSyncUploadRequestBody.prototype.path = "";

        /**
         * FSSyncUploadRequestBody opts.
         * @member {file.IOptionsToUploadLocal|null|undefined} opts
         * @memberof fs.FSSyncUploadRequestBody
         * @instance
         */
        FSSyncUploadRequestBody.prototype.opts = null;

        /**
         * Creates a new FSSyncUploadRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.FSSyncUploadRequestBody
         * @static
         * @param {fs.IFSSyncUploadRequestBody=} [properties] Properties to set
         * @returns {fs.FSSyncUploadRequestBody} FSSyncUploadRequestBody instance
         */
        FSSyncUploadRequestBody.create = function create(properties) {
            return new FSSyncUploadRequestBody(properties);
        };

        /**
         * Encodes the specified FSSyncUploadRequestBody message. Does not implicitly {@link fs.FSSyncUploadRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.FSSyncUploadRequestBody
         * @static
         * @param {fs.IFSSyncUploadRequestBody} message FSSyncUploadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncUploadRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.file.OptionsToUploadLocal.encode(message.opts, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FSSyncUploadRequestBody message, length delimited. Does not implicitly {@link fs.FSSyncUploadRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FSSyncUploadRequestBody
         * @static
         * @param {fs.IFSSyncUploadRequestBody} message FSSyncUploadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncUploadRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FSSyncUploadRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FSSyncUploadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FSSyncUploadRequestBody} FSSyncUploadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSSyncUploadRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSSyncUploadRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.opts = $root.file.OptionsToUploadLocal.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FSSyncUploadRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FSSyncUploadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FSSyncUploadRequestBody} FSSyncUploadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSSyncUploadRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FSSyncUploadRequestBody message.
         * @function verify
         * @memberof fs.FSSyncUploadRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSSyncUploadRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts")) {
                var error = $root.file.OptionsToUploadLocal.verify(message.opts, long + 1);
                if (error)
                    return "opts." + error;
            }
            return null;
        };

        /**
         * Creates a FSSyncUploadRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSSyncUploadRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSSyncUploadRequestBody} FSSyncUploadRequestBody
         */
        FSSyncUploadRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FSSyncUploadRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FSSyncUploadRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FSSyncUploadRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.opts != null) {
                if (!$util.isObject(object.opts))
                    throw TypeError(".fs.FSSyncUploadRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToUploadLocal.fromObject(object.opts, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a FSSyncUploadRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSSyncUploadRequestBody
         * @static
         * @param {fs.FSSyncUploadRequestBody} message FSSyncUploadRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSSyncUploadRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.opts = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                object.opts = $root.file.OptionsToUploadLocal.toObject(message.opts, options, q + 1);
            return object;
        };

        /**
         * Converts this FSSyncUploadRequestBody to JSON.
         * @function toJSON
         * @memberof fs.FSSyncUploadRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FSSyncUploadRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FSSyncUploadRequestBody
         * @function getTypeUrl
         * @memberof fs.FSSyncUploadRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FSSyncUploadRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FSSyncUploadRequestBody";
        };

        return FSSyncUploadRequestBody;
    })();

    fs.AdoptRemoteFolderItemRequestBody = (function() {

        /**
         * Properties of an AdoptRemoteFolderItemRequestBody.
         * @memberof fs
         * @interface IAdoptRemoteFolderItemRequestBody
         * @property {string|null} [path] AdoptRemoteFolderItemRequestBody path
         * @property {string|null} [itemName] AdoptRemoteFolderItemRequestBody itemName
         * @property {fs.AdoptRemoteFolderItemRequestBody.IOptions|null} [opts] AdoptRemoteFolderItemRequestBody opts
         */

        /**
         * Constructs a new AdoptRemoteFolderItemRequestBody.
         * @memberof fs
         * @classdesc Represents an AdoptRemoteFolderItemRequestBody.
         * @implements IAdoptRemoteFolderItemRequestBody
         * @constructor
         * @param {fs.IAdoptRemoteFolderItemRequestBody=} [properties] Properties to set
         */
        function AdoptRemoteFolderItemRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * AdoptRemoteFolderItemRequestBody path.
         * @member {string} path
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @instance
         */
        AdoptRemoteFolderItemRequestBody.prototype.path = "";

        /**
         * AdoptRemoteFolderItemRequestBody itemName.
         * @member {string} itemName
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @instance
         */
        AdoptRemoteFolderItemRequestBody.prototype.itemName = "";

        /**
         * AdoptRemoteFolderItemRequestBody opts.
         * @member {fs.AdoptRemoteFolderItemRequestBody.IOptions|null|undefined} opts
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @instance
         */
        AdoptRemoteFolderItemRequestBody.prototype.opts = null;

        /**
         * Creates a new AdoptRemoteFolderItemRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @static
         * @param {fs.IAdoptRemoteFolderItemRequestBody=} [properties] Properties to set
         * @returns {fs.AdoptRemoteFolderItemRequestBody} AdoptRemoteFolderItemRequestBody instance
         */
        AdoptRemoteFolderItemRequestBody.create = function create(properties) {
            return new AdoptRemoteFolderItemRequestBody(properties);
        };

        /**
         * Encodes the specified AdoptRemoteFolderItemRequestBody message. Does not implicitly {@link fs.AdoptRemoteFolderItemRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @static
         * @param {fs.IAdoptRemoteFolderItemRequestBody} message AdoptRemoteFolderItemRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AdoptRemoteFolderItemRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.itemName != null && Object.hasOwnProperty.call(message, "itemName"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.itemName);
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.fs.AdoptRemoteFolderItemRequestBody.Options.encode(message.opts, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified AdoptRemoteFolderItemRequestBody message, length delimited. Does not implicitly {@link fs.AdoptRemoteFolderItemRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @static
         * @param {fs.IAdoptRemoteFolderItemRequestBody} message AdoptRemoteFolderItemRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AdoptRemoteFolderItemRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an AdoptRemoteFolderItemRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.AdoptRemoteFolderItemRequestBody} AdoptRemoteFolderItemRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AdoptRemoteFolderItemRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.AdoptRemoteFolderItemRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.itemName = reader.string();
                        break;
                    }
                case 3: {
                        message.opts = $root.fs.AdoptRemoteFolderItemRequestBody.Options.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an AdoptRemoteFolderItemRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.AdoptRemoteFolderItemRequestBody} AdoptRemoteFolderItemRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AdoptRemoteFolderItemRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an AdoptRemoteFolderItemRequestBody message.
         * @function verify
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        AdoptRemoteFolderItemRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.itemName != null && Object.hasOwnProperty.call(message, "itemName"))
                if (!$util.isString(message.itemName))
                    return "itemName: string expected";
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts")) {
                var error = $root.fs.AdoptRemoteFolderItemRequestBody.Options.verify(message.opts, long + 1);
                if (error)
                    return "opts." + error;
            }
            return null;
        };

        /**
         * Creates an AdoptRemoteFolderItemRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.AdoptRemoteFolderItemRequestBody} AdoptRemoteFolderItemRequestBody
         */
        AdoptRemoteFolderItemRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.AdoptRemoteFolderItemRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.AdoptRemoteFolderItemRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.AdoptRemoteFolderItemRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.itemName != null)
                message.itemName = String(object.itemName);
            if (object.opts != null) {
                if (!$util.isObject(object.opts))
                    throw TypeError(".fs.AdoptRemoteFolderItemRequestBody.opts: object expected");
                message.opts = $root.fs.AdoptRemoteFolderItemRequestBody.Options.fromObject(object.opts, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an AdoptRemoteFolderItemRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @static
         * @param {fs.AdoptRemoteFolderItemRequestBody} message AdoptRemoteFolderItemRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        AdoptRemoteFolderItemRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.itemName = "";
                object.opts = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.itemName != null && Object.hasOwnProperty.call(message, "itemName"))
                object.itemName = message.itemName;
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                object.opts = $root.fs.AdoptRemoteFolderItemRequestBody.Options.toObject(message.opts, options, q + 1);
            return object;
        };

        /**
         * Converts this AdoptRemoteFolderItemRequestBody to JSON.
         * @function toJSON
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        AdoptRemoteFolderItemRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for AdoptRemoteFolderItemRequestBody
         * @function getTypeUrl
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        AdoptRemoteFolderItemRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.AdoptRemoteFolderItemRequestBody";
        };

        AdoptRemoteFolderItemRequestBody.Options = (function() {

            /**
             * Properties of an Options.
             * @memberof fs.AdoptRemoteFolderItemRequestBody
             * @interface IOptions
             * @property {common.IUInt64Value|null} [localVersion] Options localVersion
             * @property {common.IUInt64Value|null} [uploadVersion] Options uploadVersion
             * @property {common.IBooleanValue|null} [replaceLocalItem] Options replaceLocalItem
             * @property {common.IStringValue|null} [newItemName] Options newItemName
             */

            /**
             * Constructs a new Options.
             * @memberof fs.AdoptRemoteFolderItemRequestBody
             * @classdesc Represents an Options.
             * @implements IOptions
             * @constructor
             * @param {fs.AdoptRemoteFolderItemRequestBody.IOptions=} [properties] Properties to set
             */
            function Options(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * Options localVersion.
             * @member {common.IUInt64Value|null|undefined} localVersion
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @instance
             */
            Options.prototype.localVersion = null;

            /**
             * Options uploadVersion.
             * @member {common.IUInt64Value|null|undefined} uploadVersion
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @instance
             */
            Options.prototype.uploadVersion = null;

            /**
             * Options replaceLocalItem.
             * @member {common.IBooleanValue|null|undefined} replaceLocalItem
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @instance
             */
            Options.prototype.replaceLocalItem = null;

            /**
             * Options newItemName.
             * @member {common.IStringValue|null|undefined} newItemName
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @instance
             */
            Options.prototype.newItemName = null;

            /**
             * Creates a new Options instance using the specified properties.
             * @function create
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @static
             * @param {fs.AdoptRemoteFolderItemRequestBody.IOptions=} [properties] Properties to set
             * @returns {fs.AdoptRemoteFolderItemRequestBody.Options} Options instance
             */
            Options.create = function create(properties) {
                return new Options(properties);
            };

            /**
             * Encodes the specified Options message. Does not implicitly {@link fs.AdoptRemoteFolderItemRequestBody.Options.verify|verify} messages.
             * @function encode
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @static
             * @param {fs.AdoptRemoteFolderItemRequestBody.IOptions} message Options message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Options.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                    $root.common.UInt64Value.encode(message.localVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
                if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                    $root.common.UInt64Value.encode(message.uploadVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
                if (message.replaceLocalItem != null && Object.hasOwnProperty.call(message, "replaceLocalItem"))
                    $root.common.BooleanValue.encode(message.replaceLocalItem, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
                if (message.newItemName != null && Object.hasOwnProperty.call(message, "newItemName"))
                    $root.common.StringValue.encode(message.newItemName, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
                return writer;
            };

            /**
             * Encodes the specified Options message, length delimited. Does not implicitly {@link fs.AdoptRemoteFolderItemRequestBody.Options.verify|verify} messages.
             * @function encodeDelimited
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @static
             * @param {fs.AdoptRemoteFolderItemRequestBody.IOptions} message Options message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Options.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes an Options message from the specified reader or buffer.
             * @function decode
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {fs.AdoptRemoteFolderItemRequestBody.Options} Options
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Options.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.AdoptRemoteFolderItemRequestBody.Options();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.localVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 2: {
                            message.uploadVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 3: {
                            message.replaceLocalItem = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 4: {
                            message.newItemName = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes an Options message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {fs.AdoptRemoteFolderItemRequestBody.Options} Options
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Options.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies an Options message.
             * @function verify
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            Options.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion")) {
                    var error = $root.common.UInt64Value.verify(message.localVersion, long + 1);
                    if (error)
                        return "localVersion." + error;
                }
                if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion")) {
                    var error = $root.common.UInt64Value.verify(message.uploadVersion, long + 1);
                    if (error)
                        return "uploadVersion." + error;
                }
                if (message.replaceLocalItem != null && Object.hasOwnProperty.call(message, "replaceLocalItem")) {
                    var error = $root.common.BooleanValue.verify(message.replaceLocalItem, long + 1);
                    if (error)
                        return "replaceLocalItem." + error;
                }
                if (message.newItemName != null && Object.hasOwnProperty.call(message, "newItemName")) {
                    var error = $root.common.StringValue.verify(message.newItemName, long + 1);
                    if (error)
                        return "newItemName." + error;
                }
                return null;
            };

            /**
             * Creates an Options message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {fs.AdoptRemoteFolderItemRequestBody.Options} Options
             */
            Options.fromObject = function fromObject(object, long) {
                if (object instanceof $root.fs.AdoptRemoteFolderItemRequestBody.Options)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".fs.AdoptRemoteFolderItemRequestBody.Options: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.fs.AdoptRemoteFolderItemRequestBody.Options();
                if (object.localVersion != null) {
                    if (!$util.isObject(object.localVersion))
                        throw TypeError(".fs.AdoptRemoteFolderItemRequestBody.Options.localVersion: object expected");
                    message.localVersion = $root.common.UInt64Value.fromObject(object.localVersion, long + 1);
                }
                if (object.uploadVersion != null) {
                    if (!$util.isObject(object.uploadVersion))
                        throw TypeError(".fs.AdoptRemoteFolderItemRequestBody.Options.uploadVersion: object expected");
                    message.uploadVersion = $root.common.UInt64Value.fromObject(object.uploadVersion, long + 1);
                }
                if (object.replaceLocalItem != null) {
                    if (!$util.isObject(object.replaceLocalItem))
                        throw TypeError(".fs.AdoptRemoteFolderItemRequestBody.Options.replaceLocalItem: object expected");
                    message.replaceLocalItem = $root.common.BooleanValue.fromObject(object.replaceLocalItem, long + 1);
                }
                if (object.newItemName != null) {
                    if (!$util.isObject(object.newItemName))
                        throw TypeError(".fs.AdoptRemoteFolderItemRequestBody.Options.newItemName: object expected");
                    message.newItemName = $root.common.StringValue.fromObject(object.newItemName, long + 1);
                }
                return message;
            };

            /**
             * Creates a plain object from an Options message. Also converts values to other types if specified.
             * @function toObject
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @static
             * @param {fs.AdoptRemoteFolderItemRequestBody.Options} message Options
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            Options.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults) {
                    object.localVersion = null;
                    object.uploadVersion = null;
                    object.replaceLocalItem = null;
                    object.newItemName = null;
                }
                if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                    object.localVersion = $root.common.UInt64Value.toObject(message.localVersion, options, q + 1);
                if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                    object.uploadVersion = $root.common.UInt64Value.toObject(message.uploadVersion, options, q + 1);
                if (message.replaceLocalItem != null && Object.hasOwnProperty.call(message, "replaceLocalItem"))
                    object.replaceLocalItem = $root.common.BooleanValue.toObject(message.replaceLocalItem, options, q + 1);
                if (message.newItemName != null && Object.hasOwnProperty.call(message, "newItemName"))
                    object.newItemName = $root.common.StringValue.toObject(message.newItemName, options, q + 1);
                return object;
            };

            /**
             * Converts this Options to JSON.
             * @function toJSON
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            Options.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for Options
             * @function getTypeUrl
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            Options.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/fs.AdoptRemoteFolderItemRequestBody.Options";
            };

            return Options;
        })();

        return AdoptRemoteFolderItemRequestBody;
    })();

    fs.AbsorbRemoteFolderChangesRequestBody = (function() {

        /**
         * Properties of an AbsorbRemoteFolderChangesRequestBody.
         * @memberof fs
         * @interface IAbsorbRemoteFolderChangesRequestBody
         * @property {string|null} [path] AbsorbRemoteFolderChangesRequestBody path
         * @property {fs.AbsorbRemoteFolderChangesRequestBody.IOptions|null} [opts] AbsorbRemoteFolderChangesRequestBody opts
         */

        /**
         * Constructs a new AbsorbRemoteFolderChangesRequestBody.
         * @memberof fs
         * @classdesc Represents an AbsorbRemoteFolderChangesRequestBody.
         * @implements IAbsorbRemoteFolderChangesRequestBody
         * @constructor
         * @param {fs.IAbsorbRemoteFolderChangesRequestBody=} [properties] Properties to set
         */
        function AbsorbRemoteFolderChangesRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * AbsorbRemoteFolderChangesRequestBody path.
         * @member {string} path
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @instance
         */
        AbsorbRemoteFolderChangesRequestBody.prototype.path = "";

        /**
         * AbsorbRemoteFolderChangesRequestBody opts.
         * @member {fs.AbsorbRemoteFolderChangesRequestBody.IOptions|null|undefined} opts
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @instance
         */
        AbsorbRemoteFolderChangesRequestBody.prototype.opts = null;

        /**
         * Creates a new AbsorbRemoteFolderChangesRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @static
         * @param {fs.IAbsorbRemoteFolderChangesRequestBody=} [properties] Properties to set
         * @returns {fs.AbsorbRemoteFolderChangesRequestBody} AbsorbRemoteFolderChangesRequestBody instance
         */
        AbsorbRemoteFolderChangesRequestBody.create = function create(properties) {
            return new AbsorbRemoteFolderChangesRequestBody(properties);
        };

        /**
         * Encodes the specified AbsorbRemoteFolderChangesRequestBody message. Does not implicitly {@link fs.AbsorbRemoteFolderChangesRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @static
         * @param {fs.IAbsorbRemoteFolderChangesRequestBody} message AbsorbRemoteFolderChangesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AbsorbRemoteFolderChangesRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.fs.AbsorbRemoteFolderChangesRequestBody.Options.encode(message.opts, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified AbsorbRemoteFolderChangesRequestBody message, length delimited. Does not implicitly {@link fs.AbsorbRemoteFolderChangesRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @static
         * @param {fs.IAbsorbRemoteFolderChangesRequestBody} message AbsorbRemoteFolderChangesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AbsorbRemoteFolderChangesRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an AbsorbRemoteFolderChangesRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.AbsorbRemoteFolderChangesRequestBody} AbsorbRemoteFolderChangesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AbsorbRemoteFolderChangesRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.AbsorbRemoteFolderChangesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.opts = $root.fs.AbsorbRemoteFolderChangesRequestBody.Options.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an AbsorbRemoteFolderChangesRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.AbsorbRemoteFolderChangesRequestBody} AbsorbRemoteFolderChangesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AbsorbRemoteFolderChangesRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an AbsorbRemoteFolderChangesRequestBody message.
         * @function verify
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        AbsorbRemoteFolderChangesRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts")) {
                var error = $root.fs.AbsorbRemoteFolderChangesRequestBody.Options.verify(message.opts, long + 1);
                if (error)
                    return "opts." + error;
            }
            return null;
        };

        /**
         * Creates an AbsorbRemoteFolderChangesRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.AbsorbRemoteFolderChangesRequestBody} AbsorbRemoteFolderChangesRequestBody
         */
        AbsorbRemoteFolderChangesRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.AbsorbRemoteFolderChangesRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.AbsorbRemoteFolderChangesRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.AbsorbRemoteFolderChangesRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.opts != null) {
                if (!$util.isObject(object.opts))
                    throw TypeError(".fs.AbsorbRemoteFolderChangesRequestBody.opts: object expected");
                message.opts = $root.fs.AbsorbRemoteFolderChangesRequestBody.Options.fromObject(object.opts, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an AbsorbRemoteFolderChangesRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @static
         * @param {fs.AbsorbRemoteFolderChangesRequestBody} message AbsorbRemoteFolderChangesRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        AbsorbRemoteFolderChangesRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.opts = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                object.opts = $root.fs.AbsorbRemoteFolderChangesRequestBody.Options.toObject(message.opts, options, q + 1);
            return object;
        };

        /**
         * Converts this AbsorbRemoteFolderChangesRequestBody to JSON.
         * @function toJSON
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        AbsorbRemoteFolderChangesRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for AbsorbRemoteFolderChangesRequestBody
         * @function getTypeUrl
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        AbsorbRemoteFolderChangesRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.AbsorbRemoteFolderChangesRequestBody";
        };

        AbsorbRemoteFolderChangesRequestBody.Options = (function() {

            /**
             * Properties of an Options.
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody
             * @interface IOptions
             * @property {common.IUInt64Value|null} [localVersion] Options localVersion
             * @property {common.IStringValue|null} [postfixForNameOverlaps] Options postfixForNameOverlaps
             * @property {common.IUInt64Value|null} [remoteVersion] Options remoteVersion
             */

            /**
             * Constructs a new Options.
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody
             * @classdesc Represents an Options.
             * @implements IOptions
             * @constructor
             * @param {fs.AbsorbRemoteFolderChangesRequestBody.IOptions=} [properties] Properties to set
             */
            function Options(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * Options localVersion.
             * @member {common.IUInt64Value|null|undefined} localVersion
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @instance
             */
            Options.prototype.localVersion = null;

            /**
             * Options postfixForNameOverlaps.
             * @member {common.IStringValue|null|undefined} postfixForNameOverlaps
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @instance
             */
            Options.prototype.postfixForNameOverlaps = null;

            /**
             * Options remoteVersion.
             * @member {common.IUInt64Value|null|undefined} remoteVersion
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @instance
             */
            Options.prototype.remoteVersion = null;

            /**
             * Creates a new Options instance using the specified properties.
             * @function create
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @static
             * @param {fs.AbsorbRemoteFolderChangesRequestBody.IOptions=} [properties] Properties to set
             * @returns {fs.AbsorbRemoteFolderChangesRequestBody.Options} Options instance
             */
            Options.create = function create(properties) {
                return new Options(properties);
            };

            /**
             * Encodes the specified Options message. Does not implicitly {@link fs.AbsorbRemoteFolderChangesRequestBody.Options.verify|verify} messages.
             * @function encode
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @static
             * @param {fs.AbsorbRemoteFolderChangesRequestBody.IOptions} message Options message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Options.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                    $root.common.UInt64Value.encode(message.localVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
                if (message.postfixForNameOverlaps != null && Object.hasOwnProperty.call(message, "postfixForNameOverlaps"))
                    $root.common.StringValue.encode(message.postfixForNameOverlaps, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
                if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                    $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
                return writer;
            };

            /**
             * Encodes the specified Options message, length delimited. Does not implicitly {@link fs.AbsorbRemoteFolderChangesRequestBody.Options.verify|verify} messages.
             * @function encodeDelimited
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @static
             * @param {fs.AbsorbRemoteFolderChangesRequestBody.IOptions} message Options message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Options.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes an Options message from the specified reader or buffer.
             * @function decode
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {fs.AbsorbRemoteFolderChangesRequestBody.Options} Options
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Options.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.AbsorbRemoteFolderChangesRequestBody.Options();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.localVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 2: {
                            message.postfixForNameOverlaps = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 3: {
                            message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes an Options message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {fs.AbsorbRemoteFolderChangesRequestBody.Options} Options
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Options.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies an Options message.
             * @function verify
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            Options.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion")) {
                    var error = $root.common.UInt64Value.verify(message.localVersion, long + 1);
                    if (error)
                        return "localVersion." + error;
                }
                if (message.postfixForNameOverlaps != null && Object.hasOwnProperty.call(message, "postfixForNameOverlaps")) {
                    var error = $root.common.StringValue.verify(message.postfixForNameOverlaps, long + 1);
                    if (error)
                        return "postfixForNameOverlaps." + error;
                }
                if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion")) {
                    var error = $root.common.UInt64Value.verify(message.remoteVersion, long + 1);
                    if (error)
                        return "remoteVersion." + error;
                }
                return null;
            };

            /**
             * Creates an Options message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {fs.AbsorbRemoteFolderChangesRequestBody.Options} Options
             */
            Options.fromObject = function fromObject(object, long) {
                if (object instanceof $root.fs.AbsorbRemoteFolderChangesRequestBody.Options)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".fs.AbsorbRemoteFolderChangesRequestBody.Options: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.fs.AbsorbRemoteFolderChangesRequestBody.Options();
                if (object.localVersion != null) {
                    if (!$util.isObject(object.localVersion))
                        throw TypeError(".fs.AbsorbRemoteFolderChangesRequestBody.Options.localVersion: object expected");
                    message.localVersion = $root.common.UInt64Value.fromObject(object.localVersion, long + 1);
                }
                if (object.postfixForNameOverlaps != null) {
                    if (!$util.isObject(object.postfixForNameOverlaps))
                        throw TypeError(".fs.AbsorbRemoteFolderChangesRequestBody.Options.postfixForNameOverlaps: object expected");
                    message.postfixForNameOverlaps = $root.common.StringValue.fromObject(object.postfixForNameOverlaps, long + 1);
                }
                if (object.remoteVersion != null) {
                    if (!$util.isObject(object.remoteVersion))
                        throw TypeError(".fs.AbsorbRemoteFolderChangesRequestBody.Options.remoteVersion: object expected");
                    message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion, long + 1);
                }
                return message;
            };

            /**
             * Creates a plain object from an Options message. Also converts values to other types if specified.
             * @function toObject
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @static
             * @param {fs.AbsorbRemoteFolderChangesRequestBody.Options} message Options
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            Options.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults) {
                    object.localVersion = null;
                    object.postfixForNameOverlaps = null;
                    object.remoteVersion = null;
                }
                if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                    object.localVersion = $root.common.UInt64Value.toObject(message.localVersion, options, q + 1);
                if (message.postfixForNameOverlaps != null && Object.hasOwnProperty.call(message, "postfixForNameOverlaps"))
                    object.postfixForNameOverlaps = $root.common.StringValue.toObject(message.postfixForNameOverlaps, options, q + 1);
                if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                    object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options, q + 1);
                return object;
            };

            /**
             * Converts this Options to JSON.
             * @function toJSON
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            Options.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for Options
             * @function getTypeUrl
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            Options.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/fs.AbsorbRemoteFolderChangesRequestBody.Options";
            };

            return Options;
        })();

        return AbsorbRemoteFolderChangesRequestBody;
    })();

    fs.AbsorbRemoteFolderChangesReplyBody = (function() {

        /**
         * Properties of an AbsorbRemoteFolderChangesReplyBody.
         * @memberof fs
         * @interface IAbsorbRemoteFolderChangesReplyBody
         * @property {common.IUInt64Value|null} [newVersion] AbsorbRemoteFolderChangesReplyBody newVersion
         */

        /**
         * Constructs a new AbsorbRemoteFolderChangesReplyBody.
         * @memberof fs
         * @classdesc Represents an AbsorbRemoteFolderChangesReplyBody.
         * @implements IAbsorbRemoteFolderChangesReplyBody
         * @constructor
         * @param {fs.IAbsorbRemoteFolderChangesReplyBody=} [properties] Properties to set
         */
        function AbsorbRemoteFolderChangesReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * AbsorbRemoteFolderChangesReplyBody newVersion.
         * @member {common.IUInt64Value|null|undefined} newVersion
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @instance
         */
        AbsorbRemoteFolderChangesReplyBody.prototype.newVersion = null;

        /**
         * Creates a new AbsorbRemoteFolderChangesReplyBody instance using the specified properties.
         * @function create
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @static
         * @param {fs.IAbsorbRemoteFolderChangesReplyBody=} [properties] Properties to set
         * @returns {fs.AbsorbRemoteFolderChangesReplyBody} AbsorbRemoteFolderChangesReplyBody instance
         */
        AbsorbRemoteFolderChangesReplyBody.create = function create(properties) {
            return new AbsorbRemoteFolderChangesReplyBody(properties);
        };

        /**
         * Encodes the specified AbsorbRemoteFolderChangesReplyBody message. Does not implicitly {@link fs.AbsorbRemoteFolderChangesReplyBody.verify|verify} messages.
         * @function encode
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @static
         * @param {fs.IAbsorbRemoteFolderChangesReplyBody} message AbsorbRemoteFolderChangesReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AbsorbRemoteFolderChangesReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.newVersion != null && Object.hasOwnProperty.call(message, "newVersion"))
                $root.common.UInt64Value.encode(message.newVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified AbsorbRemoteFolderChangesReplyBody message, length delimited. Does not implicitly {@link fs.AbsorbRemoteFolderChangesReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @static
         * @param {fs.IAbsorbRemoteFolderChangesReplyBody} message AbsorbRemoteFolderChangesReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AbsorbRemoteFolderChangesReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an AbsorbRemoteFolderChangesReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.AbsorbRemoteFolderChangesReplyBody} AbsorbRemoteFolderChangesReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AbsorbRemoteFolderChangesReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.AbsorbRemoteFolderChangesReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.newVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an AbsorbRemoteFolderChangesReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.AbsorbRemoteFolderChangesReplyBody} AbsorbRemoteFolderChangesReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AbsorbRemoteFolderChangesReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an AbsorbRemoteFolderChangesReplyBody message.
         * @function verify
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        AbsorbRemoteFolderChangesReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.newVersion != null && Object.hasOwnProperty.call(message, "newVersion")) {
                var error = $root.common.UInt64Value.verify(message.newVersion, long + 1);
                if (error)
                    return "newVersion." + error;
            }
            return null;
        };

        /**
         * Creates an AbsorbRemoteFolderChangesReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.AbsorbRemoteFolderChangesReplyBody} AbsorbRemoteFolderChangesReplyBody
         */
        AbsorbRemoteFolderChangesReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.AbsorbRemoteFolderChangesReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.AbsorbRemoteFolderChangesReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.AbsorbRemoteFolderChangesReplyBody();
            if (object.newVersion != null) {
                if (!$util.isObject(object.newVersion))
                    throw TypeError(".fs.AbsorbRemoteFolderChangesReplyBody.newVersion: object expected");
                message.newVersion = $root.common.UInt64Value.fromObject(object.newVersion, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an AbsorbRemoteFolderChangesReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @static
         * @param {fs.AbsorbRemoteFolderChangesReplyBody} message AbsorbRemoteFolderChangesReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        AbsorbRemoteFolderChangesReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.newVersion = null;
            if (message.newVersion != null && Object.hasOwnProperty.call(message, "newVersion"))
                object.newVersion = $root.common.UInt64Value.toObject(message.newVersion, options, q + 1);
            return object;
        };

        /**
         * Converts this AbsorbRemoteFolderChangesReplyBody to JSON.
         * @function toJSON
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        AbsorbRemoteFolderChangesReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for AbsorbRemoteFolderChangesReplyBody
         * @function getTypeUrl
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        AbsorbRemoteFolderChangesReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.AbsorbRemoteFolderChangesReplyBody";
        };

        return AbsorbRemoteFolderChangesReplyBody;
    })();

    return fs;
})();

module.exports = $root;

},{"protobufjs/minimal":84}],32:[function(require,module,exports){
/*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.test_stand = (function() {

    /**
     * Namespace test_stand.
     * @exports test_stand
     * @namespace
     */
    var test_stand = {};

    test_stand.SendMsgToOtherLocalTestProcessRequestBody = (function() {

        /**
         * Properties of a SendMsgToOtherLocalTestProcessRequestBody.
         * @memberof test_stand
         * @interface ISendMsgToOtherLocalTestProcessRequestBody
         * @property {common.IUInt32Value|null} [userNum] SendMsgToOtherLocalTestProcessRequestBody userNum
         * @property {common.IStringValue|null} [appDomain] SendMsgToOtherLocalTestProcessRequestBody appDomain
         * @property {common.IStringValue|null} [appComponent] SendMsgToOtherLocalTestProcessRequestBody appComponent
         * @property {string|null} [msgJson] SendMsgToOtherLocalTestProcessRequestBody msgJson
         */

        /**
         * Constructs a new SendMsgToOtherLocalTestProcessRequestBody.
         * @memberof test_stand
         * @classdesc Represents a SendMsgToOtherLocalTestProcessRequestBody.
         * @implements ISendMsgToOtherLocalTestProcessRequestBody
         * @constructor
         * @param {test_stand.ISendMsgToOtherLocalTestProcessRequestBody=} [properties] Properties to set
         */
        function SendMsgToOtherLocalTestProcessRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * SendMsgToOtherLocalTestProcessRequestBody userNum.
         * @member {common.IUInt32Value|null|undefined} userNum
         * @memberof test_stand.SendMsgToOtherLocalTestProcessRequestBody
         * @instance
         */
        SendMsgToOtherLocalTestProcessRequestBody.prototype.userNum = null;

        /**
         * SendMsgToOtherLocalTestProcessRequestBody appDomain.
         * @member {common.IStringValue|null|undefined} appDomain
         * @memberof test_stand.SendMsgToOtherLocalTestProcessRequestBody
         * @instance
         */
        SendMsgToOtherLocalTestProcessRequestBody.prototype.appDomain = null;

        /**
         * SendMsgToOtherLocalTestProcessRequestBody appComponent.
         * @member {common.IStringValue|null|undefined} appComponent
         * @memberof test_stand.SendMsgToOtherLocalTestProcessRequestBody
         * @instance
         */
        SendMsgToOtherLocalTestProcessRequestBody.prototype.appComponent = null;

        /**
         * SendMsgToOtherLocalTestProcessRequestBody msgJson.
         * @member {string} msgJson
         * @memberof test_stand.SendMsgToOtherLocalTestProcessRequestBody
         * @instance
         */
        SendMsgToOtherLocalTestProcessRequestBody.prototype.msgJson = "";

        /**
         * Creates a new SendMsgToOtherLocalTestProcessRequestBody instance using the specified properties.
         * @function create
         * @memberof test_stand.SendMsgToOtherLocalTestProcessRequestBody
         * @static
         * @param {test_stand.ISendMsgToOtherLocalTestProcessRequestBody=} [properties] Properties to set
         * @returns {test_stand.SendMsgToOtherLocalTestProcessRequestBody} SendMsgToOtherLocalTestProcessRequestBody instance
         */
        SendMsgToOtherLocalTestProcessRequestBody.create = function create(properties) {
            return new SendMsgToOtherLocalTestProcessRequestBody(properties);
        };

        /**
         * Encodes the specified SendMsgToOtherLocalTestProcessRequestBody message. Does not implicitly {@link test_stand.SendMsgToOtherLocalTestProcessRequestBody.verify|verify} messages.
         * @function encode
         * @memberof test_stand.SendMsgToOtherLocalTestProcessRequestBody
         * @static
         * @param {test_stand.ISendMsgToOtherLocalTestProcessRequestBody} message SendMsgToOtherLocalTestProcessRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SendMsgToOtherLocalTestProcessRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.userNum != null && Object.hasOwnProperty.call(message, "userNum"))
                $root.common.UInt32Value.encode(message.userNum, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.appDomain != null && Object.hasOwnProperty.call(message, "appDomain"))
                $root.common.StringValue.encode(message.appDomain, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.appComponent != null && Object.hasOwnProperty.call(message, "appComponent"))
                $root.common.StringValue.encode(message.appComponent, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.msgJson != null && Object.hasOwnProperty.call(message, "msgJson"))
                writer.uint32(/* id 4, wireType 2 =*/34).string(message.msgJson);
            return writer;
        };

        /**
         * Encodes the specified SendMsgToOtherLocalTestProcessRequestBody message, length delimited. Does not implicitly {@link test_stand.SendMsgToOtherLocalTestProcessRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof test_stand.SendMsgToOtherLocalTestProcessRequestBody
         * @static
         * @param {test_stand.ISendMsgToOtherLocalTestProcessRequestBody} message SendMsgToOtherLocalTestProcessRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SendMsgToOtherLocalTestProcessRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a SendMsgToOtherLocalTestProcessRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof test_stand.SendMsgToOtherLocalTestProcessRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {test_stand.SendMsgToOtherLocalTestProcessRequestBody} SendMsgToOtherLocalTestProcessRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SendMsgToOtherLocalTestProcessRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.test_stand.SendMsgToOtherLocalTestProcessRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.userNum = $root.common.UInt32Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.appDomain = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.appComponent = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.msgJson = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a SendMsgToOtherLocalTestProcessRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof test_stand.SendMsgToOtherLocalTestProcessRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {test_stand.SendMsgToOtherLocalTestProcessRequestBody} SendMsgToOtherLocalTestProcessRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SendMsgToOtherLocalTestProcessRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a SendMsgToOtherLocalTestProcessRequestBody message.
         * @function verify
         * @memberof test_stand.SendMsgToOtherLocalTestProcessRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        SendMsgToOtherLocalTestProcessRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.userNum != null && Object.hasOwnProperty.call(message, "userNum")) {
                var error = $root.common.UInt32Value.verify(message.userNum, long + 1);
                if (error)
                    return "userNum." + error;
            }
            if (message.appDomain != null && Object.hasOwnProperty.call(message, "appDomain")) {
                var error = $root.common.StringValue.verify(message.appDomain, long + 1);
                if (error)
                    return "appDomain." + error;
            }
            if (message.appComponent != null && Object.hasOwnProperty.call(message, "appComponent")) {
                var error = $root.common.StringValue.verify(message.appComponent, long + 1);
                if (error)
                    return "appComponent." + error;
            }
            if (message.msgJson != null && Object.hasOwnProperty.call(message, "msgJson"))
                if (!$util.isString(message.msgJson))
                    return "msgJson: string expected";
            return null;
        };

        /**
         * Creates a SendMsgToOtherLocalTestProcessRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof test_stand.SendMsgToOtherLocalTestProcessRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {test_stand.SendMsgToOtherLocalTestProcessRequestBody} SendMsgToOtherLocalTestProcessRequestBody
         */
        SendMsgToOtherLocalTestProcessRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.test_stand.SendMsgToOtherLocalTestProcessRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".test_stand.SendMsgToOtherLocalTestProcessRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.test_stand.SendMsgToOtherLocalTestProcessRequestBody();
            if (object.userNum != null) {
                if (!$util.isObject(object.userNum))
                    throw TypeError(".test_stand.SendMsgToOtherLocalTestProcessRequestBody.userNum: object expected");
                message.userNum = $root.common.UInt32Value.fromObject(object.userNum, long + 1);
            }
            if (object.appDomain != null) {
                if (!$util.isObject(object.appDomain))
                    throw TypeError(".test_stand.SendMsgToOtherLocalTestProcessRequestBody.appDomain: object expected");
                message.appDomain = $root.common.StringValue.fromObject(object.appDomain, long + 1);
            }
            if (object.appComponent != null) {
                if (!$util.isObject(object.appComponent))
                    throw TypeError(".test_stand.SendMsgToOtherLocalTestProcessRequestBody.appComponent: object expected");
                message.appComponent = $root.common.StringValue.fromObject(object.appComponent, long + 1);
            }
            if (object.msgJson != null)
                message.msgJson = String(object.msgJson);
            return message;
        };

        /**
         * Creates a plain object from a SendMsgToOtherLocalTestProcessRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof test_stand.SendMsgToOtherLocalTestProcessRequestBody
         * @static
         * @param {test_stand.SendMsgToOtherLocalTestProcessRequestBody} message SendMsgToOtherLocalTestProcessRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        SendMsgToOtherLocalTestProcessRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.userNum = null;
                object.appDomain = null;
                object.appComponent = null;
                object.msgJson = "";
            }
            if (message.userNum != null && Object.hasOwnProperty.call(message, "userNum"))
                object.userNum = $root.common.UInt32Value.toObject(message.userNum, options, q + 1);
            if (message.appDomain != null && Object.hasOwnProperty.call(message, "appDomain"))
                object.appDomain = $root.common.StringValue.toObject(message.appDomain, options, q + 1);
            if (message.appComponent != null && Object.hasOwnProperty.call(message, "appComponent"))
                object.appComponent = $root.common.StringValue.toObject(message.appComponent, options, q + 1);
            if (message.msgJson != null && Object.hasOwnProperty.call(message, "msgJson"))
                object.msgJson = message.msgJson;
            return object;
        };

        /**
         * Converts this SendMsgToOtherLocalTestProcessRequestBody to JSON.
         * @function toJSON
         * @memberof test_stand.SendMsgToOtherLocalTestProcessRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        SendMsgToOtherLocalTestProcessRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for SendMsgToOtherLocalTestProcessRequestBody
         * @function getTypeUrl
         * @memberof test_stand.SendMsgToOtherLocalTestProcessRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        SendMsgToOtherLocalTestProcessRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/test_stand.SendMsgToOtherLocalTestProcessRequestBody";
        };

        return SendMsgToOtherLocalTestProcessRequestBody;
    })();

    test_stand.ObserveOtherTestProcessRequestBody = (function() {

        /**
         * Properties of an ObserveOtherTestProcessRequestBody.
         * @memberof test_stand
         * @interface IObserveOtherTestProcessRequestBody
         * @property {common.IUInt32Value|null} [userNum] ObserveOtherTestProcessRequestBody userNum
         * @property {common.IStringValue|null} [appDomain] ObserveOtherTestProcessRequestBody appDomain
         * @property {common.IStringValue|null} [appComponent] ObserveOtherTestProcessRequestBody appComponent
         */

        /**
         * Constructs a new ObserveOtherTestProcessRequestBody.
         * @memberof test_stand
         * @classdesc Represents an ObserveOtherTestProcessRequestBody.
         * @implements IObserveOtherTestProcessRequestBody
         * @constructor
         * @param {test_stand.IObserveOtherTestProcessRequestBody=} [properties] Properties to set
         */
        function ObserveOtherTestProcessRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ObserveOtherTestProcessRequestBody userNum.
         * @member {common.IUInt32Value|null|undefined} userNum
         * @memberof test_stand.ObserveOtherTestProcessRequestBody
         * @instance
         */
        ObserveOtherTestProcessRequestBody.prototype.userNum = null;

        /**
         * ObserveOtherTestProcessRequestBody appDomain.
         * @member {common.IStringValue|null|undefined} appDomain
         * @memberof test_stand.ObserveOtherTestProcessRequestBody
         * @instance
         */
        ObserveOtherTestProcessRequestBody.prototype.appDomain = null;

        /**
         * ObserveOtherTestProcessRequestBody appComponent.
         * @member {common.IStringValue|null|undefined} appComponent
         * @memberof test_stand.ObserveOtherTestProcessRequestBody
         * @instance
         */
        ObserveOtherTestProcessRequestBody.prototype.appComponent = null;

        /**
         * Creates a new ObserveOtherTestProcessRequestBody instance using the specified properties.
         * @function create
         * @memberof test_stand.ObserveOtherTestProcessRequestBody
         * @static
         * @param {test_stand.IObserveOtherTestProcessRequestBody=} [properties] Properties to set
         * @returns {test_stand.ObserveOtherTestProcessRequestBody} ObserveOtherTestProcessRequestBody instance
         */
        ObserveOtherTestProcessRequestBody.create = function create(properties) {
            return new ObserveOtherTestProcessRequestBody(properties);
        };

        /**
         * Encodes the specified ObserveOtherTestProcessRequestBody message. Does not implicitly {@link test_stand.ObserveOtherTestProcessRequestBody.verify|verify} messages.
         * @function encode
         * @memberof test_stand.ObserveOtherTestProcessRequestBody
         * @static
         * @param {test_stand.IObserveOtherTestProcessRequestBody} message ObserveOtherTestProcessRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ObserveOtherTestProcessRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.userNum != null && Object.hasOwnProperty.call(message, "userNum"))
                $root.common.UInt32Value.encode(message.userNum, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.appDomain != null && Object.hasOwnProperty.call(message, "appDomain"))
                $root.common.StringValue.encode(message.appDomain, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.appComponent != null && Object.hasOwnProperty.call(message, "appComponent"))
                $root.common.StringValue.encode(message.appComponent, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified ObserveOtherTestProcessRequestBody message, length delimited. Does not implicitly {@link test_stand.ObserveOtherTestProcessRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof test_stand.ObserveOtherTestProcessRequestBody
         * @static
         * @param {test_stand.IObserveOtherTestProcessRequestBody} message ObserveOtherTestProcessRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ObserveOtherTestProcessRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an ObserveOtherTestProcessRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof test_stand.ObserveOtherTestProcessRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {test_stand.ObserveOtherTestProcessRequestBody} ObserveOtherTestProcessRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ObserveOtherTestProcessRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.test_stand.ObserveOtherTestProcessRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.userNum = $root.common.UInt32Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.appDomain = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.appComponent = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an ObserveOtherTestProcessRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof test_stand.ObserveOtherTestProcessRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {test_stand.ObserveOtherTestProcessRequestBody} ObserveOtherTestProcessRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ObserveOtherTestProcessRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an ObserveOtherTestProcessRequestBody message.
         * @function verify
         * @memberof test_stand.ObserveOtherTestProcessRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ObserveOtherTestProcessRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.userNum != null && Object.hasOwnProperty.call(message, "userNum")) {
                var error = $root.common.UInt32Value.verify(message.userNum, long + 1);
                if (error)
                    return "userNum." + error;
            }
            if (message.appDomain != null && Object.hasOwnProperty.call(message, "appDomain")) {
                var error = $root.common.StringValue.verify(message.appDomain, long + 1);
                if (error)
                    return "appDomain." + error;
            }
            if (message.appComponent != null && Object.hasOwnProperty.call(message, "appComponent")) {
                var error = $root.common.StringValue.verify(message.appComponent, long + 1);
                if (error)
                    return "appComponent." + error;
            }
            return null;
        };

        /**
         * Creates an ObserveOtherTestProcessRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof test_stand.ObserveOtherTestProcessRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {test_stand.ObserveOtherTestProcessRequestBody} ObserveOtherTestProcessRequestBody
         */
        ObserveOtherTestProcessRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.test_stand.ObserveOtherTestProcessRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".test_stand.ObserveOtherTestProcessRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.test_stand.ObserveOtherTestProcessRequestBody();
            if (object.userNum != null) {
                if (!$util.isObject(object.userNum))
                    throw TypeError(".test_stand.ObserveOtherTestProcessRequestBody.userNum: object expected");
                message.userNum = $root.common.UInt32Value.fromObject(object.userNum, long + 1);
            }
            if (object.appDomain != null) {
                if (!$util.isObject(object.appDomain))
                    throw TypeError(".test_stand.ObserveOtherTestProcessRequestBody.appDomain: object expected");
                message.appDomain = $root.common.StringValue.fromObject(object.appDomain, long + 1);
            }
            if (object.appComponent != null) {
                if (!$util.isObject(object.appComponent))
                    throw TypeError(".test_stand.ObserveOtherTestProcessRequestBody.appComponent: object expected");
                message.appComponent = $root.common.StringValue.fromObject(object.appComponent, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an ObserveOtherTestProcessRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof test_stand.ObserveOtherTestProcessRequestBody
         * @static
         * @param {test_stand.ObserveOtherTestProcessRequestBody} message ObserveOtherTestProcessRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ObserveOtherTestProcessRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.userNum = null;
                object.appDomain = null;
                object.appComponent = null;
            }
            if (message.userNum != null && Object.hasOwnProperty.call(message, "userNum"))
                object.userNum = $root.common.UInt32Value.toObject(message.userNum, options, q + 1);
            if (message.appDomain != null && Object.hasOwnProperty.call(message, "appDomain"))
                object.appDomain = $root.common.StringValue.toObject(message.appDomain, options, q + 1);
            if (message.appComponent != null && Object.hasOwnProperty.call(message, "appComponent"))
                object.appComponent = $root.common.StringValue.toObject(message.appComponent, options, q + 1);
            return object;
        };

        /**
         * Converts this ObserveOtherTestProcessRequestBody to JSON.
         * @function toJSON
         * @memberof test_stand.ObserveOtherTestProcessRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ObserveOtherTestProcessRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ObserveOtherTestProcessRequestBody
         * @function getTypeUrl
         * @memberof test_stand.ObserveOtherTestProcessRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ObserveOtherTestProcessRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/test_stand.ObserveOtherTestProcessRequestBody";
        };

        return ObserveOtherTestProcessRequestBody;
    })();

    return test_stand;
})();

$root.common = (function() {

    /**
     * Namespace common.
     * @exports common
     * @namespace
     */
    var common = {};

    common.ObjectReference = (function() {

        /**
         * Properties of an ObjectReference.
         * @memberof common
         * @interface IObjectReference
         * @property {string|null} [objType] ObjectReference objType
         * @property {Array.<string>|null} [path] ObjectReference path
         */

        /**
         * Constructs a new ObjectReference.
         * @memberof common
         * @classdesc Represents an ObjectReference.
         * @implements IObjectReference
         * @constructor
         * @param {common.IObjectReference=} [properties] Properties to set
         */
        function ObjectReference(properties) {
            this.path = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ObjectReference objType.
         * @member {string} objType
         * @memberof common.ObjectReference
         * @instance
         */
        ObjectReference.prototype.objType = "";

        /**
         * ObjectReference path.
         * @member {Array.<string>} path
         * @memberof common.ObjectReference
         * @instance
         */
        ObjectReference.prototype.path = $util.emptyArray;

        /**
         * Creates a new ObjectReference instance using the specified properties.
         * @function create
         * @memberof common.ObjectReference
         * @static
         * @param {common.IObjectReference=} [properties] Properties to set
         * @returns {common.ObjectReference} ObjectReference instance
         */
        ObjectReference.create = function create(properties) {
            return new ObjectReference(properties);
        };

        /**
         * Encodes the specified ObjectReference message. Does not implicitly {@link common.ObjectReference.verify|verify} messages.
         * @function encode
         * @memberof common.ObjectReference
         * @static
         * @param {common.IObjectReference} message ObjectReference message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ObjectReference.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.objType != null && Object.hasOwnProperty.call(message, "objType"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.objType);
            if (message.path != null && message.path.length)
                for (var i = 0; i < message.path.length; ++i)
                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.path[i]);
            return writer;
        };

        /**
         * Encodes the specified ObjectReference message, length delimited. Does not implicitly {@link common.ObjectReference.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.ObjectReference
         * @static
         * @param {common.IObjectReference} message ObjectReference message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ObjectReference.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an ObjectReference message from the specified reader or buffer.
         * @function decode
         * @memberof common.ObjectReference
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.ObjectReference} ObjectReference
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ObjectReference.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ObjectReference();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.objType = reader.string();
                        break;
                    }
                case 2: {
                        if (!(message.path && message.path.length))
                            message.path = [];
                        message.path.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an ObjectReference message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.ObjectReference
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.ObjectReference} ObjectReference
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ObjectReference.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an ObjectReference message.
         * @function verify
         * @memberof common.ObjectReference
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ObjectReference.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.objType != null && Object.hasOwnProperty.call(message, "objType"))
                if (!$util.isString(message.objType))
                    return "objType: string expected";
            if (message.path != null && Object.hasOwnProperty.call(message, "path")) {
                if (!Array.isArray(message.path))
                    return "path: array expected";
                for (var i = 0; i < message.path.length; ++i)
                    if (!$util.isString(message.path[i]))
                        return "path: string[] expected";
            }
            return null;
        };

        /**
         * Creates an ObjectReference message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.ObjectReference
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.ObjectReference} ObjectReference
         */
        ObjectReference.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.ObjectReference)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.ObjectReference: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.ObjectReference();
            if (object.objType != null)
                message.objType = String(object.objType);
            if (object.path) {
                if (!Array.isArray(object.path))
                    throw TypeError(".common.ObjectReference.path: array expected");
                message.path = [];
                for (var i = 0; i < object.path.length; ++i)
                    message.path[i] = String(object.path[i]);
            }
            return message;
        };

        /**
         * Creates a plain object from an ObjectReference message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.ObjectReference
         * @static
         * @param {common.ObjectReference} message ObjectReference
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ObjectReference.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.path = [];
            if (options.defaults)
                object.objType = "";
            if (message.objType != null && Object.hasOwnProperty.call(message, "objType"))
                object.objType = message.objType;
            if (message.path && message.path.length) {
                object.path = [];
                for (var j = 0; j < message.path.length; ++j)
                    object.path[j] = message.path[j];
            }
            return object;
        };

        /**
         * Converts this ObjectReference to JSON.
         * @function toJSON
         * @memberof common.ObjectReference
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ObjectReference.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ObjectReference
         * @function getTypeUrl
         * @memberof common.ObjectReference
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ObjectReference.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.ObjectReference";
        };

        return ObjectReference;
    })();

    common.BooleanValue = (function() {

        /**
         * Properties of a BooleanValue.
         * @memberof common
         * @interface IBooleanValue
         * @property {boolean|null} [value] BooleanValue value
         */

        /**
         * Constructs a new BooleanValue.
         * @memberof common
         * @classdesc Represents a BooleanValue.
         * @implements IBooleanValue
         * @constructor
         * @param {common.IBooleanValue=} [properties] Properties to set
         */
        function BooleanValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * BooleanValue value.
         * @member {boolean} value
         * @memberof common.BooleanValue
         * @instance
         */
        BooleanValue.prototype.value = false;

        /**
         * Creates a new BooleanValue instance using the specified properties.
         * @function create
         * @memberof common.BooleanValue
         * @static
         * @param {common.IBooleanValue=} [properties] Properties to set
         * @returns {common.BooleanValue} BooleanValue instance
         */
        BooleanValue.create = function create(properties) {
            return new BooleanValue(properties);
        };

        /**
         * Encodes the specified BooleanValue message. Does not implicitly {@link common.BooleanValue.verify|verify} messages.
         * @function encode
         * @memberof common.BooleanValue
         * @static
         * @param {common.IBooleanValue} message BooleanValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BooleanValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 0 =*/8).bool(message.value);
            return writer;
        };

        /**
         * Encodes the specified BooleanValue message, length delimited. Does not implicitly {@link common.BooleanValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.BooleanValue
         * @static
         * @param {common.IBooleanValue} message BooleanValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BooleanValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a BooleanValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.BooleanValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.BooleanValue} BooleanValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BooleanValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BooleanValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.bool();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a BooleanValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.BooleanValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.BooleanValue} BooleanValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BooleanValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a BooleanValue message.
         * @function verify
         * @memberof common.BooleanValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        BooleanValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (typeof message.value !== "boolean")
                    return "value: boolean expected";
            return null;
        };

        /**
         * Creates a BooleanValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.BooleanValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.BooleanValue} BooleanValue
         */
        BooleanValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.BooleanValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.BooleanValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.BooleanValue();
            if (object.value != null)
                message.value = Boolean(object.value);
            return message;
        };

        /**
         * Creates a plain object from a BooleanValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.BooleanValue
         * @static
         * @param {common.BooleanValue} message BooleanValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        BooleanValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.value = false;
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = message.value;
            return object;
        };

        /**
         * Converts this BooleanValue to JSON.
         * @function toJSON
         * @memberof common.BooleanValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        BooleanValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for BooleanValue
         * @function getTypeUrl
         * @memberof common.BooleanValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        BooleanValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.BooleanValue";
        };

        return BooleanValue;
    })();

    common.StringArrayValue = (function() {

        /**
         * Properties of a StringArrayValue.
         * @memberof common
         * @interface IStringArrayValue
         * @property {Array.<string>|null} [values] StringArrayValue values
         */

        /**
         * Constructs a new StringArrayValue.
         * @memberof common
         * @classdesc Represents a StringArrayValue.
         * @implements IStringArrayValue
         * @constructor
         * @param {common.IStringArrayValue=} [properties] Properties to set
         */
        function StringArrayValue(properties) {
            this.values = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * StringArrayValue values.
         * @member {Array.<string>} values
         * @memberof common.StringArrayValue
         * @instance
         */
        StringArrayValue.prototype.values = $util.emptyArray;

        /**
         * Creates a new StringArrayValue instance using the specified properties.
         * @function create
         * @memberof common.StringArrayValue
         * @static
         * @param {common.IStringArrayValue=} [properties] Properties to set
         * @returns {common.StringArrayValue} StringArrayValue instance
         */
        StringArrayValue.create = function create(properties) {
            return new StringArrayValue(properties);
        };

        /**
         * Encodes the specified StringArrayValue message. Does not implicitly {@link common.StringArrayValue.verify|verify} messages.
         * @function encode
         * @memberof common.StringArrayValue
         * @static
         * @param {common.IStringArrayValue} message StringArrayValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringArrayValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.values != null && message.values.length)
                for (var i = 0; i < message.values.length; ++i)
                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.values[i]);
            return writer;
        };

        /**
         * Encodes the specified StringArrayValue message, length delimited. Does not implicitly {@link common.StringArrayValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.StringArrayValue
         * @static
         * @param {common.IStringArrayValue} message StringArrayValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringArrayValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a StringArrayValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.StringArrayValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.StringArrayValue} StringArrayValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringArrayValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringArrayValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.values && message.values.length))
                            message.values = [];
                        message.values.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a StringArrayValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.StringArrayValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.StringArrayValue} StringArrayValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringArrayValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a StringArrayValue message.
         * @function verify
         * @memberof common.StringArrayValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        StringArrayValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.values != null && Object.hasOwnProperty.call(message, "values")) {
                if (!Array.isArray(message.values))
                    return "values: array expected";
                for (var i = 0; i < message.values.length; ++i)
                    if (!$util.isString(message.values[i]))
                        return "values: string[] expected";
            }
            return null;
        };

        /**
         * Creates a StringArrayValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.StringArrayValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.StringArrayValue} StringArrayValue
         */
        StringArrayValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.StringArrayValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.StringArrayValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.StringArrayValue();
            if (object.values) {
                if (!Array.isArray(object.values))
                    throw TypeError(".common.StringArrayValue.values: array expected");
                message.values = [];
                for (var i = 0; i < object.values.length; ++i)
                    message.values[i] = String(object.values[i]);
            }
            return message;
        };

        /**
         * Creates a plain object from a StringArrayValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.StringArrayValue
         * @static
         * @param {common.StringArrayValue} message StringArrayValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        StringArrayValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.values = [];
            if (message.values && message.values.length) {
                object.values = [];
                for (var j = 0; j < message.values.length; ++j)
                    object.values[j] = message.values[j];
            }
            return object;
        };

        /**
         * Converts this StringArrayValue to JSON.
         * @function toJSON
         * @memberof common.StringArrayValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        StringArrayValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for StringArrayValue
         * @function getTypeUrl
         * @memberof common.StringArrayValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        StringArrayValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.StringArrayValue";
        };

        return StringArrayValue;
    })();

    common.UInt64Value = (function() {

        /**
         * Properties of a UInt64Value.
         * @memberof common
         * @interface IUInt64Value
         * @property {number|Long|null} [value] UInt64Value value
         */

        /**
         * Constructs a new UInt64Value.
         * @memberof common
         * @classdesc Represents a UInt64Value.
         * @implements IUInt64Value
         * @constructor
         * @param {common.IUInt64Value=} [properties] Properties to set
         */
        function UInt64Value(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * UInt64Value value.
         * @member {number|Long} value
         * @memberof common.UInt64Value
         * @instance
         */
        UInt64Value.prototype.value = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new UInt64Value instance using the specified properties.
         * @function create
         * @memberof common.UInt64Value
         * @static
         * @param {common.IUInt64Value=} [properties] Properties to set
         * @returns {common.UInt64Value} UInt64Value instance
         */
        UInt64Value.create = function create(properties) {
            return new UInt64Value(properties);
        };

        /**
         * Encodes the specified UInt64Value message. Does not implicitly {@link common.UInt64Value.verify|verify} messages.
         * @function encode
         * @memberof common.UInt64Value
         * @static
         * @param {common.IUInt64Value} message UInt64Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt64Value.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.value);
            return writer;
        };

        /**
         * Encodes the specified UInt64Value message, length delimited. Does not implicitly {@link common.UInt64Value.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.UInt64Value
         * @static
         * @param {common.IUInt64Value} message UInt64Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt64Value.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a UInt64Value message from the specified reader or buffer.
         * @function decode
         * @memberof common.UInt64Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.UInt64Value} UInt64Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt64Value.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt64Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a UInt64Value message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.UInt64Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.UInt64Value} UInt64Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt64Value.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a UInt64Value message.
         * @function verify
         * @memberof common.UInt64Value
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        UInt64Value.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!$util.isInteger(message.value) && !(message.value && $util.isInteger(message.value.low) && $util.isInteger(message.value.high)))
                    return "value: integer|Long expected";
            return null;
        };

        /**
         * Creates a UInt64Value message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.UInt64Value
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.UInt64Value} UInt64Value
         */
        UInt64Value.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.UInt64Value)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.UInt64Value: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.UInt64Value();
            if (object.value != null)
                if ($util.Long)
                    message.value = $util.Long.fromValue(object.value, true);
                else if (typeof object.value === "string")
                    message.value = parseInt(object.value, 10);
                else if (typeof object.value === "number")
                    message.value = object.value;
                else if (typeof object.value === "object")
                    message.value = new $util.LongBits(object.value.low >>> 0, object.value.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from a UInt64Value message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.UInt64Value
         * @static
         * @param {common.UInt64Value} message UInt64Value
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        UInt64Value.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.value = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.value = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.value = typeof message.value === "number" ? BigInt(message.value) : $util.Long.fromBits(message.value.low >>> 0, message.value.high >>> 0, true).toBigInt();
                else if (typeof message.value === "number")
                    object.value = options.longs === String ? String(message.value) : message.value;
                else
                    object.value = options.longs === String ? $util.Long.prototype.toString.call(message.value) : options.longs === Number ? new $util.LongBits(message.value.low >>> 0, message.value.high >>> 0).toNumber(true) : message.value;
            return object;
        };

        /**
         * Converts this UInt64Value to JSON.
         * @function toJSON
         * @memberof common.UInt64Value
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        UInt64Value.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for UInt64Value
         * @function getTypeUrl
         * @memberof common.UInt64Value
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        UInt64Value.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.UInt64Value";
        };

        return UInt64Value;
    })();

    common.UInt32Value = (function() {

        /**
         * Properties of a UInt32Value.
         * @memberof common
         * @interface IUInt32Value
         * @property {number|null} [value] UInt32Value value
         */

        /**
         * Constructs a new UInt32Value.
         * @memberof common
         * @classdesc Represents a UInt32Value.
         * @implements IUInt32Value
         * @constructor
         * @param {common.IUInt32Value=} [properties] Properties to set
         */
        function UInt32Value(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * UInt32Value value.
         * @member {number} value
         * @memberof common.UInt32Value
         * @instance
         */
        UInt32Value.prototype.value = 0;

        /**
         * Creates a new UInt32Value instance using the specified properties.
         * @function create
         * @memberof common.UInt32Value
         * @static
         * @param {common.IUInt32Value=} [properties] Properties to set
         * @returns {common.UInt32Value} UInt32Value instance
         */
        UInt32Value.create = function create(properties) {
            return new UInt32Value(properties);
        };

        /**
         * Encodes the specified UInt32Value message. Does not implicitly {@link common.UInt32Value.verify|verify} messages.
         * @function encode
         * @memberof common.UInt32Value
         * @static
         * @param {common.IUInt32Value} message UInt32Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt32Value.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.value);
            return writer;
        };

        /**
         * Encodes the specified UInt32Value message, length delimited. Does not implicitly {@link common.UInt32Value.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.UInt32Value
         * @static
         * @param {common.IUInt32Value} message UInt32Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt32Value.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a UInt32Value message from the specified reader or buffer.
         * @function decode
         * @memberof common.UInt32Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.UInt32Value} UInt32Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt32Value.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt32Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.uint32();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a UInt32Value message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.UInt32Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.UInt32Value} UInt32Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt32Value.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a UInt32Value message.
         * @function verify
         * @memberof common.UInt32Value
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        UInt32Value.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!$util.isInteger(message.value))
                    return "value: integer expected";
            return null;
        };

        /**
         * Creates a UInt32Value message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.UInt32Value
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.UInt32Value} UInt32Value
         */
        UInt32Value.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.UInt32Value)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.UInt32Value: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.UInt32Value();
            if (object.value != null)
                message.value = object.value >>> 0;
            return message;
        };

        /**
         * Creates a plain object from a UInt32Value message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.UInt32Value
         * @static
         * @param {common.UInt32Value} message UInt32Value
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        UInt32Value.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.value = 0;
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = message.value;
            return object;
        };

        /**
         * Converts this UInt32Value to JSON.
         * @function toJSON
         * @memberof common.UInt32Value
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        UInt32Value.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for UInt32Value
         * @function getTypeUrl
         * @memberof common.UInt32Value
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        UInt32Value.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.UInt32Value";
        };

        return UInt32Value;
    })();

    common.StringValue = (function() {

        /**
         * Properties of a StringValue.
         * @memberof common
         * @interface IStringValue
         * @property {string|null} [value] StringValue value
         */

        /**
         * Constructs a new StringValue.
         * @memberof common
         * @classdesc Represents a StringValue.
         * @implements IStringValue
         * @constructor
         * @param {common.IStringValue=} [properties] Properties to set
         */
        function StringValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * StringValue value.
         * @member {string} value
         * @memberof common.StringValue
         * @instance
         */
        StringValue.prototype.value = "";

        /**
         * Creates a new StringValue instance using the specified properties.
         * @function create
         * @memberof common.StringValue
         * @static
         * @param {common.IStringValue=} [properties] Properties to set
         * @returns {common.StringValue} StringValue instance
         */
        StringValue.create = function create(properties) {
            return new StringValue(properties);
        };

        /**
         * Encodes the specified StringValue message. Does not implicitly {@link common.StringValue.verify|verify} messages.
         * @function encode
         * @memberof common.StringValue
         * @static
         * @param {common.IStringValue} message StringValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.value);
            return writer;
        };

        /**
         * Encodes the specified StringValue message, length delimited. Does not implicitly {@link common.StringValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.StringValue
         * @static
         * @param {common.IStringValue} message StringValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a StringValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.StringValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.StringValue} StringValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a StringValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.StringValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.StringValue} StringValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a StringValue message.
         * @function verify
         * @memberof common.StringValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        StringValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!$util.isString(message.value))
                    return "value: string expected";
            return null;
        };

        /**
         * Creates a StringValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.StringValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.StringValue} StringValue
         */
        StringValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.StringValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.StringValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.StringValue();
            if (object.value != null)
                message.value = String(object.value);
            return message;
        };

        /**
         * Creates a plain object from a StringValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.StringValue
         * @static
         * @param {common.StringValue} message StringValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        StringValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.value = "";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = message.value;
            return object;
        };

        /**
         * Converts this StringValue to JSON.
         * @function toJSON
         * @memberof common.StringValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        StringValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for StringValue
         * @function getTypeUrl
         * @memberof common.StringValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        StringValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.StringValue";
        };

        return StringValue;
    })();

    common.BytesValue = (function() {

        /**
         * Properties of a BytesValue.
         * @memberof common
         * @interface IBytesValue
         * @property {Uint8Array|null} [value] BytesValue value
         */

        /**
         * Constructs a new BytesValue.
         * @memberof common
         * @classdesc Represents a BytesValue.
         * @implements IBytesValue
         * @constructor
         * @param {common.IBytesValue=} [properties] Properties to set
         */
        function BytesValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * BytesValue value.
         * @member {Uint8Array} value
         * @memberof common.BytesValue
         * @instance
         */
        BytesValue.prototype.value = $util.newBuffer([]);

        /**
         * Creates a new BytesValue instance using the specified properties.
         * @function create
         * @memberof common.BytesValue
         * @static
         * @param {common.IBytesValue=} [properties] Properties to set
         * @returns {common.BytesValue} BytesValue instance
         */
        BytesValue.create = function create(properties) {
            return new BytesValue(properties);
        };

        /**
         * Encodes the specified BytesValue message. Does not implicitly {@link common.BytesValue.verify|verify} messages.
         * @function encode
         * @memberof common.BytesValue
         * @static
         * @param {common.IBytesValue} message BytesValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BytesValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.value);
            return writer;
        };

        /**
         * Encodes the specified BytesValue message, length delimited. Does not implicitly {@link common.BytesValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.BytesValue
         * @static
         * @param {common.IBytesValue} message BytesValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BytesValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a BytesValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.BytesValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.BytesValue} BytesValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BytesValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BytesValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.bytes();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a BytesValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.BytesValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.BytesValue} BytesValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BytesValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a BytesValue message.
         * @function verify
         * @memberof common.BytesValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        BytesValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!(message.value && typeof message.value.length === "number" || $util.isString(message.value)))
                    return "value: buffer expected";
            return null;
        };

        /**
         * Creates a BytesValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.BytesValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.BytesValue} BytesValue
         */
        BytesValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.BytesValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.BytesValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.BytesValue();
            if (object.value != null)
                if (typeof object.value === "string")
                    $util.base64.decode(object.value, message.value = $util.newBuffer($util.base64.length(object.value)), 0);
                else if (object.value.length >= 0)
                    message.value = object.value;
            return message;
        };

        /**
         * Creates a plain object from a BytesValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.BytesValue
         * @static
         * @param {common.BytesValue} message BytesValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        BytesValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if (options.bytes === String)
                    object.value = "";
                else {
                    object.value = [];
                    if (options.bytes !== Array)
                        object.value = $util.newBuffer(object.value);
                }
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = options.bytes === String ? $util.base64.encode(message.value, 0, message.value.length) : options.bytes === Array ? Array.prototype.slice.call(message.value) : message.value;
            return object;
        };

        /**
         * Converts this BytesValue to JSON.
         * @function toJSON
         * @memberof common.BytesValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        BytesValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for BytesValue
         * @function getTypeUrl
         * @memberof common.BytesValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        BytesValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.BytesValue";
        };

        return BytesValue;
    })();

    common.ErrorValue = (function() {

        /**
         * Properties of an ErrorValue.
         * @memberof common
         * @interface IErrorValue
         * @property {string|null} [runtimeExcJson] ErrorValue runtimeExcJson
         * @property {string|null} [err] ErrorValue err
         */

        /**
         * Constructs a new ErrorValue.
         * @memberof common
         * @classdesc Represents an ErrorValue.
         * @implements IErrorValue
         * @constructor
         * @param {common.IErrorValue=} [properties] Properties to set
         */
        function ErrorValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ErrorValue runtimeExcJson.
         * @member {string} runtimeExcJson
         * @memberof common.ErrorValue
         * @instance
         */
        ErrorValue.prototype.runtimeExcJson = "";

        /**
         * ErrorValue err.
         * @member {string} err
         * @memberof common.ErrorValue
         * @instance
         */
        ErrorValue.prototype.err = "";

        /**
         * Creates a new ErrorValue instance using the specified properties.
         * @function create
         * @memberof common.ErrorValue
         * @static
         * @param {common.IErrorValue=} [properties] Properties to set
         * @returns {common.ErrorValue} ErrorValue instance
         */
        ErrorValue.create = function create(properties) {
            return new ErrorValue(properties);
        };

        /**
         * Encodes the specified ErrorValue message. Does not implicitly {@link common.ErrorValue.verify|verify} messages.
         * @function encode
         * @memberof common.ErrorValue
         * @static
         * @param {common.IErrorValue} message ErrorValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ErrorValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.runtimeExcJson != null && Object.hasOwnProperty.call(message, "runtimeExcJson"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.runtimeExcJson);
            if (message.err != null && Object.hasOwnProperty.call(message, "err"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.err);
            return writer;
        };

        /**
         * Encodes the specified ErrorValue message, length delimited. Does not implicitly {@link common.ErrorValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.ErrorValue
         * @static
         * @param {common.IErrorValue} message ErrorValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ErrorValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an ErrorValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.ErrorValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.ErrorValue} ErrorValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ErrorValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ErrorValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.runtimeExcJson = reader.string();
                        break;
                    }
                case 2: {
                        message.err = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an ErrorValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.ErrorValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.ErrorValue} ErrorValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ErrorValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an ErrorValue message.
         * @function verify
         * @memberof common.ErrorValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ErrorValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.runtimeExcJson != null && Object.hasOwnProperty.call(message, "runtimeExcJson"))
                if (!$util.isString(message.runtimeExcJson))
                    return "runtimeExcJson: string expected";
            if (message.err != null && Object.hasOwnProperty.call(message, "err"))
                if (!$util.isString(message.err))
                    return "err: string expected";
            return null;
        };

        /**
         * Creates an ErrorValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.ErrorValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.ErrorValue} ErrorValue
         */
        ErrorValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.ErrorValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.ErrorValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.ErrorValue();
            if (object.runtimeExcJson != null)
                message.runtimeExcJson = String(object.runtimeExcJson);
            if (object.err != null)
                message.err = String(object.err);
            return message;
        };

        /**
         * Creates a plain object from an ErrorValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.ErrorValue
         * @static
         * @param {common.ErrorValue} message ErrorValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ErrorValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.runtimeExcJson = "";
                object.err = "";
            }
            if (message.runtimeExcJson != null && Object.hasOwnProperty.call(message, "runtimeExcJson"))
                object.runtimeExcJson = message.runtimeExcJson;
            if (message.err != null && Object.hasOwnProperty.call(message, "err"))
                object.err = message.err;
            return object;
        };

        /**
         * Converts this ErrorValue to JSON.
         * @function toJSON
         * @memberof common.ErrorValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ErrorValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ErrorValue
         * @function getTypeUrl
         * @memberof common.ErrorValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ErrorValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.ErrorValue";
        };

        return ErrorValue;
    })();

    common.AnyValue = (function() {

        /**
         * Properties of an AnyValue.
         * @memberof common
         * @interface IAnyValue
         * @property {string|null} [type] AnyValue type
         * @property {common.IStringValue|null} [json] AnyValue json
         * @property {common.IBytesValue|null} [bytes] AnyValue bytes
         */

        /**
         * Constructs a new AnyValue.
         * @memberof common
         * @classdesc Represents an AnyValue.
         * @implements IAnyValue
         * @constructor
         * @param {common.IAnyValue=} [properties] Properties to set
         */
        function AnyValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * AnyValue type.
         * @member {string} type
         * @memberof common.AnyValue
         * @instance
         */
        AnyValue.prototype.type = "";

        /**
         * AnyValue json.
         * @member {common.IStringValue|null|undefined} json
         * @memberof common.AnyValue
         * @instance
         */
        AnyValue.prototype.json = null;

        /**
         * AnyValue bytes.
         * @member {common.IBytesValue|null|undefined} bytes
         * @memberof common.AnyValue
         * @instance
         */
        AnyValue.prototype.bytes = null;

        /**
         * Creates a new AnyValue instance using the specified properties.
         * @function create
         * @memberof common.AnyValue
         * @static
         * @param {common.IAnyValue=} [properties] Properties to set
         * @returns {common.AnyValue} AnyValue instance
         */
        AnyValue.create = function create(properties) {
            return new AnyValue(properties);
        };

        /**
         * Encodes the specified AnyValue message. Does not implicitly {@link common.AnyValue.verify|verify} messages.
         * @function encode
         * @memberof common.AnyValue
         * @static
         * @param {common.IAnyValue} message AnyValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AnyValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.type);
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified AnyValue message, length delimited. Does not implicitly {@link common.AnyValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.AnyValue
         * @static
         * @param {common.IAnyValue} message AnyValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AnyValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an AnyValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.AnyValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.AnyValue} AnyValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AnyValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.AnyValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.type = reader.string();
                        break;
                    }
                case 2: {
                        message.json = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an AnyValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.AnyValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.AnyValue} AnyValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AnyValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an AnyValue message.
         * @function verify
         * @memberof common.AnyValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        AnyValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.json != null && Object.hasOwnProperty.call(message, "json")) {
                var error = $root.common.StringValue.verify(message.json, long + 1);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes, long + 1);
                if (error)
                    return "bytes." + error;
            }
            return null;
        };

        /**
         * Creates an AnyValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.AnyValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.AnyValue} AnyValue
         */
        AnyValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.AnyValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.AnyValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.AnyValue();
            if (object.type != null)
                message.type = String(object.type);
            if (object.json != null) {
                if (!$util.isObject(object.json))
                    throw TypeError(".common.AnyValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json, long + 1);
            }
            if (object.bytes != null) {
                if (!$util.isObject(object.bytes))
                    throw TypeError(".common.AnyValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an AnyValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.AnyValue
         * @static
         * @param {common.AnyValue} message AnyValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        AnyValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.json = null;
                object.bytes = null;
            }
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                object.type = message.type;
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = $root.common.StringValue.toObject(message.json, options, q + 1);
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options, q + 1);
            return object;
        };

        /**
         * Converts this AnyValue to JSON.
         * @function toJSON
         * @memberof common.AnyValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        AnyValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for AnyValue
         * @function getTypeUrl
         * @memberof common.AnyValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        AnyValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.AnyValue";
        };

        return AnyValue;
    })();

    return common;
})();

module.exports = $root;

},{"protobufjs/minimal":84}],33:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2020 - 2022, 2024 - 2025 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.makeClientSideConnector = makeClientSideConnector;
exports.makeStartupW3N = makeStartupW3N;
exports.makeW3N = makeW3N;
const rxjs_1 = require("rxjs");
const ipc_1 = require("core-3nweb-client-lib/build/ipc");
const buffer_utils_1 = require("../../platform/lib-common/buffer-utils");
const test_stand_cap_ipc_1 = require("../../platform/caps/test-stand/test-stand-cap-ipc");
const client_side_w3n_1 = require("../../platform/core/client-side-w3n");
function makeClientSideConnector({ listObjOnServiceSide, sendMsgToCore, setHandlerOfMsgsFromCore }) {
    const fromCore = new rxjs_1.Subject();
    const coreListener = (msg) => {
        if (msg.body) {
            msg.body.value = (0, buffer_utils_1.toBuffer)(msg.body.value);
        }
        fromCore.next(msg);
    };
    const detachListener = setHandlerOfMsgsFromCore(coreListener);
    const toClient = fromCore.asObservable();
    const fromClient = new rxjs_1.Subject();
    fromClient.asObservable().subscribe({
        next: msg => sendMsgToCore(msg),
        error: detachListener,
        complete: detachListener
    });
    return ipc_1.ObjectsConnector.makeClientSide(fromClient, toClient, listObjOnServiceSide);
}
function makeStartupW3N(ipc) {
    const clientSide = makeClientSideConnector(ipc);
    const clientW3N = (0, ipc_1.makeStartupW3Nclient)(clientSide, {
        testStand: test_stand_cap_ipc_1.makeStartupTestStandCaller,
        provider: client_side_w3n_1.makeProviderCaller,
        enableAutoLogin: (caller, path) => ipc_1.callerSideJSONWrap.makeReqRepFuncCaller(caller, path)
    });
    return clientW3N;
}
function makeW3N(ipc) {
    var _a;
    const clientSide = makeClientSideConnector(ipc);
    const w3n = (0, client_side_w3n_1.makeClientSideW3N)(clientSide);
    if ((_a = w3n.shell) === null || _a === void 0 ? void 0 : _a.deviceFiles) {
        const { standardFileToPath } = ipc;
        function getPathIfNotMemoryBasedFile(f) {
            const path = standardFileToPath(f);
            if (path.length === 0) {
                throw {
                    runtimeException: true,
                    type: 'file',
                    isInMemoryFile: true,
                    file: f
                };
            }
            return path;
        }
        const { standardFileToDeviceFile, standardFileToDeviceFolder, statStandardItem } = w3n.shell.deviceFiles;
        if (standardFileToDeviceFile) {
            w3n.shell.deviceFiles.standardFileToDeviceFile = async (f) => {
                const path = getPathIfNotMemoryBasedFile(f);
                return await standardFileToDeviceFile(path);
            };
        }
        if (standardFileToDeviceFolder) {
            w3n.shell.deviceFiles.standardFileToDeviceFolder = async (f) => {
                const path = getPathIfNotMemoryBasedFile(f);
                return await standardFileToDeviceFolder(path);
            };
        }
        w3n.shell.deviceFiles.statStandardItem = async (f) => {
            const path = getPathIfNotMemoryBasedFile(f);
            return await statStandardItem(path);
        };
    }
    return w3n;
}
Object.freeze(exports);

},{"../../platform/caps/test-stand/test-stand-cap-ipc":17,"../../platform/core/client-side-w3n":19,"../../platform/lib-common/buffer-utils":20,"core-3nweb-client-lib/build/ipc":62,"rxjs":95}],34:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2020 - 2021, 2024 3NSoft Inc.

 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.

 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.

 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
const renderer_side_wrap_1 = require("./renderer-side-wrap");
if (window['make.w3n.ipc']) {
    window.w3n = (0, renderer_side_wrap_1.makeW3N)(window['make.w3n.ipc']());
}

},{"./renderer-side-wrap":33}],35:[function(require,module,exports){
"use strict";
module.exports = asPromise;

/**
 * Callback as used by {@link util.asPromise}.
 * @typedef asPromiseCallback
 * @type {function}
 * @param {Error|null} error Error, if any
 * @param {...*} params Additional arguments
 * @returns {undefined}
 */

/**
 * Returns a promise from a node-style callback function.
 * @memberof util
 * @param {asPromiseCallback} fn Function to call
 * @param {*} ctx Function context
 * @param {...*} params Function arguments
 * @returns {Promise<*>} Promisified function
 */
function asPromise(fn, ctx/*, varargs */) {
    var params  = new Array(arguments.length - 1),
        offset  = 0,
        index   = 2,
        pending = true;
    while (index < arguments.length)
        params[offset++] = arguments[index++];
    return new Promise(function executor(resolve, reject) {
        params[offset] = function callback(err/*, varargs */) {
            if (pending) {
                pending = false;
                if (err)
                    reject(err);
                else {
                    var params = new Array(arguments.length - 1),
                        offset = 0;
                    while (offset < params.length)
                        params[offset++] = arguments[offset];
                    resolve.apply(null, params);
                }
            }
        };
        try {
            fn.apply(ctx || null, params);
        } catch (err) {
            if (pending) {
                pending = false;
                reject(err);
            }
        }
    });
}

},{}],36:[function(require,module,exports){
"use strict";

/**
 * A minimal base64 implementation for number arrays.
 * @memberof util
 * @namespace
 */
var base64 = exports;

/**
 * Calculates the byte length of a base64 encoded string.
 * @param {string} string Base64 encoded string
 * @returns {number} Byte length
 */
base64.length = function length(string) {
    var p = string.length;
    if (!p)
        return 0;
    var n = 0;
    while (--p % 4 > 1 && string.charAt(p) === "=")
        ++n;
    return Math.ceil(string.length * 3) / 4 - n;
};

// Base64 encoding table
var b64 = new Array(64);

// Base64 decoding table
var s64 = new Array(123);

// 65..90, 97..122, 48..57, 43, 47
for (var i = 0; i < 64;)
    s64[b64[i] = i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i - 59 | 43] = i++;

/**
 * Encodes a buffer to a base64 encoded string.
 * @param {Uint8Array} buffer Source buffer
 * @param {number} start Source start
 * @param {number} end Source end
 * @returns {string} Base64 encoded string
 */
base64.encode = function encode(buffer, start, end) {
    var parts = null,
        chunk = [];
    var i = 0, // output index
        j = 0, // goto index
        t;     // temporary
    while (start < end) {
        var b = buffer[start++];
        switch (j) {
            case 0:
                chunk[i++] = b64[b >> 2];
                t = (b & 3) << 4;
                j = 1;
                break;
            case 1:
                chunk[i++] = b64[t | b >> 4];
                t = (b & 15) << 2;
                j = 2;
                break;
            case 2:
                chunk[i++] = b64[t | b >> 6];
                chunk[i++] = b64[b & 63];
                j = 0;
                break;
        }
        if (i > 8191) {
            (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk));
            i = 0;
        }
    }
    if (j) {
        chunk[i++] = b64[t];
        chunk[i++] = 61;
        if (j === 1)
            chunk[i++] = 61;
    }
    if (parts) {
        if (i)
            parts.push(String.fromCharCode.apply(String, chunk.slice(0, i)));
        return parts.join("");
    }
    return String.fromCharCode.apply(String, chunk.slice(0, i));
};

var invalidEncoding = "invalid encoding";

/**
 * Decodes a base64 encoded string to a buffer.
 * @param {string} string Source string
 * @param {Uint8Array} buffer Destination buffer
 * @param {number} offset Destination offset
 * @returns {number} Number of bytes written
 * @throws {Error} If encoding is invalid
 */
base64.decode = function decode(string, buffer, offset) {
    var start = offset;
    var j = 0, // goto index
        t;     // temporary
    for (var i = 0; i < string.length;) {
        var c = string.charCodeAt(i++);
        if (c === 61 && j > 1)
            break;
        if ((c = s64[c]) === undefined)
            throw Error(invalidEncoding);
        switch (j) {
            case 0:
                t = c;
                j = 1;
                break;
            case 1:
                buffer[offset++] = t << 2 | (c & 48) >> 4;
                t = c;
                j = 2;
                break;
            case 2:
                buffer[offset++] = (t & 15) << 4 | (c & 60) >> 2;
                t = c;
                j = 3;
                break;
            case 3:
                buffer[offset++] = (t & 3) << 6 | c;
                j = 0;
                break;
        }
    }
    if (j === 1)
        throw Error(invalidEncoding);
    return offset - start;
};

/**
 * Tests if the specified string appears to be base64 encoded.
 * @param {string} string String to test
 * @returns {boolean} `true` if probably base64 encoded, otherwise false
 */
base64.test = function test(string) {
    return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(string);
};

},{}],37:[function(require,module,exports){
"use strict";
module.exports = EventEmitter;

/**
 * Constructs a new event emitter instance.
 * @classdesc A minimal event emitter.
 * @memberof util
 * @constructor
 */
function EventEmitter() {

    /**
     * Registered listeners.
     * @type {Object.<string,*>}
     * @private
     */
    this._listeners = Object.create(null);
}

/**
 * Event listener as used by {@link util.EventEmitter}.
 * @typedef EventEmitterListener
 * @type {function}
 * @param {...*} args Arguments
 * @returns {undefined}
 */

/**
 * Registers an event listener.
 * @param {string} evt Event name
 * @param {EventEmitterListener} fn Listener
 * @param {*} [ctx] Listener context
 * @returns {this} `this`
 */
EventEmitter.prototype.on = function on(evt, fn, ctx) {
    (this._listeners[evt] || (this._listeners[evt] = [])).push({
        fn  : fn,
        ctx : ctx || this
    });
    return this;
};

/**
 * Removes an event listener or any matching listeners if arguments are omitted.
 * @param {string} [evt] Event name. Removes all listeners if omitted.
 * @param {EventEmitterListener} [fn] Listener to remove. Removes all listeners of `evt` if omitted.
 * @returns {this} `this`
 */
EventEmitter.prototype.off = function off(evt, fn) {
    if (evt === undefined)
        this._listeners = Object.create(null);
    else {
        if (fn === undefined)
            this._listeners[evt] = [];
        else {
            var listeners = this._listeners[evt];
            if (!listeners)
                return this;
            for (var i = 0; i < listeners.length;)
                if (listeners[i].fn === fn)
                    listeners.splice(i, 1);
                else
                    ++i;
        }
    }
    return this;
};

/**
 * Emits an event by calling its listeners with the specified arguments.
 * @param {string} evt Event name
 * @param {...*} args Arguments
 * @returns {this} `this`
 */
EventEmitter.prototype.emit = function emit(evt) {
    var listeners = this._listeners[evt];
    if (listeners) {
        var args = [],
            i = 1;
        for (; i < arguments.length;)
            args.push(arguments[i++]);
        for (i = 0; i < listeners.length;)
            listeners[i].fn.apply(listeners[i++].ctx, args);
    }
    return this;
};

},{}],38:[function(require,module,exports){
"use strict";

module.exports = factory(factory);

/**
 * Reads / writes floats / doubles from / to buffers.
 * @name util.float
 * @namespace
 */

/**
 * Writes a 32 bit float to a buffer using little endian byte order.
 * @name util.float.writeFloatLE
 * @function
 * @param {number} val Value to write
 * @param {Uint8Array} buf Target buffer
 * @param {number} pos Target buffer offset
 * @returns {undefined}
 */

/**
 * Writes a 32 bit float to a buffer using big endian byte order.
 * @name util.float.writeFloatBE
 * @function
 * @param {number} val Value to write
 * @param {Uint8Array} buf Target buffer
 * @param {number} pos Target buffer offset
 * @returns {undefined}
 */

/**
 * Reads a 32 bit float from a buffer using little endian byte order.
 * @name util.float.readFloatLE
 * @function
 * @param {Uint8Array} buf Source buffer
 * @param {number} pos Source buffer offset
 * @returns {number} Value read
 */

/**
 * Reads a 32 bit float from a buffer using big endian byte order.
 * @name util.float.readFloatBE
 * @function
 * @param {Uint8Array} buf Source buffer
 * @param {number} pos Source buffer offset
 * @returns {number} Value read
 */

/**
 * Writes a 64 bit double to a buffer using little endian byte order.
 * @name util.float.writeDoubleLE
 * @function
 * @param {number} val Value to write
 * @param {Uint8Array} buf Target buffer
 * @param {number} pos Target buffer offset
 * @returns {undefined}
 */

/**
 * Writes a 64 bit double to a buffer using big endian byte order.
 * @name util.float.writeDoubleBE
 * @function
 * @param {number} val Value to write
 * @param {Uint8Array} buf Target buffer
 * @param {number} pos Target buffer offset
 * @returns {undefined}
 */

/**
 * Reads a 64 bit double from a buffer using little endian byte order.
 * @name util.float.readDoubleLE
 * @function
 * @param {Uint8Array} buf Source buffer
 * @param {number} pos Source buffer offset
 * @returns {number} Value read
 */

/**
 * Reads a 64 bit double from a buffer using big endian byte order.
 * @name util.float.readDoubleBE
 * @function
 * @param {Uint8Array} buf Source buffer
 * @param {number} pos Source buffer offset
 * @returns {number} Value read
 */

// Factory function for the purpose of node-based testing in modified global environments
function factory(exports) {

    // float: typed array
    if (typeof Float32Array !== "undefined") (function() {

        var f32 = new Float32Array([ -0 ]),
            f8b = new Uint8Array(f32.buffer),
            le  = f8b[3] === 128;

        function writeFloat_f32_cpy(val, buf, pos) {
            f32[0] = val;
            buf[pos    ] = f8b[0];
            buf[pos + 1] = f8b[1];
            buf[pos + 2] = f8b[2];
            buf[pos + 3] = f8b[3];
        }

        function writeFloat_f32_rev(val, buf, pos) {
            f32[0] = val;
            buf[pos    ] = f8b[3];
            buf[pos + 1] = f8b[2];
            buf[pos + 2] = f8b[1];
            buf[pos + 3] = f8b[0];
        }

        /* istanbul ignore next */
        exports.writeFloatLE = le ? writeFloat_f32_cpy : writeFloat_f32_rev;
        /* istanbul ignore next */
        exports.writeFloatBE = le ? writeFloat_f32_rev : writeFloat_f32_cpy;

        function readFloat_f32_cpy(buf, pos) {
            f8b[0] = buf[pos    ];
            f8b[1] = buf[pos + 1];
            f8b[2] = buf[pos + 2];
            f8b[3] = buf[pos + 3];
            return f32[0];
        }

        function readFloat_f32_rev(buf, pos) {
            f8b[3] = buf[pos    ];
            f8b[2] = buf[pos + 1];
            f8b[1] = buf[pos + 2];
            f8b[0] = buf[pos + 3];
            return f32[0];
        }

        /* istanbul ignore next */
        exports.readFloatLE = le ? readFloat_f32_cpy : readFloat_f32_rev;
        /* istanbul ignore next */
        exports.readFloatBE = le ? readFloat_f32_rev : readFloat_f32_cpy;

    // float: ieee754
    })(); else (function() {

        function writeFloat_ieee754(writeUint, val, buf, pos) {
            var sign = val < 0 ? 1 : 0;
            if (sign)
                val = -val;
            if (val === 0)
                writeUint(1 / val > 0 ? /* positive */ 0 : /* negative 0 */ 2147483648, buf, pos);
            else if (isNaN(val))
                writeUint(2143289344, buf, pos);
            else if (val > 3.4028234663852886e+38) // +-Infinity
                writeUint((sign << 31 | 2139095040) >>> 0, buf, pos);
            else if (val < 1.1754943508222875e-38) // denormal
                writeUint((sign << 31 | Math.round(val / 1.401298464324817e-45)) >>> 0, buf, pos);
            else {
                var exponent = Math.floor(Math.log(val) / Math.LN2),
                    mantissa = Math.round(val * Math.pow(2, -exponent) * 8388608) & 8388607;
                writeUint((sign << 31 | exponent + 127 << 23 | mantissa) >>> 0, buf, pos);
            }
        }

        exports.writeFloatLE = writeFloat_ieee754.bind(null, writeUintLE);
        exports.writeFloatBE = writeFloat_ieee754.bind(null, writeUintBE);

        function readFloat_ieee754(readUint, buf, pos) {
            var uint = readUint(buf, pos),
                sign = (uint >> 31) * 2 + 1,
                exponent = uint >>> 23 & 255,
                mantissa = uint & 8388607;
            return exponent === 255
                ? mantissa
                ? NaN
                : sign * Infinity
                : exponent === 0 // denormal
                ? sign * 1.401298464324817e-45 * mantissa
                : sign * Math.pow(2, exponent - 150) * (mantissa + 8388608);
        }

        exports.readFloatLE = readFloat_ieee754.bind(null, readUintLE);
        exports.readFloatBE = readFloat_ieee754.bind(null, readUintBE);

    })();

    // double: typed array
    if (typeof Float64Array !== "undefined") (function() {

        var f64 = new Float64Array([-0]),
            f8b = new Uint8Array(f64.buffer),
            le  = f8b[7] === 128;

        function writeDouble_f64_cpy(val, buf, pos) {
            f64[0] = val;
            buf[pos    ] = f8b[0];
            buf[pos + 1] = f8b[1];
            buf[pos + 2] = f8b[2];
            buf[pos + 3] = f8b[3];
            buf[pos + 4] = f8b[4];
            buf[pos + 5] = f8b[5];
            buf[pos + 6] = f8b[6];
            buf[pos + 7] = f8b[7];
        }

        function writeDouble_f64_rev(val, buf, pos) {
            f64[0] = val;
            buf[pos    ] = f8b[7];
            buf[pos + 1] = f8b[6];
            buf[pos + 2] = f8b[5];
            buf[pos + 3] = f8b[4];
            buf[pos + 4] = f8b[3];
            buf[pos + 5] = f8b[2];
            buf[pos + 6] = f8b[1];
            buf[pos + 7] = f8b[0];
        }

        /* istanbul ignore next */
        exports.writeDoubleLE = le ? writeDouble_f64_cpy : writeDouble_f64_rev;
        /* istanbul ignore next */
        exports.writeDoubleBE = le ? writeDouble_f64_rev : writeDouble_f64_cpy;

        function readDouble_f64_cpy(buf, pos) {
            f8b[0] = buf[pos    ];
            f8b[1] = buf[pos + 1];
            f8b[2] = buf[pos + 2];
            f8b[3] = buf[pos + 3];
            f8b[4] = buf[pos + 4];
            f8b[5] = buf[pos + 5];
            f8b[6] = buf[pos + 6];
            f8b[7] = buf[pos + 7];
            return f64[0];
        }

        function readDouble_f64_rev(buf, pos) {
            f8b[7] = buf[pos    ];
            f8b[6] = buf[pos + 1];
            f8b[5] = buf[pos + 2];
            f8b[4] = buf[pos + 3];
            f8b[3] = buf[pos + 4];
            f8b[2] = buf[pos + 5];
            f8b[1] = buf[pos + 6];
            f8b[0] = buf[pos + 7];
            return f64[0];
        }

        /* istanbul ignore next */
        exports.readDoubleLE = le ? readDouble_f64_cpy : readDouble_f64_rev;
        /* istanbul ignore next */
        exports.readDoubleBE = le ? readDouble_f64_rev : readDouble_f64_cpy;

    // double: ieee754
    })(); else (function() {

        function writeDouble_ieee754(writeUint, off0, off1, val, buf, pos) {
            var sign = val < 0 ? 1 : 0;
            if (sign)
                val = -val;
            if (val === 0) {
                writeUint(0, buf, pos + off0);
                writeUint(1 / val > 0 ? /* positive */ 0 : /* negative 0 */ 2147483648, buf, pos + off1);
            } else if (isNaN(val)) {
                writeUint(0, buf, pos + off0);
                writeUint(2146959360, buf, pos + off1);
            } else if (val > 1.7976931348623157e+308) { // +-Infinity
                writeUint(0, buf, pos + off0);
                writeUint((sign << 31 | 2146435072) >>> 0, buf, pos + off1);
            } else {
                var mantissa;
                if (val < 2.2250738585072014e-308) { // denormal
                    mantissa = val / 5e-324;
                    writeUint(mantissa >>> 0, buf, pos + off0);
                    writeUint((sign << 31 | mantissa / 4294967296) >>> 0, buf, pos + off1);
                } else {
                    var exponent = Math.floor(Math.log(val) / Math.LN2);
                    if (exponent === 1024)
                        exponent = 1023;
                    mantissa = val * Math.pow(2, -exponent);
                    writeUint(mantissa * 4503599627370496 >>> 0, buf, pos + off0);
                    writeUint((sign << 31 | exponent + 1023 << 20 | mantissa * 1048576 & 1048575) >>> 0, buf, pos + off1);
                }
            }
        }

        exports.writeDoubleLE = writeDouble_ieee754.bind(null, writeUintLE, 0, 4);
        exports.writeDoubleBE = writeDouble_ieee754.bind(null, writeUintBE, 4, 0);

        function readDouble_ieee754(readUint, off0, off1, buf, pos) {
            var lo = readUint(buf, pos + off0),
                hi = readUint(buf, pos + off1);
            var sign = (hi >> 31) * 2 + 1,
                exponent = hi >>> 20 & 2047,
                mantissa = 4294967296 * (hi & 1048575) + lo;
            return exponent === 2047
                ? mantissa
                ? NaN
                : sign * Infinity
                : exponent === 0 // denormal
                ? sign * 5e-324 * mantissa
                : sign * Math.pow(2, exponent - 1075) * (mantissa + 4503599627370496);
        }

        exports.readDoubleLE = readDouble_ieee754.bind(null, readUintLE, 0, 4);
        exports.readDoubleBE = readDouble_ieee754.bind(null, readUintBE, 4, 0);

    })();

    return exports;
}

// uint helpers

function writeUintLE(val, buf, pos) {
    buf[pos    ] =  val        & 255;
    buf[pos + 1] =  val >>> 8  & 255;
    buf[pos + 2] =  val >>> 16 & 255;
    buf[pos + 3] =  val >>> 24;
}

function writeUintBE(val, buf, pos) {
    buf[pos    ] =  val >>> 24;
    buf[pos + 1] =  val >>> 16 & 255;
    buf[pos + 2] =  val >>> 8  & 255;
    buf[pos + 3] =  val        & 255;
}

function readUintLE(buf, pos) {
    return (buf[pos    ]
          | buf[pos + 1] << 8
          | buf[pos + 2] << 16
          | buf[pos + 3] << 24) >>> 0;
}

function readUintBE(buf, pos) {
    return (buf[pos    ] << 24
          | buf[pos + 1] << 16
          | buf[pos + 2] << 8
          | buf[pos + 3]) >>> 0;
}

},{}],39:[function(require,module,exports){
"use strict";
module.exports = pool;

/**
 * An allocator as used by {@link util.pool}.
 * @typedef PoolAllocator
 * @type {function}
 * @param {number} size Buffer size
 * @returns {Uint8Array} Buffer
 */

/**
 * A slicer as used by {@link util.pool}.
 * @typedef PoolSlicer
 * @type {function}
 * @param {number} start Start offset
 * @param {number} end End offset
 * @returns {Uint8Array} Buffer slice
 * @this {Uint8Array}
 */

/**
 * A general purpose buffer pool.
 * @memberof util
 * @function
 * @param {PoolAllocator} alloc Allocator
 * @param {PoolSlicer} slice Slicer
 * @param {number} [size=8192] Slab size
 * @returns {PoolAllocator} Pooled allocator
 */
function pool(alloc, slice, size) {
    var SIZE   = size || 8192;
    var MAX    = SIZE >>> 1;
    var slab   = null;
    var offset = SIZE;
    return function pool_alloc(size) {
        if (size < 1 || size > MAX)
            return alloc(size);
        if (offset + size > SIZE) {
            slab = alloc(SIZE);
            offset = 0;
        }
        var buf = slice.call(slab, offset, offset += size);
        if (offset & 7) // align to 32 bit
            offset = (offset | 7) + 1;
        return buf;
    };
}

},{}],40:[function(require,module,exports){
"use strict";

/**
 * A minimal UTF8 implementation for number arrays.
 * @memberof util
 * @namespace
 */
var utf8 = exports,
    replacementCharCode = 0xFFFD; // U+FFFD REPLACEMENT CHARACTER

/**
 * Calculates the UTF8 byte length of a string.
 * @param {string} string String
 * @returns {number} Byte length
 */
utf8.length = function utf8_length(string) {
    var len = 0,
        c = 0;
    for (var i = 0; i < string.length; ++i) {
        c = string.charCodeAt(i);
        if (c < 128)
            len += 1;
        else if (c < 2048)
            len += 2;
        else if ((c & 0xFC00) === 0xD800 && (string.charCodeAt(i + 1) & 0xFC00) === 0xDC00) {
            ++i;
            len += 4;
        } else
            len += 3;
    }
    return len;
};

/**
 * Reads UTF8 bytes as a string.
 * @param {Uint8Array} buffer Source buffer
 * @param {number} start Source start
 * @param {number} end Source end
 * @returns {string} String read
 */
utf8.read = function utf8_read(buffer, start, end) {
    if (end - start < 1)
        return "";
    // Batch code units and flush via String.fromCharCode.apply in 8192-unit
    // chunks to avoid the per-character ConsString buildup of `str += ...`.
    var parts = null,
        chunk = [],
        i = 0, // chunk write index
        t, t2, c2, c3;
    while (start < end) {
        t = buffer[start++];
        if (t <= 0x7F) {
            chunk[i++] = t;
        } else if (t >= 0xC0 && t < 0xE0) {
            c2 = (t & 0x1F) << 6 | buffer[start++] & 0x3F;
            chunk[i++] = c2 >= 0x80 ? c2 : replacementCharCode;
        } else if (t >= 0xE0 && t < 0xF0) {
            c3 = (t & 0xF) << 12 | (buffer[start++] & 0x3F) << 6 | buffer[start++] & 0x3F;
            chunk[i++] = c3 >= 0x800 ? c3 : replacementCharCode;
        } else if (t >= 0xF0) {
            t2 = (t & 7) << 18 | (buffer[start++] & 0x3F) << 12 | (buffer[start++] & 0x3F) << 6 | buffer[start++] & 0x3F;
            if (t2 < 0x10000 || t2 > 0x10FFFF)
                chunk[i++] = replacementCharCode;
            else {
                t2 -= 0x10000;
                chunk[i++] = 0xD800 + (t2 >> 10);
                chunk[i++] = 0xDC00 + (t2 & 0x3FF);
            }
        }
        if (i > 8191) {
            (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk.slice(0, i)));
            i = 0;
        }
    }
    if (parts) {
        if (i)
            parts.push(String.fromCharCode.apply(String, chunk.slice(0, i)));
        return parts.join("");
    }
    return String.fromCharCode.apply(String, chunk.slice(0, i));
};

/**
 * Writes a string as UTF8 bytes.
 * @param {string} string Source string
 * @param {Uint8Array} buffer Destination buffer
 * @param {number} offset Destination offset
 * @returns {number} Bytes written
 */
utf8.write = function utf8_write(string, buffer, offset) {
    var start = offset,
        c1, // character 1
        c2; // character 2
    for (var i = 0; i < string.length; ++i) {
        c1 = string.charCodeAt(i);
        if (c1 < 128) {
            buffer[offset++] = c1;
        } else if (c1 < 2048) {
            buffer[offset++] = c1 >> 6       | 192;
            buffer[offset++] = c1       & 63 | 128;
        } else if ((c1 & 0xFC00) === 0xD800 && ((c2 = string.charCodeAt(i + 1)) & 0xFC00) === 0xDC00) {
            c1 = 0x10000 + ((c1 & 0x03FF) << 10) + (c2 & 0x03FF);
            ++i;
            buffer[offset++] = c1 >> 18      | 240;
            buffer[offset++] = c1 >> 12 & 63 | 128;
            buffer[offset++] = c1 >> 6  & 63 | 128;
            buffer[offset++] = c1       & 63 | 128;
        } else {
            buffer[offset++] = c1 >> 12      | 224;
            buffer[offset++] = c1 >> 6  & 63 | 128;
            buffer[offset++] = c1       & 63 | 128;
        }
    }
    return offset - start;
};

},{}],41:[function(require,module,exports){
'use strict'

exports.byteLength = byteLength
exports.toByteArray = toByteArray
exports.fromByteArray = fromByteArray

var lookup = []
var revLookup = []
var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array

var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
for (var i = 0, len = code.length; i < len; ++i) {
  lookup[i] = code[i]
  revLookup[code.charCodeAt(i)] = i
}

// Support decoding URL-safe base64 strings, as Node.js does.
// See: https://en.wikipedia.org/wiki/Base64#URL_applications
revLookup['-'.charCodeAt(0)] = 62
revLookup['_'.charCodeAt(0)] = 63

function getLens (b64) {
  var len = b64.length

  if (len % 4 > 0) {
    throw new Error('Invalid string. Length must be a multiple of 4')
  }

  // Trim off extra bytes after placeholder bytes are found
  // See: https://github.com/beatgammit/base64-js/issues/42
  var validLen = b64.indexOf('=')
  if (validLen === -1) validLen = len

  var placeHoldersLen = validLen === len
    ? 0
    : 4 - (validLen % 4)

  return [validLen, placeHoldersLen]
}

// base64 is 4/3 + up to two characters of the original data
function byteLength (b64) {
  var lens = getLens(b64)
  var validLen = lens[0]
  var placeHoldersLen = lens[1]
  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
}

function _byteLength (b64, validLen, placeHoldersLen) {
  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
}

function toByteArray (b64) {
  var tmp
  var lens = getLens(b64)
  var validLen = lens[0]
  var placeHoldersLen = lens[1]

  var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))

  var curByte = 0

  // if there are placeholders, only get up to the last complete 4 chars
  var len = placeHoldersLen > 0
    ? validLen - 4
    : validLen

  var i
  for (i = 0; i < len; i += 4) {
    tmp =
      (revLookup[b64.charCodeAt(i)] << 18) |
      (revLookup[b64.charCodeAt(i + 1)] << 12) |
      (revLookup[b64.charCodeAt(i + 2)] << 6) |
      revLookup[b64.charCodeAt(i + 3)]
    arr[curByte++] = (tmp >> 16) & 0xFF
    arr[curByte++] = (tmp >> 8) & 0xFF
    arr[curByte++] = tmp & 0xFF
  }

  if (placeHoldersLen === 2) {
    tmp =
      (revLookup[b64.charCodeAt(i)] << 2) |
      (revLookup[b64.charCodeAt(i + 1)] >> 4)
    arr[curByte++] = tmp & 0xFF
  }

  if (placeHoldersLen === 1) {
    tmp =
      (revLookup[b64.charCodeAt(i)] << 10) |
      (revLookup[b64.charCodeAt(i + 1)] << 4) |
      (revLookup[b64.charCodeAt(i + 2)] >> 2)
    arr[curByte++] = (tmp >> 8) & 0xFF
    arr[curByte++] = tmp & 0xFF
  }

  return arr
}

function tripletToBase64 (num) {
  return lookup[num >> 18 & 0x3F] +
    lookup[num >> 12 & 0x3F] +
    lookup[num >> 6 & 0x3F] +
    lookup[num & 0x3F]
}

function encodeChunk (uint8, start, end) {
  var tmp
  var output = []
  for (var i = start; i < end; i += 3) {
    tmp =
      ((uint8[i] << 16) & 0xFF0000) +
      ((uint8[i + 1] << 8) & 0xFF00) +
      (uint8[i + 2] & 0xFF)
    output.push(tripletToBase64(tmp))
  }
  return output.join('')
}

function fromByteArray (uint8) {
  var tmp
  var len = uint8.length
  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
  var parts = []
  var maxChunkLength = 16383 // must be multiple of 3

  // go through the array every three bytes, we'll deal with trailing stuff later
  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
    parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))
  }

  // pad the end with zeros, but make sure to not forget the extra bytes
  if (extraBytes === 1) {
    tmp = uint8[len - 1]
    parts.push(
      lookup[tmp >> 2] +
      lookup[(tmp << 4) & 0x3F] +
      '=='
    )
  } else if (extraBytes === 2) {
    tmp = (uint8[len - 2] << 8) + uint8[len - 1]
    parts.push(
      lookup[tmp >> 10] +
      lookup[(tmp >> 4) & 0x3F] +
      lookup[(tmp << 2) & 0x3F] +
      '='
    )
  }

  return parts.join('')
}

},{}],42:[function(require,module,exports){
(function (global,Buffer){(function (){
/*!
 * The buffer module from node.js, for the browser.
 *
 * @author   Feross Aboukhadijeh <http://feross.org>
 * @license  MIT
 */
/* eslint-disable no-proto */

'use strict'

var base64 = require('base64-js')
var ieee754 = require('ieee754')
var isArray = require('isarray')

exports.Buffer = Buffer
exports.SlowBuffer = SlowBuffer
exports.INSPECT_MAX_BYTES = 50

/**
 * If `Buffer.TYPED_ARRAY_SUPPORT`:
 *   === true    Use Uint8Array implementation (fastest)
 *   === false   Use Object implementation (most compatible, even IE6)
 *
 * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
 * Opera 11.6+, iOS 4.2+.
 *
 * Due to various browser bugs, sometimes the Object implementation will be used even
 * when the browser supports typed arrays.
 *
 * Note:
 *
 *   - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,
 *     See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.
 *
 *   - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.
 *
 *   - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of
 *     incorrect length in some situations.

 * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they
 * get the Object implementation, which is slower but behaves correctly.
 */
Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined
  ? global.TYPED_ARRAY_SUPPORT
  : typedArraySupport()

/*
 * Export kMaxLength after typed array support is determined.
 */
exports.kMaxLength = kMaxLength()

function typedArraySupport () {
  try {
    var arr = new Uint8Array(1)
    arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}
    return arr.foo() === 42 && // typed array instances can be augmented
        typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`
        arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`
  } catch (e) {
    return false
  }
}

function kMaxLength () {
  return Buffer.TYPED_ARRAY_SUPPORT
    ? 0x7fffffff
    : 0x3fffffff
}

function createBuffer (that, length) {
  if (kMaxLength() < length) {
    throw new RangeError('Invalid typed array length')
  }
  if (Buffer.TYPED_ARRAY_SUPPORT) {
    // Return an augmented `Uint8Array` instance, for best performance
    that = new Uint8Array(length)
    that.__proto__ = Buffer.prototype
  } else {
    // Fallback: Return an object instance of the Buffer class
    if (that === null) {
      that = new Buffer(length)
    }
    that.length = length
  }

  return that
}

/**
 * The Buffer constructor returns instances of `Uint8Array` that have their
 * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of
 * `Uint8Array`, so the returned instances will have all the node `Buffer` methods
 * and the `Uint8Array` methods. Square bracket notation works as expected -- it
 * returns a single octet.
 *
 * The `Uint8Array` prototype remains unmodified.
 */

function Buffer (arg, encodingOrOffset, length) {
  if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {
    return new Buffer(arg, encodingOrOffset, length)
  }

  // Common case.
  if (typeof arg === 'number') {
    if (typeof encodingOrOffset === 'string') {
      throw new Error(
        'If encoding is specified then the first argument must be a string'
      )
    }
    return allocUnsafe(this, arg)
  }
  return from(this, arg, encodingOrOffset, length)
}

Buffer.poolSize = 8192 // not used by this implementation

// TODO: Legacy, not needed anymore. Remove in next major version.
Buffer._augment = function (arr) {
  arr.__proto__ = Buffer.prototype
  return arr
}

function from (that, value, encodingOrOffset, length) {
  if (typeof value === 'number') {
    throw new TypeError('"value" argument must not be a number')
  }

  if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {
    return fromArrayBuffer(that, value, encodingOrOffset, length)
  }

  if (typeof value === 'string') {
    return fromString(that, value, encodingOrOffset)
  }

  return fromObject(that, value)
}

/**
 * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError
 * if value is a number.
 * Buffer.from(str[, encoding])
 * Buffer.from(array)
 * Buffer.from(buffer)
 * Buffer.from(arrayBuffer[, byteOffset[, length]])
 **/
Buffer.from = function (value, encodingOrOffset, length) {
  return from(null, value, encodingOrOffset, length)
}

if (Buffer.TYPED_ARRAY_SUPPORT) {
  Buffer.prototype.__proto__ = Uint8Array.prototype
  Buffer.__proto__ = Uint8Array
  if (typeof Symbol !== 'undefined' && Symbol.species &&
      Buffer[Symbol.species] === Buffer) {
    // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97
    Object.defineProperty(Buffer, Symbol.species, {
      value: null,
      configurable: true
    })
  }
}

function assertSize (size) {
  if (typeof size !== 'number') {
    throw new TypeError('"size" argument must be a number')
  } else if (size < 0) {
    throw new RangeError('"size" argument must not be negative')
  }
}

function alloc (that, size, fill, encoding) {
  assertSize(size)
  if (size <= 0) {
    return createBuffer(that, size)
  }
  if (fill !== undefined) {
    // Only pay attention to encoding if it's a string. This
    // prevents accidentally sending in a number that would
    // be interpretted as a start offset.
    return typeof encoding === 'string'
      ? createBuffer(that, size).fill(fill, encoding)
      : createBuffer(that, size).fill(fill)
  }
  return createBuffer(that, size)
}

/**
 * Creates a new filled Buffer instance.
 * alloc(size[, fill[, encoding]])
 **/
Buffer.alloc = function (size, fill, encoding) {
  return alloc(null, size, fill, encoding)
}

function allocUnsafe (that, size) {
  assertSize(size)
  that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)
  if (!Buffer.TYPED_ARRAY_SUPPORT) {
    for (var i = 0; i < size; ++i) {
      that[i] = 0
    }
  }
  return that
}

/**
 * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.
 * */
Buffer.allocUnsafe = function (size) {
  return allocUnsafe(null, size)
}
/**
 * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.
 */
Buffer.allocUnsafeSlow = function (size) {
  return allocUnsafe(null, size)
}

function fromString (that, string, encoding) {
  if (typeof encoding !== 'string' || encoding === '') {
    encoding = 'utf8'
  }

  if (!Buffer.isEncoding(encoding)) {
    throw new TypeError('"encoding" must be a valid string encoding')
  }

  var length = byteLength(string, encoding) | 0
  that = createBuffer(that, length)

  var actual = that.write(string, encoding)

  if (actual !== length) {
    // Writing a hex string, for example, that contains invalid characters will
    // cause everything after the first invalid character to be ignored. (e.g.
    // 'abxxcd' will be treated as 'ab')
    that = that.slice(0, actual)
  }

  return that
}

function fromArrayLike (that, array) {
  var length = array.length < 0 ? 0 : checked(array.length) | 0
  that = createBuffer(that, length)
  for (var i = 0; i < length; i += 1) {
    that[i] = array[i] & 255
  }
  return that
}

function fromArrayBuffer (that, array, byteOffset, length) {
  array.byteLength // this throws if `array` is not a valid ArrayBuffer

  if (byteOffset < 0 || array.byteLength < byteOffset) {
    throw new RangeError('\'offset\' is out of bounds')
  }

  if (array.byteLength < byteOffset + (length || 0)) {
    throw new RangeError('\'length\' is out of bounds')
  }

  if (byteOffset === undefined && length === undefined) {
    array = new Uint8Array(array)
  } else if (length === undefined) {
    array = new Uint8Array(array, byteOffset)
  } else {
    array = new Uint8Array(array, byteOffset, length)
  }

  if (Buffer.TYPED_ARRAY_SUPPORT) {
    // Return an augmented `Uint8Array` instance, for best performance
    that = array
    that.__proto__ = Buffer.prototype
  } else {
    // Fallback: Return an object instance of the Buffer class
    that = fromArrayLike(that, array)
  }
  return that
}

function fromObject (that, obj) {
  if (Buffer.isBuffer(obj)) {
    var len = checked(obj.length) | 0
    that = createBuffer(that, len)

    if (that.length === 0) {
      return that
    }

    obj.copy(that, 0, 0, len)
    return that
  }

  if (obj) {
    if ((typeof ArrayBuffer !== 'undefined' &&
        obj.buffer instanceof ArrayBuffer) || 'length' in obj) {
      if (typeof obj.length !== 'number' || isnan(obj.length)) {
        return createBuffer(that, 0)
      }
      return fromArrayLike(that, obj)
    }

    if (obj.type === 'Buffer' && isArray(obj.data)) {
      return fromArrayLike(that, obj.data)
    }
  }

  throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')
}

function checked (length) {
  // Note: cannot use `length < kMaxLength()` here because that fails when
  // length is NaN (which is otherwise coerced to zero.)
  if (length >= kMaxLength()) {
    throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
                         'size: 0x' + kMaxLength().toString(16) + ' bytes')
  }
  return length | 0
}

function SlowBuffer (length) {
  if (+length != length) { // eslint-disable-line eqeqeq
    length = 0
  }
  return Buffer.alloc(+length)
}

Buffer.isBuffer = function isBuffer (b) {
  return !!(b != null && b._isBuffer)
}

Buffer.compare = function compare (a, b) {
  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
    throw new TypeError('Arguments must be Buffers')
  }

  if (a === b) return 0

  var x = a.length
  var y = b.length

  for (var i = 0, len = Math.min(x, y); i < len; ++i) {
    if (a[i] !== b[i]) {
      x = a[i]
      y = b[i]
      break
    }
  }

  if (x < y) return -1
  if (y < x) return 1
  return 0
}

Buffer.isEncoding = function isEncoding (encoding) {
  switch (String(encoding).toLowerCase()) {
    case 'hex':
    case 'utf8':
    case 'utf-8':
    case 'ascii':
    case 'latin1':
    case 'binary':
    case 'base64':
    case 'ucs2':
    case 'ucs-2':
    case 'utf16le':
    case 'utf-16le':
      return true
    default:
      return false
  }
}

Buffer.concat = function concat (list, length) {
  if (!isArray(list)) {
    throw new TypeError('"list" argument must be an Array of Buffers')
  }

  if (list.length === 0) {
    return Buffer.alloc(0)
  }

  var i
  if (length === undefined) {
    length = 0
    for (i = 0; i < list.length; ++i) {
      length += list[i].length
    }
  }

  var buffer = Buffer.allocUnsafe(length)
  var pos = 0
  for (i = 0; i < list.length; ++i) {
    var buf = list[i]
    if (!Buffer.isBuffer(buf)) {
      throw new TypeError('"list" argument must be an Array of Buffers')
    }
    buf.copy(buffer, pos)
    pos += buf.length
  }
  return buffer
}

function byteLength (string, encoding) {
  if (Buffer.isBuffer(string)) {
    return string.length
  }
  if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&
      (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {
    return string.byteLength
  }
  if (typeof string !== 'string') {
    string = '' + string
  }

  var len = string.length
  if (len === 0) return 0

  // Use a for loop to avoid recursion
  var loweredCase = false
  for (;;) {
    switch (encoding) {
      case 'ascii':
      case 'latin1':
      case 'binary':
        return len
      case 'utf8':
      case 'utf-8':
      case undefined:
        return utf8ToBytes(string).length
      case 'ucs2':
      case 'ucs-2':
      case 'utf16le':
      case 'utf-16le':
        return len * 2
      case 'hex':
        return len >>> 1
      case 'base64':
        return base64ToBytes(string).length
      default:
        if (loweredCase) return utf8ToBytes(string).length // assume utf8
        encoding = ('' + encoding).toLowerCase()
        loweredCase = true
    }
  }
}
Buffer.byteLength = byteLength

function slowToString (encoding, start, end) {
  var loweredCase = false

  // No need to verify that "this.length <= MAX_UINT32" since it's a read-only
  // property of a typed array.

  // This behaves neither like String nor Uint8Array in that we set start/end
  // to their upper/lower bounds if the value passed is out of range.
  // undefined is handled specially as per ECMA-262 6th Edition,
  // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.
  if (start === undefined || start < 0) {
    start = 0
  }
  // Return early if start > this.length. Done here to prevent potential uint32
  // coercion fail below.
  if (start > this.length) {
    return ''
  }

  if (end === undefined || end > this.length) {
    end = this.length
  }

  if (end <= 0) {
    return ''
  }

  // Force coersion to uint32. This will also coerce falsey/NaN values to 0.
  end >>>= 0
  start >>>= 0

  if (end <= start) {
    return ''
  }

  if (!encoding) encoding = 'utf8'

  while (true) {
    switch (encoding) {
      case 'hex':
        return hexSlice(this, start, end)

      case 'utf8':
      case 'utf-8':
        return utf8Slice(this, start, end)

      case 'ascii':
        return asciiSlice(this, start, end)

      case 'latin1':
      case 'binary':
        return latin1Slice(this, start, end)

      case 'base64':
        return base64Slice(this, start, end)

      case 'ucs2':
      case 'ucs-2':
      case 'utf16le':
      case 'utf-16le':
        return utf16leSlice(this, start, end)

      default:
        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
        encoding = (encoding + '').toLowerCase()
        loweredCase = true
    }
  }
}

// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect
// Buffer instances.
Buffer.prototype._isBuffer = true

function swap (b, n, m) {
  var i = b[n]
  b[n] = b[m]
  b[m] = i
}

Buffer.prototype.swap16 = function swap16 () {
  var len = this.length
  if (len % 2 !== 0) {
    throw new RangeError('Buffer size must be a multiple of 16-bits')
  }
  for (var i = 0; i < len; i += 2) {
    swap(this, i, i + 1)
  }
  return this
}

Buffer.prototype.swap32 = function swap32 () {
  var len = this.length
  if (len % 4 !== 0) {
    throw new RangeError('Buffer size must be a multiple of 32-bits')
  }
  for (var i = 0; i < len; i += 4) {
    swap(this, i, i + 3)
    swap(this, i + 1, i + 2)
  }
  return this
}

Buffer.prototype.swap64 = function swap64 () {
  var len = this.length
  if (len % 8 !== 0) {
    throw new RangeError('Buffer size must be a multiple of 64-bits')
  }
  for (var i = 0; i < len; i += 8) {
    swap(this, i, i + 7)
    swap(this, i + 1, i + 6)
    swap(this, i + 2, i + 5)
    swap(this, i + 3, i + 4)
  }
  return this
}

Buffer.prototype.toString = function toString () {
  var length = this.length | 0
  if (length === 0) return ''
  if (arguments.length === 0) return utf8Slice(this, 0, length)
  return slowToString.apply(this, arguments)
}

Buffer.prototype.equals = function equals (b) {
  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
  if (this === b) return true
  return Buffer.compare(this, b) === 0
}

Buffer.prototype.inspect = function inspect () {
  var str = ''
  var max = exports.INSPECT_MAX_BYTES
  if (this.length > 0) {
    str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')
    if (this.length > max) str += ' ... '
  }
  return '<Buffer ' + str + '>'
}

Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {
  if (!Buffer.isBuffer(target)) {
    throw new TypeError('Argument must be a Buffer')
  }

  if (start === undefined) {
    start = 0
  }
  if (end === undefined) {
    end = target ? target.length : 0
  }
  if (thisStart === undefined) {
    thisStart = 0
  }
  if (thisEnd === undefined) {
    thisEnd = this.length
  }

  if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {
    throw new RangeError('out of range index')
  }

  if (thisStart >= thisEnd && start >= end) {
    return 0
  }
  if (thisStart >= thisEnd) {
    return -1
  }
  if (start >= end) {
    return 1
  }

  start >>>= 0
  end >>>= 0
  thisStart >>>= 0
  thisEnd >>>= 0

  if (this === target) return 0

  var x = thisEnd - thisStart
  var y = end - start
  var len = Math.min(x, y)

  var thisCopy = this.slice(thisStart, thisEnd)
  var targetCopy = target.slice(start, end)

  for (var i = 0; i < len; ++i) {
    if (thisCopy[i] !== targetCopy[i]) {
      x = thisCopy[i]
      y = targetCopy[i]
      break
    }
  }

  if (x < y) return -1
  if (y < x) return 1
  return 0
}

// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,
// OR the last index of `val` in `buffer` at offset <= `byteOffset`.
//
// Arguments:
// - buffer - a Buffer to search
// - val - a string, Buffer, or number
// - byteOffset - an index into `buffer`; will be clamped to an int32
// - encoding - an optional encoding, relevant is val is a string
// - dir - true for indexOf, false for lastIndexOf
function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
  // Empty buffer means no match
  if (buffer.length === 0) return -1

  // Normalize byteOffset
  if (typeof byteOffset === 'string') {
    encoding = byteOffset
    byteOffset = 0
  } else if (byteOffset > 0x7fffffff) {
    byteOffset = 0x7fffffff
  } else if (byteOffset < -0x80000000) {
    byteOffset = -0x80000000
  }
  byteOffset = +byteOffset  // Coerce to Number.
  if (isNaN(byteOffset)) {
    // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer
    byteOffset = dir ? 0 : (buffer.length - 1)
  }

  // Normalize byteOffset: negative offsets start from the end of the buffer
  if (byteOffset < 0) byteOffset = buffer.length + byteOffset
  if (byteOffset >= buffer.length) {
    if (dir) return -1
    else byteOffset = buffer.length - 1
  } else if (byteOffset < 0) {
    if (dir) byteOffset = 0
    else return -1
  }

  // Normalize val
  if (typeof val === 'string') {
    val = Buffer.from(val, encoding)
  }

  // Finally, search either indexOf (if dir is true) or lastIndexOf
  if (Buffer.isBuffer(val)) {
    // Special case: looking for empty string/buffer always fails
    if (val.length === 0) {
      return -1
    }
    return arrayIndexOf(buffer, val, byteOffset, encoding, dir)
  } else if (typeof val === 'number') {
    val = val & 0xFF // Search for a byte value [0-255]
    if (Buffer.TYPED_ARRAY_SUPPORT &&
        typeof Uint8Array.prototype.indexOf === 'function') {
      if (dir) {
        return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)
      } else {
        return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)
      }
    }
    return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)
  }

  throw new TypeError('val must be string, number or Buffer')
}

function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
  var indexSize = 1
  var arrLength = arr.length
  var valLength = val.length

  if (encoding !== undefined) {
    encoding = String(encoding).toLowerCase()
    if (encoding === 'ucs2' || encoding === 'ucs-2' ||
        encoding === 'utf16le' || encoding === 'utf-16le') {
      if (arr.length < 2 || val.length < 2) {
        return -1
      }
      indexSize = 2
      arrLength /= 2
      valLength /= 2
      byteOffset /= 2
    }
  }

  function read (buf, i) {
    if (indexSize === 1) {
      return buf[i]
    } else {
      return buf.readUInt16BE(i * indexSize)
    }
  }

  var i
  if (dir) {
    var foundIndex = -1
    for (i = byteOffset; i < arrLength; i++) {
      if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {
        if (foundIndex === -1) foundIndex = i
        if (i - foundIndex + 1 === valLength) return foundIndex * indexSize
      } else {
        if (foundIndex !== -1) i -= i - foundIndex
        foundIndex = -1
      }
    }
  } else {
    if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength
    for (i = byteOffset; i >= 0; i--) {
      var found = true
      for (var j = 0; j < valLength; j++) {
        if (read(arr, i + j) !== read(val, j)) {
          found = false
          break
        }
      }
      if (found) return i
    }
  }

  return -1
}

Buffer.prototype.includes = function includes (val, byteOffset, encoding) {
  return this.indexOf(val, byteOffset, encoding) !== -1
}

Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {
  return bidirectionalIndexOf(this, val, byteOffset, encoding, true)
}

Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {
  return bidirectionalIndexOf(this, val, byteOffset, encoding, false)
}

function hexWrite (buf, string, offset, length) {
  offset = Number(offset) || 0
  var remaining = buf.length - offset
  if (!length) {
    length = remaining
  } else {
    length = Number(length)
    if (length > remaining) {
      length = remaining
    }
  }

  // must be an even number of digits
  var strLen = string.length
  if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')

  if (length > strLen / 2) {
    length = strLen / 2
  }
  for (var i = 0; i < length; ++i) {
    var parsed = parseInt(string.substr(i * 2, 2), 16)
    if (isNaN(parsed)) return i
    buf[offset + i] = parsed
  }
  return i
}

function utf8Write (buf, string, offset, length) {
  return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
}

function asciiWrite (buf, string, offset, length) {
  return blitBuffer(asciiToBytes(string), buf, offset, length)
}

function latin1Write (buf, string, offset, length) {
  return asciiWrite(buf, string, offset, length)
}

function base64Write (buf, string, offset, length) {
  return blitBuffer(base64ToBytes(string), buf, offset, length)
}

function ucs2Write (buf, string, offset, length) {
  return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
}

Buffer.prototype.write = function write (string, offset, length, encoding) {
  // Buffer#write(string)
  if (offset === undefined) {
    encoding = 'utf8'
    length = this.length
    offset = 0
  // Buffer#write(string, encoding)
  } else if (length === undefined && typeof offset === 'string') {
    encoding = offset
    length = this.length
    offset = 0
  // Buffer#write(string, offset[, length][, encoding])
  } else if (isFinite(offset)) {
    offset = offset | 0
    if (isFinite(length)) {
      length = length | 0
      if (encoding === undefined) encoding = 'utf8'
    } else {
      encoding = length
      length = undefined
    }
  // legacy write(string, encoding, offset, length) - remove in v0.13
  } else {
    throw new Error(
      'Buffer.write(string, encoding, offset[, length]) is no longer supported'
    )
  }

  var remaining = this.length - offset
  if (length === undefined || length > remaining) length = remaining

  if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
    throw new RangeError('Attempt to write outside buffer bounds')
  }

  if (!encoding) encoding = 'utf8'

  var loweredCase = false
  for (;;) {
    switch (encoding) {
      case 'hex':
        return hexWrite(this, string, offset, length)

      case 'utf8':
      case 'utf-8':
        return utf8Write(this, string, offset, length)

      case 'ascii':
        return asciiWrite(this, string, offset, length)

      case 'latin1':
      case 'binary':
        return latin1Write(this, string, offset, length)

      case 'base64':
        // Warning: maxLength not taken into account in base64Write
        return base64Write(this, string, offset, length)

      case 'ucs2':
      case 'ucs-2':
      case 'utf16le':
      case 'utf-16le':
        return ucs2Write(this, string, offset, length)

      default:
        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
        encoding = ('' + encoding).toLowerCase()
        loweredCase = true
    }
  }
}

Buffer.prototype.toJSON = function toJSON () {
  return {
    type: 'Buffer',
    data: Array.prototype.slice.call(this._arr || this, 0)
  }
}

function base64Slice (buf, start, end) {
  if (start === 0 && end === buf.length) {
    return base64.fromByteArray(buf)
  } else {
    return base64.fromByteArray(buf.slice(start, end))
  }
}

function utf8Slice (buf, start, end) {
  end = Math.min(buf.length, end)
  var res = []

  var i = start
  while (i < end) {
    var firstByte = buf[i]
    var codePoint = null
    var bytesPerSequence = (firstByte > 0xEF) ? 4
      : (firstByte > 0xDF) ? 3
      : (firstByte > 0xBF) ? 2
      : 1

    if (i + bytesPerSequence <= end) {
      var secondByte, thirdByte, fourthByte, tempCodePoint

      switch (bytesPerSequence) {
        case 1:
          if (firstByte < 0x80) {
            codePoint = firstByte
          }
          break
        case 2:
          secondByte = buf[i + 1]
          if ((secondByte & 0xC0) === 0x80) {
            tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)
            if (tempCodePoint > 0x7F) {
              codePoint = tempCodePoint
            }
          }
          break
        case 3:
          secondByte = buf[i + 1]
          thirdByte = buf[i + 2]
          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
            tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)
            if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
              codePoint = tempCodePoint
            }
          }
          break
        case 4:
          secondByte = buf[i + 1]
          thirdByte = buf[i + 2]
          fourthByte = buf[i + 3]
          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
            tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)
            if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
              codePoint = tempCodePoint
            }
          }
      }
    }

    if (codePoint === null) {
      // we did not generate a valid codePoint so insert a
      // replacement char (U+FFFD) and advance only 1 byte
      codePoint = 0xFFFD
      bytesPerSequence = 1
    } else if (codePoint > 0xFFFF) {
      // encode to utf16 (surrogate pair dance)
      codePoint -= 0x10000
      res.push(codePoint >>> 10 & 0x3FF | 0xD800)
      codePoint = 0xDC00 | codePoint & 0x3FF
    }

    res.push(codePoint)
    i += bytesPerSequence
  }

  return decodeCodePointsArray(res)
}

// Based on http://stackoverflow.com/a/22747272/680742, the browser with
// the lowest limit is Chrome, with 0x10000 args.
// We go 1 magnitude less, for safety
var MAX_ARGUMENTS_LENGTH = 0x1000

function decodeCodePointsArray (codePoints) {
  var len = codePoints.length
  if (len <= MAX_ARGUMENTS_LENGTH) {
    return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
  }

  // Decode in chunks to avoid "call stack size exceeded".
  var res = ''
  var i = 0
  while (i < len) {
    res += String.fromCharCode.apply(
      String,
      codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
    )
  }
  return res
}

function asciiSlice (buf, start, end) {
  var ret = ''
  end = Math.min(buf.length, end)

  for (var i = start; i < end; ++i) {
    ret += String.fromCharCode(buf[i] & 0x7F)
  }
  return ret
}

function latin1Slice (buf, start, end) {
  var ret = ''
  end = Math.min(buf.length, end)

  for (var i = start; i < end; ++i) {
    ret += String.fromCharCode(buf[i])
  }
  return ret
}

function hexSlice (buf, start, end) {
  var len = buf.length

  if (!start || start < 0) start = 0
  if (!end || end < 0 || end > len) end = len

  var out = ''
  for (var i = start; i < end; ++i) {
    out += toHex(buf[i])
  }
  return out
}

function utf16leSlice (buf, start, end) {
  var bytes = buf.slice(start, end)
  var res = ''
  for (var i = 0; i < bytes.length; i += 2) {
    res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)
  }
  return res
}

Buffer.prototype.slice = function slice (start, end) {
  var len = this.length
  start = ~~start
  end = end === undefined ? len : ~~end

  if (start < 0) {
    start += len
    if (start < 0) start = 0
  } else if (start > len) {
    start = len
  }

  if (end < 0) {
    end += len
    if (end < 0) end = 0
  } else if (end > len) {
    end = len
  }

  if (end < start) end = start

  var newBuf
  if (Buffer.TYPED_ARRAY_SUPPORT) {
    newBuf = this.subarray(start, end)
    newBuf.__proto__ = Buffer.prototype
  } else {
    var sliceLen = end - start
    newBuf = new Buffer(sliceLen, undefined)
    for (var i = 0; i < sliceLen; ++i) {
      newBuf[i] = this[i + start]
    }
  }

  return newBuf
}

/*
 * Need to make sure that buffer isn't trying to write out of bounds.
 */
function checkOffset (offset, ext, length) {
  if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
  if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
}

Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
  offset = offset | 0
  byteLength = byteLength | 0
  if (!noAssert) checkOffset(offset, byteLength, this.length)

  var val = this[offset]
  var mul = 1
  var i = 0
  while (++i < byteLength && (mul *= 0x100)) {
    val += this[offset + i] * mul
  }

  return val
}

Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
  offset = offset | 0
  byteLength = byteLength | 0
  if (!noAssert) {
    checkOffset(offset, byteLength, this.length)
  }

  var val = this[offset + --byteLength]
  var mul = 1
  while (byteLength > 0 && (mul *= 0x100)) {
    val += this[offset + --byteLength] * mul
  }

  return val
}

Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
  if (!noAssert) checkOffset(offset, 1, this.length)
  return this[offset]
}

Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
  if (!noAssert) checkOffset(offset, 2, this.length)
  return this[offset] | (this[offset + 1] << 8)
}

Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
  if (!noAssert) checkOffset(offset, 2, this.length)
  return (this[offset] << 8) | this[offset + 1]
}

Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
  if (!noAssert) checkOffset(offset, 4, this.length)

  return ((this[offset]) |
      (this[offset + 1] << 8) |
      (this[offset + 2] << 16)) +
      (this[offset + 3] * 0x1000000)
}

Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
  if (!noAssert) checkOffset(offset, 4, this.length)

  return (this[offset] * 0x1000000) +
    ((this[offset + 1] << 16) |
    (this[offset + 2] << 8) |
    this[offset + 3])
}

Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
  offset = offset | 0
  byteLength = byteLength | 0
  if (!noAssert) checkOffset(offset, byteLength, this.length)

  var val = this[offset]
  var mul = 1
  var i = 0
  while (++i < byteLength && (mul *= 0x100)) {
    val += this[offset + i] * mul
  }
  mul *= 0x80

  if (val >= mul) val -= Math.pow(2, 8 * byteLength)

  return val
}

Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
  offset = offset | 0
  byteLength = byteLength | 0
  if (!noAssert) checkOffset(offset, byteLength, this.length)

  var i = byteLength
  var mul = 1
  var val = this[offset + --i]
  while (i > 0 && (mul *= 0x100)) {
    val += this[offset + --i] * mul
  }
  mul *= 0x80

  if (val >= mul) val -= Math.pow(2, 8 * byteLength)

  return val
}

Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
  if (!noAssert) checkOffset(offset, 1, this.length)
  if (!(this[offset] & 0x80)) return (this[offset])
  return ((0xff - this[offset] + 1) * -1)
}

Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
  if (!noAssert) checkOffset(offset, 2, this.length)
  var val = this[offset] | (this[offset + 1] << 8)
  return (val & 0x8000) ? val | 0xFFFF0000 : val
}

Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
  if (!noAssert) checkOffset(offset, 2, this.length)
  var val = this[offset + 1] | (this[offset] << 8)
  return (val & 0x8000) ? val | 0xFFFF0000 : val
}

Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
  if (!noAssert) checkOffset(offset, 4, this.length)

  return (this[offset]) |
    (this[offset + 1] << 8) |
    (this[offset + 2] << 16) |
    (this[offset + 3] << 24)
}

Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
  if (!noAssert) checkOffset(offset, 4, this.length)

  return (this[offset] << 24) |
    (this[offset + 1] << 16) |
    (this[offset + 2] << 8) |
    (this[offset + 3])
}

Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
  if (!noAssert) checkOffset(offset, 4, this.length)
  return ieee754.read(this, offset, true, 23, 4)
}

Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
  if (!noAssert) checkOffset(offset, 4, this.length)
  return ieee754.read(this, offset, false, 23, 4)
}

Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
  if (!noAssert) checkOffset(offset, 8, this.length)
  return ieee754.read(this, offset, true, 52, 8)
}

Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
  if (!noAssert) checkOffset(offset, 8, this.length)
  return ieee754.read(this, offset, false, 52, 8)
}

function checkInt (buf, value, offset, ext, max, min) {
  if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance')
  if (value > max || value < min) throw new RangeError('"value" argument is out of bounds')
  if (offset + ext > buf.length) throw new RangeError('Index out of range')
}

Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
  value = +value
  offset = offset | 0
  byteLength = byteLength | 0
  if (!noAssert) {
    var maxBytes = Math.pow(2, 8 * byteLength) - 1
    checkInt(this, value, offset, byteLength, maxBytes, 0)
  }

  var mul = 1
  var i = 0
  this[offset] = value & 0xFF
  while (++i < byteLength && (mul *= 0x100)) {
    this[offset + i] = (value / mul) & 0xFF
  }

  return offset + byteLength
}

Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
  value = +value
  offset = offset | 0
  byteLength = byteLength | 0
  if (!noAssert) {
    var maxBytes = Math.pow(2, 8 * byteLength) - 1
    checkInt(this, value, offset, byteLength, maxBytes, 0)
  }

  var i = byteLength - 1
  var mul = 1
  this[offset + i] = value & 0xFF
  while (--i >= 0 && (mul *= 0x100)) {
    this[offset + i] = (value / mul) & 0xFF
  }

  return offset + byteLength
}

Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
  value = +value
  offset = offset | 0
  if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
  this[offset] = (value & 0xff)
  return offset + 1
}

function objectWriteUInt16 (buf, value, offset, littleEndian) {
  if (value < 0) value = 0xffff + value + 1
  for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {
    buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>
      (littleEndian ? i : 1 - i) * 8
  }
}

Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
  value = +value
  offset = offset | 0
  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
  if (Buffer.TYPED_ARRAY_SUPPORT) {
    this[offset] = (value & 0xff)
    this[offset + 1] = (value >>> 8)
  } else {
    objectWriteUInt16(this, value, offset, true)
  }
  return offset + 2
}

Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
  value = +value
  offset = offset | 0
  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
  if (Buffer.TYPED_ARRAY_SUPPORT) {
    this[offset] = (value >>> 8)
    this[offset + 1] = (value & 0xff)
  } else {
    objectWriteUInt16(this, value, offset, false)
  }
  return offset + 2
}

function objectWriteUInt32 (buf, value, offset, littleEndian) {
  if (value < 0) value = 0xffffffff + value + 1
  for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {
    buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff
  }
}

Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
  value = +value
  offset = offset | 0
  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
  if (Buffer.TYPED_ARRAY_SUPPORT) {
    this[offset + 3] = (value >>> 24)
    this[offset + 2] = (value >>> 16)
    this[offset + 1] = (value >>> 8)
    this[offset] = (value & 0xff)
  } else {
    objectWriteUInt32(this, value, offset, true)
  }
  return offset + 4
}

Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
  value = +value
  offset = offset | 0
  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
  if (Buffer.TYPED_ARRAY_SUPPORT) {
    this[offset] = (value >>> 24)
    this[offset + 1] = (value >>> 16)
    this[offset + 2] = (value >>> 8)
    this[offset + 3] = (value & 0xff)
  } else {
    objectWriteUInt32(this, value, offset, false)
  }
  return offset + 4
}

Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
  value = +value
  offset = offset | 0
  if (!noAssert) {
    var limit = Math.pow(2, 8 * byteLength - 1)

    checkInt(this, value, offset, byteLength, limit - 1, -limit)
  }

  var i = 0
  var mul = 1
  var sub = 0
  this[offset] = value & 0xFF
  while (++i < byteLength && (mul *= 0x100)) {
    if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {
      sub = 1
    }
    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
  }

  return offset + byteLength
}

Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
  value = +value
  offset = offset | 0
  if (!noAssert) {
    var limit = Math.pow(2, 8 * byteLength - 1)

    checkInt(this, value, offset, byteLength, limit - 1, -limit)
  }

  var i = byteLength - 1
  var mul = 1
  var sub = 0
  this[offset + i] = value & 0xFF
  while (--i >= 0 && (mul *= 0x100)) {
    if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {
      sub = 1
    }
    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
  }

  return offset + byteLength
}

Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
  value = +value
  offset = offset | 0
  if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
  if (value < 0) value = 0xff + value + 1
  this[offset] = (value & 0xff)
  return offset + 1
}

Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
  value = +value
  offset = offset | 0
  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
  if (Buffer.TYPED_ARRAY_SUPPORT) {
    this[offset] = (value & 0xff)
    this[offset + 1] = (value >>> 8)
  } else {
    objectWriteUInt16(this, value, offset, true)
  }
  return offset + 2
}

Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
  value = +value
  offset = offset | 0
  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
  if (Buffer.TYPED_ARRAY_SUPPORT) {
    this[offset] = (value >>> 8)
    this[offset + 1] = (value & 0xff)
  } else {
    objectWriteUInt16(this, value, offset, false)
  }
  return offset + 2
}

Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
  value = +value
  offset = offset | 0
  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
  if (Buffer.TYPED_ARRAY_SUPPORT) {
    this[offset] = (value & 0xff)
    this[offset + 1] = (value >>> 8)
    this[offset + 2] = (value >>> 16)
    this[offset + 3] = (value >>> 24)
  } else {
    objectWriteUInt32(this, value, offset, true)
  }
  return offset + 4
}

Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
  value = +value
  offset = offset | 0
  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
  if (value < 0) value = 0xffffffff + value + 1
  if (Buffer.TYPED_ARRAY_SUPPORT) {
    this[offset] = (value >>> 24)
    this[offset + 1] = (value >>> 16)
    this[offset + 2] = (value >>> 8)
    this[offset + 3] = (value & 0xff)
  } else {
    objectWriteUInt32(this, value, offset, false)
  }
  return offset + 4
}

function checkIEEE754 (buf, value, offset, ext, max, min) {
  if (offset + ext > buf.length) throw new RangeError('Index out of range')
  if (offset < 0) throw new RangeError('Index out of range')
}

function writeFloat (buf, value, offset, littleEndian, noAssert) {
  if (!noAssert) {
    checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
  }
  ieee754.write(buf, value, offset, littleEndian, 23, 4)
  return offset + 4
}

Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
  return writeFloat(this, value, offset, true, noAssert)
}

Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
  return writeFloat(this, value, offset, false, noAssert)
}

function writeDouble (buf, value, offset, littleEndian, noAssert) {
  if (!noAssert) {
    checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
  }
  ieee754.write(buf, value, offset, littleEndian, 52, 8)
  return offset + 8
}

Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
  return writeDouble(this, value, offset, true, noAssert)
}

Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
  return writeDouble(this, value, offset, false, noAssert)
}

// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
Buffer.prototype.copy = function copy (target, targetStart, start, end) {
  if (!start) start = 0
  if (!end && end !== 0) end = this.length
  if (targetStart >= target.length) targetStart = target.length
  if (!targetStart) targetStart = 0
  if (end > 0 && end < start) end = start

  // Copy 0 bytes; we're done
  if (end === start) return 0
  if (target.length === 0 || this.length === 0) return 0

  // Fatal error conditions
  if (targetStart < 0) {
    throw new RangeError('targetStart out of bounds')
  }
  if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')
  if (end < 0) throw new RangeError('sourceEnd out of bounds')

  // Are we oob?
  if (end > this.length) end = this.length
  if (target.length - targetStart < end - start) {
    end = target.length - targetStart + start
  }

  var len = end - start
  var i

  if (this === target && start < targetStart && targetStart < end) {
    // descending copy from end
    for (i = len - 1; i >= 0; --i) {
      target[i + targetStart] = this[i + start]
    }
  } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {
    // ascending copy from start
    for (i = 0; i < len; ++i) {
      target[i + targetStart] = this[i + start]
    }
  } else {
    Uint8Array.prototype.set.call(
      target,
      this.subarray(start, start + len),
      targetStart
    )
  }

  return len
}

// Usage:
//    buffer.fill(number[, offset[, end]])
//    buffer.fill(buffer[, offset[, end]])
//    buffer.fill(string[, offset[, end]][, encoding])
Buffer.prototype.fill = function fill (val, start, end, encoding) {
  // Handle string cases:
  if (typeof val === 'string') {
    if (typeof start === 'string') {
      encoding = start
      start = 0
      end = this.length
    } else if (typeof end === 'string') {
      encoding = end
      end = this.length
    }
    if (val.length === 1) {
      var code = val.charCodeAt(0)
      if (code < 256) {
        val = code
      }
    }
    if (encoding !== undefined && typeof encoding !== 'string') {
      throw new TypeError('encoding must be a string')
    }
    if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {
      throw new TypeError('Unknown encoding: ' + encoding)
    }
  } else if (typeof val === 'number') {
    val = val & 255
  }

  // Invalid ranges are not set to a default, so can range check early.
  if (start < 0 || this.length < start || this.length < end) {
    throw new RangeError('Out of range index')
  }

  if (end <= start) {
    return this
  }

  start = start >>> 0
  end = end === undefined ? this.length : end >>> 0

  if (!val) val = 0

  var i
  if (typeof val === 'number') {
    for (i = start; i < end; ++i) {
      this[i] = val
    }
  } else {
    var bytes = Buffer.isBuffer(val)
      ? val
      : utf8ToBytes(new Buffer(val, encoding).toString())
    var len = bytes.length
    for (i = 0; i < end - start; ++i) {
      this[i + start] = bytes[i % len]
    }
  }

  return this
}

// HELPER FUNCTIONS
// ================

var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g

function base64clean (str) {
  // Node strips out invalid characters like \n and \t from the string, base64-js does not
  str = stringtrim(str).replace(INVALID_BASE64_RE, '')
  // Node converts strings with length < 2 to ''
  if (str.length < 2) return ''
  // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
  while (str.length % 4 !== 0) {
    str = str + '='
  }
  return str
}

function stringtrim (str) {
  if (str.trim) return str.trim()
  return str.replace(/^\s+|\s+$/g, '')
}

function toHex (n) {
  if (n < 16) return '0' + n.toString(16)
  return n.toString(16)
}

function utf8ToBytes (string, units) {
  units = units || Infinity
  var codePoint
  var length = string.length
  var leadSurrogate = null
  var bytes = []

  for (var i = 0; i < length; ++i) {
    codePoint = string.charCodeAt(i)

    // is surrogate component
    if (codePoint > 0xD7FF && codePoint < 0xE000) {
      // last char was a lead
      if (!leadSurrogate) {
        // no lead yet
        if (codePoint > 0xDBFF) {
          // unexpected trail
          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
          continue
        } else if (i + 1 === length) {
          // unpaired lead
          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
          continue
        }

        // valid lead
        leadSurrogate = codePoint

        continue
      }

      // 2 leads in a row
      if (codePoint < 0xDC00) {
        if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
        leadSurrogate = codePoint
        continue
      }

      // valid surrogate pair
      codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000
    } else if (leadSurrogate) {
      // valid bmp char, but last char was a lead
      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
    }

    leadSurrogate = null

    // encode utf8
    if (codePoint < 0x80) {
      if ((units -= 1) < 0) break
      bytes.push(codePoint)
    } else if (codePoint < 0x800) {
      if ((units -= 2) < 0) break
      bytes.push(
        codePoint >> 0x6 | 0xC0,
        codePoint & 0x3F | 0x80
      )
    } else if (codePoint < 0x10000) {
      if ((units -= 3) < 0) break
      bytes.push(
        codePoint >> 0xC | 0xE0,
        codePoint >> 0x6 & 0x3F | 0x80,
        codePoint & 0x3F | 0x80
      )
    } else if (codePoint < 0x110000) {
      if ((units -= 4) < 0) break
      bytes.push(
        codePoint >> 0x12 | 0xF0,
        codePoint >> 0xC & 0x3F | 0x80,
        codePoint >> 0x6 & 0x3F | 0x80,
        codePoint & 0x3F | 0x80
      )
    } else {
      throw new Error('Invalid code point')
    }
  }

  return bytes
}

function asciiToBytes (str) {
  var byteArray = []
  for (var i = 0; i < str.length; ++i) {
    // Node's code seems to be doing this and not & 0x7F..
    byteArray.push(str.charCodeAt(i) & 0xFF)
  }
  return byteArray
}

function utf16leToBytes (str, units) {
  var c, hi, lo
  var byteArray = []
  for (var i = 0; i < str.length; ++i) {
    if ((units -= 2) < 0) break

    c = str.charCodeAt(i)
    hi = c >> 8
    lo = c % 256
    byteArray.push(lo)
    byteArray.push(hi)
  }

  return byteArray
}

function base64ToBytes (str) {
  return base64.toByteArray(base64clean(str))
}

function blitBuffer (src, dst, offset, length) {
  for (var i = 0; i < length; ++i) {
    if ((i + offset >= dst.length) || (i >= src.length)) break
    dst[i + offset] = src[i]
  }
  return i
}

function isnan (val) {
  return val !== val // eslint-disable-line no-self-compare
}

}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("buffer").Buffer)
},{"base64-js":41,"buffer":42,"ieee754":79,"isarray":81}],43:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2020, 2022 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.makeSinkCaller = makeSinkCaller;
exports.exposeSinkService = exposeSinkService;
exports.makeSrcCaller = makeSrcCaller;
exports.exposeSrcService = exposeSrcService;
const protobuf_msg_1 = require("../ipc-via-protobuf/protobuf-msg");
const protobuf_type_1 = require("../lib-client/protobuf-type");
const bytes_proto_1 = require("../protos/bytes.proto");
const connector_1 = require("../ipc-via-protobuf/connector");
function makeSinkCaller(caller, ref) {
    (0, connector_1.checkRefObjTypeIs)('FileByteSink', ref);
    const objPath = ref.path;
    const sink = {
        done: sinkDone.makeCaller(caller, objPath),
        getSize: sinkGetSize.makeCaller(caller, objPath),
        showLayout: sinkShowLayout.makeCaller(caller, objPath),
        splice: sinkSplice.makeCaller(caller, objPath),
        truncate: sinkTruncate.makeCaller(caller, objPath)
    };
    caller.registerClientDrop(sink, ref);
    return sink;
}
function exposeSinkService(sink, expServices) {
    const wrap = {
        done: sinkDone.wrapService(sink.done),
        getSize: sinkGetSize.wrapService(sink.getSize),
        showLayout: sinkShowLayout.wrapService(sink.showLayout),
        splice: sinkSplice.wrapService(sink.splice),
        truncate: sinkTruncate.wrapService(sink.truncate)
    };
    const ref = expServices.exposeDroppableService('FileByteSink', wrap, sink);
    return ref;
}
function makeSrcCaller(caller, ref) {
    (0, connector_1.checkRefObjTypeIs)('FileByteSource', ref);
    const objPath = ref.path;
    const src = {
        getPosition: srcGetPosition.makeCaller(caller, objPath),
        getSize: srcGetSize.makeCaller(caller, objPath),
        readNext: srcReadNext.makeCaller(caller, objPath),
        readAt: srcReadAt.makeCaller(caller, objPath),
        seek: srcSeek.makeCaller(caller, objPath)
    };
    caller.registerClientDrop(src, ref);
    return src;
}
function exposeSrcService(src, expServices) {
    const wrap = {
        getPosition: srcGetPosition.wrapService(src.getPosition),
        getSize: srcGetSize.wrapService(src.getSize),
        readNext: srcReadNext.wrapService(src.readNext),
        readAt: srcReadAt.wrapService(src.readAt),
        seek: srcSeek.wrapService(src.seek)
    };
    const ref = expServices.exposeDroppableService('FileByteSource', wrap, src);
    return ref;
}
var sinkGetSize;
(function (sinkGetSize) {
    function wrapService(fn) {
        return () => {
            const promise = fn()
                .then(protobuf_msg_1.packInt);
            return { promise };
        };
    }
    sinkGetSize.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'getSize');
        return () => caller
            .startPromiseCall(path, undefined)
            .then(protobuf_msg_1.unpackInt);
    }
    sinkGetSize.makeCaller = makeCaller;
})(sinkGetSize || (sinkGetSize = {}));
Object.freeze(sinkGetSize);
var sinkSplice;
(function (sinkSplice) {
    const requestType = protobuf_type_1.ProtoType.for(bytes_proto_1.bytes.SpliceRequestBody);
    function wrapService(fn) {
        return buf => {
            const { pos, del, bytes } = requestType.unpack(buf);
            const promise = fn((0, protobuf_msg_1.fixInt)(pos), (0, protobuf_msg_1.fixInt)(del), (0, protobuf_msg_1.valOfOpt)(bytes));
            return { promise };
        };
    }
    sinkSplice.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'splice');
        return async (pos, del, bytes) => {
            await caller
                .startPromiseCall(path, requestType.pack({
                pos, del, bytes: (0, protobuf_msg_1.toOptVal)(bytes)
            }));
        };
    }
    sinkSplice.makeCaller = makeCaller;
})(sinkSplice || (sinkSplice = {}));
Object.freeze(sinkSplice);
var sinkTruncate;
(function (sinkTruncate) {
    const requestType = protobuf_type_1.ProtoType.for(bytes_proto_1.bytes.TruncateRequestBody);
    function wrapService(fn) {
        return buf => {
            const { size } = requestType.unpack(buf);
            const promise = fn((0, protobuf_msg_1.fixInt)(size));
            return { promise };
        };
    }
    sinkTruncate.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'truncate');
        return async (size) => {
            await caller
                .startPromiseCall(path, requestType.pack({ size }));
        };
    }
    sinkTruncate.makeCaller = makeCaller;
})(sinkTruncate || (sinkTruncate = {}));
Object.freeze(sinkTruncate);
var sinkShowLayout;
(function (sinkShowLayout) {
    const replyType = protobuf_type_1.ProtoType.for(bytes_proto_1.bytes.FileLayoutMsg);
    function packLayout(l) {
        return {
            base: (0, protobuf_msg_1.toOptVal)(l.base),
            sections: l.sections
        };
    }
    function unpackLayout(msg) {
        return {
            base: (0, protobuf_msg_1.valOfOptInt)(msg.base),
            sections: (0, protobuf_msg_1.fixArray)(msg.sections).map(({ src, ofs, len }) => ({
                src, ofs: (0, protobuf_msg_1.fixInt)(ofs), len: (0, protobuf_msg_1.fixInt)(len)
            }))
        };
    }
    function wrapService(fn) {
        return () => {
            const promise = fn()
                .then(layout => replyType.pack(packLayout(layout)));
            return { promise };
        };
    }
    sinkShowLayout.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'showLayout');
        return () => caller
            .startPromiseCall(path, undefined)
            .then(buf => unpackLayout(replyType.unpack(buf)));
    }
    sinkShowLayout.makeCaller = makeCaller;
})(sinkShowLayout || (sinkShowLayout = {}));
Object.freeze(sinkShowLayout);
var sinkDone;
(function (sinkDone) {
    const requestType = protobuf_type_1.ProtoType.for(bytes_proto_1.bytes.DoneRequestBody);
    function wrapService(fn) {
        return buf => {
            const { err } = requestType.unpack(buf);
            const promise = (err ? fn((0, protobuf_msg_1.errFromMsg)(err)) : fn());
            return { promise };
        };
    }
    sinkDone.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'done');
        return async (err) => {
            const req = (err ? { err: (0, protobuf_msg_1.errToMsg)(err) } : {});
            await caller
                .startPromiseCall(path, requestType.pack(req));
        };
    }
    sinkDone.makeCaller = makeCaller;
})(sinkDone || (sinkDone = {}));
Object.freeze(sinkDone);
var srcGetSize;
(function (srcGetSize) {
    function wrapService(fn) {
        return () => {
            const promise = fn()
                .then(protobuf_msg_1.packInt);
            return { promise };
        };
    }
    srcGetSize.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'getSize');
        return () => caller
            .startPromiseCall(path, undefined)
            .then(protobuf_msg_1.unpackInt);
    }
    srcGetSize.makeCaller = makeCaller;
})(srcGetSize || (srcGetSize = {}));
Object.freeze(srcGetSize);
var srcGetPosition;
(function (srcGetPosition) {
    function wrapService(fn) {
        return () => {
            const promise = fn()
                .then(protobuf_msg_1.packInt);
            return { promise };
        };
    }
    srcGetPosition.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'getPosition');
        return () => caller
            .startPromiseCall(path, undefined)
            .then(protobuf_msg_1.unpackInt);
    }
    srcGetPosition.makeCaller = makeCaller;
})(srcGetPosition || (srcGetPosition = {}));
Object.freeze(srcGetPosition);
var srcReadNext;
(function (srcReadNext) {
    const requestType = protobuf_type_1.ProtoType.for(bytes_proto_1.bytes.ReadNextRequestBody);
    const replyType = protobuf_type_1.ProtoType.for(bytes_proto_1.bytes.ReadReplyBody);
    function wrapService(fn) {
        return buf => {
            const { len } = requestType.unpack(buf);
            const promise = fn((0, protobuf_msg_1.valOfOptInt)(len))
                .then(bytes => replyType.pack({ bytes: (0, protobuf_msg_1.toOptVal)(bytes) }));
            return { promise };
        };
    }
    srcReadNext.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'readNext');
        return len => caller
            .startPromiseCall(path, requestType.pack({ len: (0, protobuf_msg_1.toOptVal)(len) }))
            .then(buf => (0, protobuf_msg_1.valOfOpt)(replyType.unpack(buf).bytes));
    }
    srcReadNext.makeCaller = makeCaller;
})(srcReadNext || (srcReadNext = {}));
Object.freeze(srcReadNext);
var srcReadAt;
(function (srcReadAt) {
    const requestType = protobuf_type_1.ProtoType.for(bytes_proto_1.bytes.ReadAtRequestBody);
    const replyType = protobuf_type_1.ProtoType.for(bytes_proto_1.bytes.ReadReplyBody);
    function wrapService(fn) {
        return buf => {
            const { pos, len } = requestType.unpack(buf);
            const promise = fn((0, protobuf_msg_1.fixInt)(pos), (0, protobuf_msg_1.valOfOptInt)(len))
                .then(bytes => replyType.pack({ bytes: (0, protobuf_msg_1.toOptVal)(bytes) }));
            return { promise };
        };
    }
    srcReadAt.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'readAt');
        return (pos, len) => caller
            .startPromiseCall(path, requestType.pack({ pos, len: (0, protobuf_msg_1.toOptVal)(len) }))
            .then(buf => (0, protobuf_msg_1.valOfOpt)(replyType.unpack(buf).bytes));
    }
    srcReadAt.makeCaller = makeCaller;
})(srcReadAt || (srcReadAt = {}));
Object.freeze(srcReadAt);
var srcSeek;
(function (srcSeek) {
    const requestType = protobuf_type_1.ProtoType.for(bytes_proto_1.bytes.SeekRequestBody);
    function wrapService(fn) {
        return buf => {
            const { offset } = requestType.unpack(buf);
            const promise = fn((0, protobuf_msg_1.fixInt)(offset));
            return { promise };
        };
    }
    srcSeek.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'seek');
        return async (offset) => {
            await caller
                .startPromiseCall(path, requestType.pack({ offset }));
        };
    }
    srcSeek.makeCaller = makeCaller;
})(srcSeek || (srcSeek = {}));
Object.freeze(srcSeek);
Object.freeze(exports);

},{"../ipc-via-protobuf/connector":60,"../ipc-via-protobuf/protobuf-msg":61,"../lib-client/protobuf-type":63,"../protos/bytes.proto":72}],44:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2020 - 2021, 2023 - 2025 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.exposeW3N = exposeW3N;
exports.makeW3Nclient = makeW3Nclient;
exports.promiseW3Nclient = promiseW3Nclient;
const connector_1 = require("../ipc-via-protobuf/connector");
const log_cap_1 = require("./log-cap");
const asmail_cap_ipc_1 = require("../core/asmail/asmail-cap-ipc");
const storage_cap_ipc_1 = require("../core/storage/storage-cap-ipc");
const mailerid_cap_ipc_1 = require("../core/id-manager/mailerid-cap-ipc");
const generic_1 = require("./generic");
const keyrings_cap_ipc_1 = require("../core/keyring/keyrings-cap-ipc");
function exposeW3N(coreSide, w3n, extraCAPs) {
    const commonCAPsExposures = {
        log: log_cap_1.exposeLogger,
        mail: asmail_cap_ipc_1.exposeASMailCAP,
        mailerid: mailerid_cap_ipc_1.exposeMailerIdCAP,
        storage: storage_cap_ipc_1.exposeStorageCAP,
        keyrings: keyrings_cap_ipc_1.exposeKeyringsCAP,
    };
    (0, generic_1.exposeCAPs)(coreSide, w3n, commonCAPsExposures, extraCAPs);
}
// This is not used, but it ensures that some require runs, providing function
// for protobuf-something.
const unused = connector_1.W3N_NAME;
function makeW3Nclient(clientSide, extraCAPs) {
    const mainCAPs = {
        log: log_cap_1.makeLogCaller,
        mail: asmail_cap_ipc_1.makeASMailCaller,
        mailerid: mailerid_cap_ipc_1.makeMailerIdCaller,
        storage: storage_cap_ipc_1.makeStorageCaller,
        keyrings: keyrings_cap_ipc_1.makeKeyringsCaller,
    };
    const clientW3N = (0, generic_1.makeClientSide)(clientSide, mainCAPs, extraCAPs);
    addLogToConsoleToLogCap(clientW3N);
    return clientW3N;
}
async function promiseW3Nclient(clientSide, extraCAPs) {
    const mainCAPs = {
        log: log_cap_1.makeLogCaller,
        mail: asmail_cap_ipc_1.promiseASMailCaller,
        mailerid: mailerid_cap_ipc_1.makeMailerIdCaller,
        storage: storage_cap_ipc_1.promiseStorageCaller,
        keyrings: keyrings_cap_ipc_1.makeKeyringsCaller,
    };
    const clientW3N = await (0, generic_1.promiseClientSide)(clientSide, mainCAPs, extraCAPs);
    addLogToConsoleToLogCap(clientW3N);
    return clientW3N;
}
function addLogToConsoleToLogCap(clientW3N) {
    const logCap = clientW3N.log;
    clientW3N.log = async (type, msg, err) => {
        if (type === 'error') {
            if (err === undefined) {
                console.error(msg);
            }
            else {
                console.error(msg, err);
            }
        }
        else if (type === 'warning') {
            if (err === undefined) {
                console.warn(msg);
            }
            else {
                console.warn(msg, err);
            }
        }
        else {
            if (err === undefined) {
                console.log(msg);
            }
            else {
                console.log(msg, err);
            }
        }
        await (logCap === null || logCap === void 0 ? void 0 : logCap(type, msg, err));
    };
}
Object.freeze(exports);

},{"../core/asmail/asmail-cap-ipc":53,"../core/id-manager/mailerid-cap-ipc":54,"../core/keyring/keyrings-cap-ipc":55,"../core/storage/storage-cap-ipc":57,"../ipc-via-protobuf/connector":60,"./generic":47,"./log-cap":51}],45:[function(require,module,exports){
(function (Buffer){(function (){
"use strict";
/*
 Copyright (C) 2020, 2022, 2025 - 2026 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.vsDiffCurrentAndRemoteVersions = exports.vListVersions = exports.vsUpload = exports.vsStartUpload = exports.vsStartDownload = exports.vsWhenConnected = exports.vGetByteSink = exports.updateXAttrs = exports.vGetByteSource = exports.vReadJSON = exports.vReadTxt = exports.vReadBytes = exports.vListXAttrs = exports.vGetXAttr = exports.vStat = exports.readBytes = exports.fileMsgType = void 0;
exports.makeFileCaller = makeFileCaller;
exports.exposeFileService = exposeFileService;
exports.packStats = packStats;
exports.unpackStats = unpackStats;
exports.packSyncStatus = packSyncStatus;
exports.unpackSyncStatus = unpackSyncStatus;
exports.packXAttrValue = packXAttrValue;
exports.unpackXAttrValue = unpackXAttrValue;
exports.packJSON = packJSON;
exports.unpackJSON = unpackJSON;
exports.packEvent = packEvent;
exports.unpackEvent = unpackEvent;
exports.versionedReadFlagsFromMsg = versionedReadFlagsFromMsg;
exports.versionedReadFlagsToMsg = versionedReadFlagsToMsg;
exports.xattrToMsg = xattrToMsg;
exports.xattrFromMsg = xattrFromMsg;
exports.optionsToUploadLocalToMsg = optionsToUploadLocalToMsg;
exports.optionsToUploadLocalFromMsg = optionsToUploadLocalFromMsg;
exports.remoteAdoptionOptsToMsg = remoteAdoptionOptsToMsg;
exports.remoteAdoptionOptsFromMsg = remoteAdoptionOptsFromMsg;
exports.commonDiffToMsg = commonDiffToMsg;
exports.commonDiffFromMsg = commonDiffFromMsg;
exports.fileDiffToMsg = fileDiffToMsg;
exports.fileDiffFromMsg = fileDiffFromMsg;
const protobuf_msg_1 = require("../ipc-via-protobuf/protobuf-msg");
const protobuf_type_1 = require("../lib-client/protobuf-type");
const file_proto_1 = require("../protos/file.proto");
const common_proto_1 = require("../protos/common.proto");
const connector_1 = require("../ipc-via-protobuf/connector");
const error_1 = require("../lib-common/exceptions/error");
const bytes_1 = require("./bytes");
const rxjs_1 = require("rxjs");
const operators_1 = require("rxjs/operators");
const utils_for_observables_1 = require("../lib-common/utils-for-observables");
const buffer_utils_1 = require("../lib-common/buffer-utils");
function makeFileCaller(caller, fileMsg) {
    (0, connector_1.checkRefObjTypeIs)('FileImpl', fileMsg.impl);
    const objPath = fileMsg.impl.path;
    const file = {
        writable: fileMsg.writable,
        isNew: fileMsg.isNew,
        name: fileMsg.name,
        getByteSource: getByteSource.makeCaller(caller, objPath),
        getXAttr: getXAttr.makeCaller(caller, objPath),
        listXAttrs: listXAttrs.makeCaller(caller, objPath),
        readBytes: readBytes.makeCaller(caller, objPath),
        readJSON: readJSON.makeCaller(caller, objPath),
        readTxt: readTxt.makeCaller(caller, objPath),
        watch: watch.makeCaller(caller, objPath),
        stat: stat.makeCaller(caller, objPath)
    };
    if (file.writable) {
        file.copy = copy.makeCaller(caller, objPath);
        file.getByteSink = getByteSink.makeCaller(caller, objPath);
        file.updateXAttrs = updateXAttrs.makeCaller(caller, objPath);
        file.writeBytes = writeBytes.makeCaller(caller, objPath);
        file.writeJSON = writeJSON.makeCaller(caller, objPath);
        file.writeTxt = writeTxt.makeCaller(caller, objPath);
    }
    if (fileMsg.isVersioned) {
        const vPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'v');
        file.v = {
            getByteSource: vGetByteSource.makeCaller(caller, vPath),
            stat: vStat.makeCaller(caller, vPath),
            getXAttr: vGetXAttr.makeCaller(caller, vPath),
            listXAttrs: vListXAttrs.makeCaller(caller, vPath),
            readBytes: vReadBytes.makeCaller(caller, vPath),
            readJSON: vReadJSON.makeCaller(caller, vPath),
            readTxt: vReadTxt.makeCaller(caller, vPath),
            listVersions: vListVersions.makeCaller(caller, vPath)
        };
        if (file.writable) {
            file.v.copy = vCopy.makeCaller(caller, vPath);
            file.v.getByteSink = vGetByteSink.makeCaller(caller, vPath);
            file.v.updateXAttrs = vUpdateXAttrs.makeCaller(caller, vPath);
            file.v.writeBytes = vWriteBytes.makeCaller(caller, vPath);
            file.v.writeJSON = vWriteJSON.makeCaller(caller, vPath);
            file.v.writeTxt = vWriteTxt.makeCaller(caller, vPath);
            file.v.archiveCurrent = vArchiveCurrent.makeCaller(caller, vPath);
        }
        if (fileMsg.isSynced) {
            const vsPath = (0, protobuf_msg_1.methodPathFor)(vPath, 'sync');
            file.v.sync = {
                whenConnected: vsWhenConnected.makeCaller(caller, vsPath),
                status: vsStatus.makeCaller(caller, vsPath),
                isRemoteVersionOnDisk: vsIsRemoteVersionOnDisk.makeCaller(caller, vsPath),
                startDownload: vsStartDownload.makeCaller(caller, vsPath),
                adoptRemote: vsAdoptRemote.makeCaller(caller, vsPath),
                diffCurrentAndRemoteVersions: vsDiffCurrentAndRemoteVersions.makeCaller(caller, vsPath)
            };
            if (file.writable) {
                file.v.sync.startUpload = vsStartUpload.makeCaller(caller, vsPath);
                file.v.sync.upload = vsUpload.makeCaller(caller, vsPath);
            }
        }
    }
    caller.registerClientDrop(file, fileMsg.impl, fileMsg);
    return file;
}
function exposeFileService(file, expServices) {
    const implExp = {
        getByteSource: getByteSource.wrapService(file.getByteSource, expServices),
        getXAttr: getXAttr.wrapService(file.getXAttr),
        listXAttrs: listXAttrs.wrapService(file.listXAttrs),
        readBytes: readBytes.wrapService(file.readBytes),
        readJSON: readJSON.wrapService(file.readJSON),
        readTxt: readTxt.wrapService(file.readTxt),
        watch: watch.wrapService(file.watch),
        stat: stat.wrapService(file.stat)
    };
    if (file.writable) {
        implExp.copy = copy.wrapService(file.copy, expServices);
        implExp.getByteSink = getByteSink.wrapService(file.getByteSink, expServices);
        implExp.updateXAttrs = updateXAttrs.wrapService(file.updateXAttrs);
        implExp.writeBytes = writeBytes.wrapService(file.writeBytes);
        implExp.writeJSON = writeJSON.wrapService(file.writeJSON);
        implExp.writeTxt = writeTxt.wrapService(file.writeTxt);
    }
    if (file.v) {
        implExp.v = {
            getByteSource: vGetByteSource.wrapService(file.v.getByteSource, expServices),
            stat: vStat.wrapService(file.v.stat),
            getXAttr: vGetXAttr.wrapService(file.v.getXAttr),
            listXAttrs: vListXAttrs.wrapService(file.v.listXAttrs),
            readBytes: vReadBytes.wrapService(file.v.readBytes),
            readJSON: vReadJSON.wrapService(file.v.readJSON),
            readTxt: vReadTxt.wrapService(file.v.readTxt),
            listVersions: vListVersions.wrapService(file.v.listVersions)
        };
        if (file.writable) {
            implExp.v.copy = vCopy.wrapService(file.v.copy, expServices);
            implExp.v.getByteSink = vGetByteSink.wrapService(file.v.getByteSink, expServices);
            implExp.v.updateXAttrs = vUpdateXAttrs.wrapService(file.v.updateXAttrs);
            implExp.v.writeBytes = vWriteBytes.wrapService(file.v.writeBytes);
            implExp.v.writeJSON = vWriteJSON.wrapService(file.v.writeJSON);
            implExp.v.writeTxt = vWriteTxt.wrapService(file.v.writeTxt);
            implExp.v.archiveCurrent = vArchiveCurrent.wrapService(file.v.archiveCurrent);
        }
        if (file.v.sync) {
            implExp.v.sync = {
                whenConnected: vsWhenConnected.wrapService(file.v.sync.whenConnected),
                status: vsStatus.wrapService(file.v.sync.status),
                isRemoteVersionOnDisk: vsIsRemoteVersionOnDisk.wrapService(file.v.sync.isRemoteVersionOnDisk),
                startDownload: vsStartDownload.wrapService(file.v.sync.startDownload),
                adoptRemote: vsAdoptRemote.wrapService(file.v.sync.adoptRemote),
                diffCurrentAndRemoteVersions: vsDiffCurrentAndRemoteVersions.wrapService(file.v.sync.diffCurrentAndRemoteVersions),
            };
            if (file.writable) {
                implExp.v.sync.startedUpload = vsStartUpload.wrapService(file.v.sync.startUpload);
                implExp.v.sync.upload = vsUpload.wrapService(file.v.sync.upload);
            }
        }
    }
    const impl = expServices.exposeDroppableService('FileImpl', implExp, file);
    const fileMsg = {
        impl,
        isNew: file.isNew,
        name: file.name,
        writable: file.writable,
        isVersioned: !!file.v,
        isSynced: !!(file.v && file.v.sync)
    };
    return fileMsg;
}
exports.fileMsgType = protobuf_type_1.ProtoType.for(file_proto_1.file.File);
const statsMsgType = protobuf_type_1.ProtoType.for(file_proto_1.file.StatsMsg);
function packStats(s) {
    return statsMsgType.pack(statsToMsg(s));
}
function statsToMsg(s) {
    return {
        writable: s.writable,
        isFile: (0, protobuf_msg_1.toOptVal)(s.isFile),
        isFolder: (0, protobuf_msg_1.toOptVal)(s.isFolder),
        isLink: (0, protobuf_msg_1.toOptVal)(s.isLink),
        ctime: (s.ctime ? (0, protobuf_msg_1.toVal)(s.ctime.valueOf()) : undefined),
        mtime: (s.mtime ? (0, protobuf_msg_1.toVal)(s.mtime.valueOf()) : undefined),
        size: (0, protobuf_msg_1.toOptVal)(s.size),
        version: (0, protobuf_msg_1.toOptVal)(s.version),
        bytesNeedDownload: (0, protobuf_msg_1.toOptVal)(s.bytesNeedDownload),
        versionSyncBranch: (0, protobuf_msg_1.toOptVal)(s.versionSyncBranch),
    };
}
function unpackStats(buf) {
    return msgToStats(statsMsgType.unpack(buf));
}
function msgToStats(m) {
    return {
        writable: m.writable,
        isFile: (0, protobuf_msg_1.valOfOpt)(m.isFile),
        isFolder: (0, protobuf_msg_1.valOfOpt)(m.isFolder),
        isLink: (0, protobuf_msg_1.valOfOpt)(m.isLink),
        size: (0, protobuf_msg_1.valOfOptInt)(m.size),
        version: (0, protobuf_msg_1.valOfOptInt)(m.version),
        bytesNeedDownload: (0, protobuf_msg_1.valOfOptInt)(m.bytesNeedDownload),
        versionSyncBranch: (0, protobuf_msg_1.valOfOpt)(m.versionSyncBranch),
        ctime: (m.ctime ? new Date((0, protobuf_msg_1.valOfOptInt)(m.ctime)) : undefined),
        mtime: (m.mtime ? new Date((0, protobuf_msg_1.valOfOptInt)(m.mtime)) : undefined),
    };
}
function syncStatusToMsg(s) {
    if (!s) {
        return;
    }
    return {
        state: s.state,
        local: syncBranchToMsg(s.local),
        synced: syncBranchToMsg(s.synced),
        remote: syncBranchToMsg(s.remote),
        existsInSyncedParent: (0, protobuf_msg_1.toOptVal)(s.existsInSyncedParent),
        uploading: uploadingToMsg(s.uploading)
    };
}
function msgToSyncStatus(m) {
    if (!m) {
        return;
    }
    return {
        state: m.state,
        local: msgToSyncBranch(m.local),
        synced: msgToSyncBranch(m.synced),
        remote: msgToSyncBranch(m.remote),
        existsInSyncedParent: (0, protobuf_msg_1.valOfOpt)(m.existsInSyncedParent),
        uploading: msgToUploading(m.uploading)
    };
}
function syncBranchToMsg(b) {
    if (!b) {
        return;
    }
    return {
        latest: (0, protobuf_msg_1.toOptVal)(b.latest),
        archived: (b.archived ? b.archived : undefined),
        isArchived: (0, protobuf_msg_1.toOptVal)(b.isArchived)
    };
}
function msgToSyncBranch(m) {
    if (!m) {
        return;
    }
    return {
        latest: (0, protobuf_msg_1.valOfOptInt)(m.latest),
        archived: ((m.archived.length > 0) ? m.archived.map(protobuf_msg_1.fixInt) : undefined),
        isArchived: (0, protobuf_msg_1.valOfOpt)(m.isArchived)
    };
}
function uploadingToMsg(u) {
    if (!u) {
        return;
    }
    const { localVersion, remoteVersion, uploadStarted, bytesLeftToUpload } = u;
    return { localVersion, remoteVersion, uploadStarted, bytesLeftToUpload };
}
function msgToUploading(u) {
    if (!u) {
        return;
    }
    return {
        localVersion: (0, protobuf_msg_1.fixInt)(u.localVersion),
        remoteVersion: (0, protobuf_msg_1.fixInt)(u.remoteVersion),
        bytesLeftToUpload: (0, protobuf_msg_1.fixInt)(u.bytesLeftToUpload),
        uploadStarted: u.uploadStarted
    };
}
const syncStatusMsgType = protobuf_type_1.ProtoType.for(file_proto_1.file.SyncStatusMsg);
function packSyncStatus(s) {
    return syncStatusMsgType.pack(syncStatusToMsg(s));
}
function unpackSyncStatus(buf) {
    return msgToSyncStatus(syncStatusMsgType.unpack(buf));
}
var stat;
(function (stat) {
    function wrapService(fn) {
        return () => {
            const promise = fn()
                .then(packStats);
            return { promise };
        };
    }
    stat.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'stat');
        return () => caller
            .startPromiseCall(path, undefined)
            .then(unpackStats);
    }
    stat.makeCaller = makeCaller;
})(stat || (stat = {}));
Object.freeze(stat);
const xattrValueType = protobuf_type_1.ProtoType.for(file_proto_1.file.XAttrValue);
function packXAttrValue(val) {
    if (Buffer.isBuffer(val)) {
        return xattrValueType.pack({ bytes: (0, protobuf_msg_1.toVal)(val) });
    }
    else if (typeof val === 'string') {
        return xattrValueType.pack({ str: (0, protobuf_msg_1.toVal)(val) });
    }
    else if (val === undefined) {
        return xattrValueType.pack({});
    }
    else {
        return xattrValueType.pack({ json: (0, protobuf_msg_1.toOptJson)(val) });
    }
}
function unpackXAttrValue(buf) {
    const { json, str, bytes } = xattrValueType.unpack(buf);
    if (bytes) {
        return (0, protobuf_msg_1.valOf)(bytes);
    }
    else if (str) {
        return (0, protobuf_msg_1.valOf)(str);
    }
    else {
        return (0, protobuf_msg_1.valOfOptJson)(json);
    }
}
var getXAttr;
(function (getXAttr) {
    const requestType = protobuf_type_1.ProtoType.for(file_proto_1.file.GetXAttrRequestBody);
    function wrapService(fn) {
        return buf => {
            const { xaName } = requestType.unpack(buf);
            const promise = fn(xaName)
                .then(packXAttrValue);
            return { promise };
        };
    }
    getXAttr.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'getXAttr');
        return xaName => caller
            .startPromiseCall(path, requestType.pack({ xaName }))
            .then(unpackXAttrValue);
    }
    getXAttr.makeCaller = makeCaller;
})(getXAttr || (getXAttr = {}));
Object.freeze(getXAttr);
var listXAttrs;
(function (listXAttrs) {
    function wrapService(fn) {
        return () => {
            const promise = fn()
                .then(lst => protobuf_msg_1.strArrValType.pack({ values: lst }));
            return { promise };
        };
    }
    listXAttrs.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'listXAttrs');
        return () => caller
            .startPromiseCall(path, undefined)
            .then(buf => (0, protobuf_msg_1.fixArray)(protobuf_msg_1.strArrValType.unpack(buf).values));
    }
    listXAttrs.makeCaller = makeCaller;
})(listXAttrs || (listXAttrs = {}));
Object.freeze(listXAttrs);
var readBytes;
(function (readBytes) {
    const requestType = protobuf_type_1.ProtoType.for(file_proto_1.file.ReadBytesRequestBody);
    const replyType = protobuf_type_1.ProtoType.for(file_proto_1.file.ReadBytesReplyBody);
    function packReply(bytes) {
        return replyType.pack({ bytes: (0, protobuf_msg_1.toOptVal)(bytes) });
    }
    readBytes.packReply = packReply;
    function unpackReply(buf) {
        return (0, protobuf_msg_1.valOfOpt)(replyType.unpack(buf).bytes);
    }
    readBytes.unpackReply = unpackReply;
    function wrapService(fn) {
        return buf => {
            const { start, end } = requestType.unpack(buf);
            const promise = fn((0, protobuf_msg_1.valOfOptInt)(start), (0, protobuf_msg_1.valOfOptInt)(end))
                .then(packReply);
            return { promise };
        };
    }
    readBytes.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'readBytes');
        return (start, end) => caller
            .startPromiseCall(path, requestType.pack({
            start: (0, protobuf_msg_1.toOptVal)(start), end: (0, protobuf_msg_1.toOptVal)(end)
        }))
            .then(unpackReply);
    }
    readBytes.makeCaller = makeCaller;
})(readBytes || (exports.readBytes = readBytes = {}));
Object.freeze(readBytes);
var readTxt;
(function (readTxt) {
    function wrapService(fn) {
        return () => {
            const promise = fn()
                .then(txt => (0, protobuf_msg_1.encodeToUtf8)(txt));
            return { promise };
        };
    }
    readTxt.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'readTxt');
        return () => caller
            .startPromiseCall(path, undefined)
            .then(buf => (buf ? (0, protobuf_msg_1.decodeFromUtf8)(buf) : ''));
    }
    readTxt.makeCaller = makeCaller;
})(readTxt || (readTxt = {}));
Object.freeze(readTxt);
function packJSON(json) {
    return (0, protobuf_msg_1.encodeToUtf8)(JSON.stringify(json));
}
function unpackJSON(buf) {
    if (!buf) {
        throw (0, connector_1.makeIPCException)({ missingBodyBytes: true });
    }
    try {
        return JSON.parse((0, protobuf_msg_1.decodeFromUtf8)(buf));
    }
    catch (err) {
        throw (0, error_1.errWithCause)(err, `Can't parse ipc reply as json`);
    }
}
var readJSON;
(function (readJSON) {
    function wrapService(fn) {
        return () => {
            const promise = fn()
                .then(packJSON);
            return { promise };
        };
    }
    readJSON.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'readJSON');
        return () => caller
            .startPromiseCall(path, undefined)
            .then(unpackJSON);
    }
    readJSON.makeCaller = makeCaller;
})(readJSON || (readJSON = {}));
Object.freeze(readJSON);
var getByteSource;
(function (getByteSource) {
    function wrapService(fn, expServices) {
        return () => {
            const promise = fn()
                .then(src => {
                const ref = (0, bytes_1.exposeSrcService)(src, expServices);
                return protobuf_msg_1.objRefType.pack(ref);
            });
            return { promise };
        };
    }
    getByteSource.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'getByteSource');
        return () => caller
            .startPromiseCall(path, undefined)
            .then(buf => {
            const ref = protobuf_msg_1.objRefType.unpack(buf);
            return (0, bytes_1.makeSrcCaller)(caller, ref);
        });
    }
    getByteSource.makeCaller = makeCaller;
})(getByteSource || (getByteSource = {}));
Object.freeze(getByteSource);
const stringValueType = protobuf_type_1.ProtoType.for(common_proto_1.common.StringValue);
function packEvent(e) {
    return stringValueType.pack((0, protobuf_msg_1.toVal)(JSON.stringify(e)));
}
function unpackEvent(buf) {
    return JSON.parse(stringValueType.unpack(buf).value);
}
var watch;
(function (watch) {
    function wrapService(fn) {
        return buf => {
            const s = new rxjs_1.Subject();
            const obs = s.asObservable().pipe((0, operators_1.map)(packEvent));
            const onCancel = fn(s);
            return { obs, onCancel };
        };
    }
    watch.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'watch');
        return obs => {
            const s = new rxjs_1.Subject();
            const unsub = caller.startObservableCall(path, undefined, s);
            s.asObservable()
                .pipe((0, operators_1.map)(unpackEvent))
                .subscribe((0, utils_for_observables_1.toRxObserver)(obs));
            return unsub;
        };
    }
    watch.makeCaller = makeCaller;
})(watch || (watch = {}));
Object.freeze(watch);
function versionedReadFlagsFromMsg(msg) {
    if (!msg) {
        return;
    }
    return {
        archivedVersion: (0, protobuf_msg_1.valOfOptInt)(msg.archivedVersion),
        remoteVersion: (0, protobuf_msg_1.valOfOptInt)(msg.remoteVersion)
    };
}
function versionedReadFlagsToMsg(flags) {
    if (!flags) {
        return;
    }
    return {
        archivedVersion: (0, protobuf_msg_1.toOptVal)(flags.archivedVersion),
        remoteVersion: (0, protobuf_msg_1.toOptVal)(flags.remoteVersion)
    };
}
var vStat;
(function (vStat) {
    function wrapService(fn) {
        return buf => {
            const promise = fn(unpackVersionedReadFlagsRequest(buf))
                .then(packStats);
            return { promise };
        };
    }
    vStat.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'stat');
        return flags => caller
            .startPromiseCall(path, packVersionedReadFlagsRequest(flags))
            .then(unpackStats);
    }
    vStat.makeCaller = makeCaller;
})(vStat || (exports.vStat = vStat = {}));
Object.freeze(vStat);
var vGetXAttr;
(function (vGetXAttr) {
    const requestType = protobuf_type_1.ProtoType.for(file_proto_1.file.VersionedGetXAttrRequestBody);
    vGetXAttr.replyType = protobuf_type_1.ProtoType.for(file_proto_1.file.VersionedGetXAttrReplyBody);
    function unpackReply(buf) {
        const { json, str, bytes, version: v } = vGetXAttr.replyType.unpack(buf);
        const version = (0, protobuf_msg_1.fixInt)(v);
        if (bytes) {
            return { version, attr: (0, protobuf_msg_1.valOf)(bytes) };
        }
        else if (str) {
            return { version, attr: (0, protobuf_msg_1.valOf)(str) };
        }
        else {
            return { version, attr: (0, protobuf_msg_1.valOfOptJson)(json) };
        }
    }
    vGetXAttr.unpackReply = unpackReply;
    function wrapService(fn) {
        return buf => {
            const { xaName, flags } = requestType.unpack(buf);
            const promise = fn(xaName, versionedReadFlagsFromMsg(flags))
                .then(({ attr, version }) => {
                if (Buffer.isBuffer(attr)) {
                    return vGetXAttr.replyType.pack({ version, bytes: (0, protobuf_msg_1.toVal)(attr) });
                }
                else if (typeof attr === 'string') {
                    return vGetXAttr.replyType.pack({ version, str: (0, protobuf_msg_1.toVal)(attr) });
                }
                else {
                    return vGetXAttr.replyType.pack({ version, json: (0, protobuf_msg_1.toOptJson)(attr) });
                }
            });
            return { promise };
        };
    }
    vGetXAttr.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'getXAttr');
        return (xaName, flags) => caller
            .startPromiseCall(path, requestType.pack({
            xaName, flags: versionedReadFlagsToMsg(flags)
        }))
            .then(unpackReply);
    }
    vGetXAttr.makeCaller = makeCaller;
})(vGetXAttr || (exports.vGetXAttr = vGetXAttr = {}));
Object.freeze(vGetXAttr);
const requestWithReadFlags = protobuf_type_1.ProtoType.for(file_proto_1.file.RequestWithVersionedReadFlags);
function packVersionedReadFlagsRequest(flags) {
    return requestWithReadFlags.pack({
        flags: versionedReadFlagsToMsg(flags)
    });
}
function unpackVersionedReadFlagsRequest(buf) {
    const { flags } = requestWithReadFlags.unpack(buf);
    return versionedReadFlagsFromMsg(flags);
}
var vListXAttrs;
(function (vListXAttrs) {
    vListXAttrs.replyType = protobuf_type_1.ProtoType.for(file_proto_1.file.VersionedListXAttrsReplyBody);
    function wrapService(fn) {
        return buf => {
            const promise = fn(unpackVersionedReadFlagsRequest(buf))
                .then(({ version, lst }) => vListXAttrs.replyType.pack({ version, xaNames: lst }));
            return { promise };
        };
    }
    vListXAttrs.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'listXAttrs');
        return flags => caller
            .startPromiseCall(path, packVersionedReadFlagsRequest(flags))
            .then(buf => {
            const { xaNames, version: v } = vListXAttrs.replyType.unpack(buf);
            return { version: (0, protobuf_msg_1.fixInt)(v), lst: (xaNames ? xaNames : []) };
        });
    }
    vListXAttrs.makeCaller = makeCaller;
})(vListXAttrs || (exports.vListXAttrs = vListXAttrs = {}));
Object.freeze(vListXAttrs);
var vReadBytes;
(function (vReadBytes) {
    const requestType = protobuf_type_1.ProtoType.for(file_proto_1.file.VersionedReadBytesRequestBody);
    const replyType = protobuf_type_1.ProtoType.for(file_proto_1.file.VersionedReadBytesReplyBody);
    function packReply(r) {
        return replyType.pack({
            version: r.version, bytes: (0, protobuf_msg_1.toOptVal)(r.bytes)
        });
    }
    vReadBytes.packReply = packReply;
    function unpackReply(buf) {
        const { version: v, bytes: b } = replyType.unpack(buf);
        return { version: (0, protobuf_msg_1.fixInt)(v), bytes: (0, protobuf_msg_1.valOfOpt)(b) };
    }
    vReadBytes.unpackReply = unpackReply;
    function wrapService(fn) {
        return buf => {
            const { start, end, flags } = requestType.unpack(buf);
            const promise = fn((0, protobuf_msg_1.valOfOptInt)(start), (0, protobuf_msg_1.valOfOptInt)(end), versionedReadFlagsFromMsg(flags))
                .then(packReply);
            return { promise };
        };
    }
    vReadBytes.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'readBytes');
        return (start, end, flags) => caller
            .startPromiseCall(path, requestType.pack({
            start: (0, protobuf_msg_1.toOptVal)(start), end: (0, protobuf_msg_1.toOptVal)(end),
            flags: versionedReadFlagsToMsg(flags)
        }))
            .then(unpackReply);
    }
    vReadBytes.makeCaller = makeCaller;
})(vReadBytes || (exports.vReadBytes = vReadBytes = {}));
Object.freeze(vReadBytes);
var vReadTxt;
(function (vReadTxt) {
    vReadTxt.replyType = protobuf_type_1.ProtoType.for(file_proto_1.file.VersionedReadTxtReplyBody);
    function wrapService(fn) {
        return buf => {
            const promise = fn(unpackVersionedReadFlagsRequest(buf))
                .then(verAndTxt => vReadTxt.replyType.pack(verAndTxt));
            return { promise };
        };
    }
    vReadTxt.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'readTxt');
        return flags => caller
            .startPromiseCall(path, packVersionedReadFlagsRequest(flags))
            .then(buf => {
            const { version: v, txt } = vReadTxt.replyType.unpack(buf);
            return { version: (0, protobuf_msg_1.fixInt)(v), txt };
        });
    }
    vReadTxt.makeCaller = makeCaller;
})(vReadTxt || (exports.vReadTxt = vReadTxt = {}));
Object.freeze(vReadTxt);
var vReadJSON;
(function (vReadJSON) {
    vReadJSON.replyType = protobuf_type_1.ProtoType.for(file_proto_1.file.VersionedReadJsonReplyBody);
    function wrapService(fn) {
        return buf => {
            const promise = fn(unpackVersionedReadFlagsRequest(buf))
                .then(({ version, json }) => {
                return vReadJSON.replyType.pack({ version, json: JSON.stringify(json) });
            });
            return { promise };
        };
    }
    vReadJSON.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'readJSON');
        return flags => caller
            .startPromiseCall(path, packVersionedReadFlagsRequest(flags))
            .then(buf => {
            const { version: v, json } = vReadJSON.replyType.unpack(buf);
            try {
                return { version: (0, protobuf_msg_1.fixInt)(v), json: JSON.parse(json) };
            }
            catch (err) {
                throw (0, error_1.errWithCause)(err, `Can't parse ipc reply as json`);
            }
        });
    }
    vReadJSON.makeCaller = makeCaller;
})(vReadJSON || (exports.vReadJSON = vReadJSON = {}));
Object.freeze(vReadJSON);
var vGetByteSource;
(function (vGetByteSource) {
    vGetByteSource.replyType = protobuf_type_1.ProtoType.for(file_proto_1.file.VersionedGetByteSourceReplyBody);
    function wrapService(fn, expServices) {
        return buf => {
            const promise = fn(unpackVersionedReadFlagsRequest(buf))
                .then(({ version, src }) => {
                const ref = (0, bytes_1.exposeSrcService)(src, expServices);
                return vGetByteSource.replyType.pack({ version, src: ref });
            });
            return { promise };
        };
    }
    vGetByteSource.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'getByteSource');
        return flags => caller
            .startPromiseCall(path, packVersionedReadFlagsRequest(flags))
            .then(buf => {
            const { version: v, src: ref } = vGetByteSource.replyType.unpack(buf);
            return { version: (0, protobuf_msg_1.fixInt)(v), src: (0, bytes_1.makeSrcCaller)(caller, ref) };
        });
    }
    vGetByteSource.makeCaller = makeCaller;
})(vGetByteSource || (exports.vGetByteSource = vGetByteSource = {}));
Object.freeze(vGetByteSource);
function xattrToMsg(xaName, val) {
    const msg = { xaName };
    if (Buffer.isBuffer(val)) {
        msg.bytes = (0, protobuf_msg_1.toVal)(val);
    }
    else if (ArrayBuffer.isView(val)) {
        msg.bytes = (0, protobuf_msg_1.toVal)((0, buffer_utils_1.toBuffer)(val));
    }
    else if (typeof val === 'string') {
        msg.str = (0, protobuf_msg_1.toVal)(val);
    }
    else {
        msg.json = (0, protobuf_msg_1.toOptJson)(val);
    }
    return msg;
}
function xattrFromMsg(msg) {
    const { xaName: name } = msg;
    if (msg.bytes) {
        return { name, value: (0, protobuf_msg_1.valOf)(msg.bytes) };
    }
    else if (msg.str) {
        return { name, value: (0, protobuf_msg_1.valOf)(msg.str) };
    }
    else {
        return { name, value: (0, protobuf_msg_1.valOfOptJson)(msg.json) };
    }
}
var updateXAttrs;
(function (updateXAttrs) {
    const requestType = protobuf_type_1.ProtoType.for(file_proto_1.file.UpdateXAttrsRequestBody);
    function fromReqChanges(r) {
        const attrs = {};
        if (r.set) {
            attrs.set = {};
            for (const xattr of r.set) {
                const { name, value } = xattrFromMsg(xattr);
                attrs.set[name] = value;
            }
        }
        if (r.remove) {
            attrs.remove = r.remove;
        }
        return attrs;
    }
    updateXAttrs.fromReqChanges = fromReqChanges;
    function unpackXAttrsChanges(buf) {
        const { changes } = requestType.unpack(buf);
        return fromReqChanges(changes);
    }
    updateXAttrs.unpackXAttrsChanges = unpackXAttrsChanges;
    function wrapService(fn) {
        return buf => {
            const attrs = unpackXAttrsChanges(buf);
            const promise = fn(attrs);
            return { promise };
        };
    }
    updateXAttrs.wrapService = wrapService;
    function toReqChanges(changes) {
        const r = {
            set: [],
            remove: (changes.remove ? changes.remove : [])
        };
        if (changes.set) {
            for (const [xaName, val] of Object.entries(changes.set)) {
                r.set.push(xattrToMsg(xaName, val));
            }
        }
        return r;
    }
    updateXAttrs.toReqChanges = toReqChanges;
    function packXAttrsChanges(changes) {
        return requestType.pack({ changes: toReqChanges(changes) });
    }
    updateXAttrs.packXAttrsChanges = packXAttrsChanges;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'updateXAttrs');
        return async (changes) => {
            await caller.startPromiseCall(path, packXAttrsChanges(changes));
        };
    }
    updateXAttrs.makeCaller = makeCaller;
})(updateXAttrs || (exports.updateXAttrs = updateXAttrs = {}));
Object.freeze(updateXAttrs);
var writeBytes;
(function (writeBytes) {
    const requestType = protobuf_type_1.ProtoType.for(file_proto_1.file.WriteBytesRequestBody);
    function wrapService(fn) {
        return buf => {
            const { bytes } = requestType.unpack(buf);
            const promise = fn(bytes);
            return { promise };
        };
    }
    writeBytes.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'writeBytes');
        return bytes => caller
            .startPromiseCall(path, requestType.pack({
            bytes: bytes
        }));
    }
    writeBytes.makeCaller = makeCaller;
})(writeBytes || (writeBytes = {}));
Object.freeze(writeBytes);
var writeTxt;
(function (writeTxt) {
    const requestType = protobuf_type_1.ProtoType.for(file_proto_1.file.WriteTxtRequestBody);
    function wrapService(fn) {
        return buf => {
            const { txt } = requestType.unpack(buf);
            const promise = fn(txt);
            return { promise };
        };
    }
    writeTxt.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'writeTxt');
        return txt => caller
            .startPromiseCall(path, requestType.pack({ txt }));
    }
    writeTxt.makeCaller = makeCaller;
})(writeTxt || (writeTxt = {}));
Object.freeze(writeTxt);
var writeJSON;
(function (writeJSON) {
    const requestType = protobuf_type_1.ProtoType.for(file_proto_1.file.WriteJsonRequestBody);
    function wrapService(fn) {
        return buf => {
            const { json } = requestType.unpack(buf);
            const promise = fn(JSON.parse(json));
            return { promise };
        };
    }
    writeJSON.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'writeJSON');
        return json => caller
            .startPromiseCall(path, requestType.pack({
            json: JSON.stringify(json)
        }));
    }
    writeJSON.makeCaller = makeCaller;
})(writeJSON || (writeJSON = {}));
Object.freeze(writeJSON);
var getByteSink;
(function (getByteSink) {
    const requestType = protobuf_type_1.ProtoType.for(file_proto_1.file.GetByteSinkRequestBody);
    function wrapService(fn, expServices) {
        return buf => {
            const { truncateFile } = requestType.unpack(buf);
            const promise = fn((0, protobuf_msg_1.valOfOpt)(truncateFile))
                .then(sink => {
                const ref = (0, bytes_1.exposeSinkService)(sink, expServices);
                return protobuf_msg_1.objRefType.pack(ref);
            });
            return { promise };
        };
    }
    getByteSink.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'getByteSink');
        return truncateFile => caller
            .startPromiseCall(path, requestType.pack({
            truncateFile: (0, protobuf_msg_1.toOptVal)(truncateFile)
        }))
            .then(buf => {
            const ref = protobuf_msg_1.objRefType.unpack(buf);
            return (0, bytes_1.makeSinkCaller)(caller, ref);
        });
    }
    getByteSink.makeCaller = makeCaller;
})(getByteSink || (getByteSink = {}));
Object.freeze(getByteSink);
var copy;
(function (copy) {
    copy.requestType = protobuf_type_1.ProtoType.for(file_proto_1.file.CopyRequestBody);
    function wrapService(fn, expServices) {
        return buf => {
            const { file: fRef } = copy.requestType.unpack(buf);
            const file = expServices.getOriginalObj(fRef);
            const promise = fn(file);
            return { promise };
        };
    }
    copy.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'copy');
        return async (file) => {
            const fRef = caller.srvRefOf(file);
            await caller
                .startPromiseCall(path, copy.requestType.pack({ file: fRef }));
        };
    }
    copy.makeCaller = makeCaller;
})(copy || (copy = {}));
Object.freeze(copy);
var vCopy;
(function (vCopy) {
    function wrapService(fn, expServices) {
        return buf => {
            const { file: fRef } = copy.requestType.unpack(buf);
            const file = expServices.getOriginalObj(fRef);
            const promise = fn(file)
                .then(protobuf_msg_1.packInt);
            return { promise };
        };
    }
    vCopy.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'copy');
        return file => {
            const fRef = caller.srvRefOf(file);
            return caller
                .startPromiseCall(path, copy.requestType.pack({ file: fRef }))
                .then(protobuf_msg_1.unpackInt);
        };
    }
    vCopy.makeCaller = makeCaller;
})(vCopy || (vCopy = {}));
Object.freeze(vCopy);
var vUpdateXAttrs;
(function (vUpdateXAttrs) {
    function wrapService(fn) {
        return buf => {
            const attrs = updateXAttrs.unpackXAttrsChanges(buf);
            const promise = fn(attrs)
                .then(protobuf_msg_1.packInt);
            return { promise };
        };
    }
    vUpdateXAttrs.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'updateXAttrs');
        return changes => {
            const reqBody = updateXAttrs.packXAttrsChanges(changes);
            return caller.startPromiseCall(path, reqBody)
                .then(protobuf_msg_1.unpackInt);
        };
    }
    vUpdateXAttrs.makeCaller = makeCaller;
})(vUpdateXAttrs || (vUpdateXAttrs = {}));
Object.freeze(vUpdateXAttrs);
var vWriteBytes;
(function (vWriteBytes) {
    const requestType = protobuf_type_1.ProtoType.for(file_proto_1.file.WriteBytesRequestBody);
    function wrapService(fn) {
        return buf => {
            const { bytes } = requestType.unpack(buf);
            const promise = fn(bytes)
                .then(protobuf_msg_1.packInt);
            return { promise };
        };
    }
    vWriteBytes.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'writeBytes');
        return bytes => caller
            .startPromiseCall(path, requestType.pack({ bytes: bytes }))
            .then(protobuf_msg_1.unpackInt);
    }
    vWriteBytes.makeCaller = makeCaller;
})(vWriteBytes || (vWriteBytes = {}));
Object.freeze(vWriteBytes);
var vWriteTxt;
(function (vWriteTxt) {
    const requestType = protobuf_type_1.ProtoType.for(file_proto_1.file.WriteTxtRequestBody);
    function wrapService(fn) {
        return buf => {
            const { txt } = requestType.unpack(buf);
            const promise = fn(txt)
                .then(protobuf_msg_1.packInt);
            return { promise };
        };
    }
    vWriteTxt.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'writeTxt');
        return txt => caller
            .startPromiseCall(path, requestType.pack({ txt }))
            .then(protobuf_msg_1.unpackInt);
    }
    vWriteTxt.makeCaller = makeCaller;
})(vWriteTxt || (vWriteTxt = {}));
Object.freeze(vWriteTxt);
var vWriteJSON;
(function (vWriteJSON) {
    const requestType = protobuf_type_1.ProtoType.for(file_proto_1.file.WriteJsonRequestBody);
    function wrapService(fn) {
        return buf => {
            const { json } = requestType.unpack(buf);
            const promise = fn(JSON.parse(json))
                .then(protobuf_msg_1.packInt);
            return { promise };
        };
    }
    vWriteJSON.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'writeJSON');
        return json => caller
            .startPromiseCall(path, requestType.pack({ json: JSON.stringify(json) }))
            .then(protobuf_msg_1.unpackInt);
    }
    vWriteJSON.makeCaller = makeCaller;
})(vWriteJSON || (vWriteJSON = {}));
Object.freeze(vWriteJSON);
var vGetByteSink;
(function (vGetByteSink) {
    const requestType = protobuf_type_1.ProtoType.for(file_proto_1.file.VersionedGetByteSinkRequestBody);
    vGetByteSink.replyType = protobuf_type_1.ProtoType.for(file_proto_1.file.VersionedGetByteSinkReplyBody);
    function wrapService(fn, expServices) {
        return buf => {
            const { truncateFile, currentVersion } = requestType.unpack(buf);
            const promise = fn((0, protobuf_msg_1.valOfOpt)(truncateFile), (0, protobuf_msg_1.valOfOptInt)(currentVersion))
                .then(({ sink, version }) => {
                const ref = (0, bytes_1.exposeSinkService)(sink, expServices);
                return vGetByteSink.replyType.pack({ version, sink: ref });
            });
            return { promise };
        };
    }
    vGetByteSink.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'getByteSink');
        return (truncateFile, currentVersion) => caller
            .startPromiseCall(path, requestType.pack({
            truncateFile: (0, protobuf_msg_1.toOptVal)(truncateFile),
            currentVersion: (0, protobuf_msg_1.toOptVal)(currentVersion)
        }))
            .then(buf => {
            const { version: v, sink: ref } = vGetByteSink.replyType.unpack(buf);
            return { version: (0, protobuf_msg_1.fixInt)(v), sink: (0, bytes_1.makeSinkCaller)(caller, ref) };
        });
    }
    vGetByteSink.makeCaller = makeCaller;
})(vGetByteSink || (exports.vGetByteSink = vGetByteSink = {}));
Object.freeze(vGetByteSink);
var vsWhenConnected;
(function (vsWhenConnected) {
    function wrapService(fn) {
        return buf => {
            const promise = fn();
            return { promise };
        };
    }
    vsWhenConnected.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'whenConnected');
        return () => caller
            .startPromiseCall(path, undefined)
            .then(noop);
    }
    vsWhenConnected.makeCaller = makeCaller;
})(vsWhenConnected || (exports.vsWhenConnected = vsWhenConnected = {}));
Object.freeze(vsWhenConnected);
function noop() { }
var vsStatus;
(function (vsStatus) {
    function wrapService(fn) {
        return buf => {
            const promise = fn(protobuf_msg_1.boolValType.unpack(buf).value)
                .then(packSyncStatus);
            return { promise };
        };
    }
    vsStatus.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'status');
        return (skipServerCheck) => caller
            .startPromiseCall(path, protobuf_msg_1.boolValType.pack((0, protobuf_msg_1.toVal)(!!skipServerCheck)))
            .then(unpackSyncStatus);
    }
    vsStatus.makeCaller = makeCaller;
})(vsStatus || (vsStatus = {}));
Object.freeze(vsStatus);
var vsIsRemoteVersionOnDisk;
(function (vsIsRemoteVersionOnDisk) {
    const requestType = protobuf_type_1.ProtoType.for(file_proto_1.file.FileSyncIsOnDiskRequestBody);
    const replyType = protobuf_type_1.ProtoType.for(file_proto_1.file.FileSyncIsOnDiskReplyBody);
    function wrapService(fn) {
        return buf => {
            const { version } = requestType.unpack(buf);
            const promise = fn((0, protobuf_msg_1.fixInt)(version))
                .then(status => replyType.pack({ status }));
            return { promise };
        };
    }
    vsIsRemoteVersionOnDisk.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'isRemoteVersionOnDisk');
        return version => caller
            .startPromiseCall(path, requestType.pack({ version }))
            .then(buf => replyType.unpack(buf).status);
    }
    vsIsRemoteVersionOnDisk.makeCaller = makeCaller;
})(vsIsRemoteVersionOnDisk || (vsIsRemoteVersionOnDisk = {}));
Object.freeze(vsIsRemoteVersionOnDisk);
var vsStartDownload;
(function (vsStartDownload) {
    const requestType = protobuf_type_1.ProtoType.for(file_proto_1.file.FileSyncStartDownloadRequestBody);
    vsStartDownload.replyType = protobuf_type_1.ProtoType.for(file_proto_1.file.FileSyncStartDownloadReplyBody);
    function wrapService(fn) {
        return buf => {
            const { version } = requestType.unpack(buf);
            const promise = fn((0, protobuf_msg_1.fixInt)(version))
                .then(startedDownload => vsStartDownload.replyType.pack({ startedDownload }));
            return { promise };
        };
    }
    vsStartDownload.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'startDownload');
        return version => caller
            .startPromiseCall(path, requestType.pack({ version }))
            .then(buf => {
            const { startedDownload } = vsStartDownload.replyType.unpack(buf);
            if (startedDownload) {
                return {
                    downloadTaskId: (0, protobuf_msg_1.fixInt)(startedDownload.downloadTaskId)
                };
            }
        });
    }
    vsStartDownload.makeCaller = makeCaller;
})(vsStartDownload || (exports.vsStartDownload = vsStartDownload = {}));
Object.freeze(vsStartDownload);
function optionsToUploadLocalToMsg(opts) {
    if (!opts) {
        return;
    }
    return {
        localVersion: (0, protobuf_msg_1.toOptVal)(opts.localVersion),
        uploadVersion: (0, protobuf_msg_1.toOptVal)(opts.uploadVersion)
    };
}
function optionsToUploadLocalFromMsg(opts) {
    if (!opts) {
        return;
    }
    return {
        localVersion: (0, protobuf_msg_1.valOfOptInt)(opts.localVersion),
        uploadVersion: (0, protobuf_msg_1.valOfOptInt)(opts.uploadVersion)
    };
}
var vsStartUpload;
(function (vsStartUpload) {
    vsStartUpload.requestType = protobuf_type_1.ProtoType.for(file_proto_1.file.FileSyncUploadRequestBody);
    vsStartUpload.replyType = protobuf_type_1.ProtoType.for(file_proto_1.file.FileSyncStartUploadReplyBody);
    function wrapService(fn) {
        return buf => {
            const { opts } = vsStartUpload.requestType.unpack(buf);
            const promise = fn(optionsToUploadLocalFromMsg(opts))
                .then(startedUpload => vsStartUpload.replyType.pack({ startedUpload }));
            return { promise };
        };
    }
    vsStartUpload.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'startUpload');
        return opts => caller
            .startPromiseCall(path, vsStartUpload.requestType.pack({
            opts: optionsToUploadLocalToMsg(opts)
        }))
            .then(buf => {
            const { startedUpload } = vsStartUpload.replyType.unpack(buf);
            if (startedUpload) {
                const { uploadTaskId, uploadVersion } = startedUpload;
                return {
                    uploadVersion: (0, protobuf_msg_1.fixInt)(uploadVersion),
                    uploadTaskId: (0, protobuf_msg_1.fixInt)(uploadTaskId)
                };
            }
        });
    }
    vsStartUpload.makeCaller = makeCaller;
})(vsStartUpload || (exports.vsStartUpload = vsStartUpload = {}));
Object.freeze(vsStartUpload);
var vsUpload;
(function (vsUpload) {
    vsUpload.replyType = protobuf_type_1.ProtoType.for(file_proto_1.file.FileSyncUploadReplyBody);
    function wrapService(fn) {
        return buf => {
            const { opts } = vsStartUpload.requestType.unpack(buf);
            const promise = fn(optionsToUploadLocalFromMsg(opts))
                .then(uploadedVersion => vsUpload.replyType.pack({
                uploadedVersion: (0, protobuf_msg_1.toOptVal)(uploadedVersion)
            }));
            return { promise };
        };
    }
    vsUpload.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'upload');
        return opts => caller
            .startPromiseCall(path, vsStartUpload.requestType.pack({
            opts: optionsToUploadLocalToMsg(opts)
        }))
            .then(buf => (0, protobuf_msg_1.valOfOptInt)(vsUpload.replyType.unpack(buf).uploadedVersion));
    }
    vsUpload.makeCaller = makeCaller;
})(vsUpload || (exports.vsUpload = vsUpload = {}));
Object.freeze(vsUpload);
function remoteAdoptionOptsToMsg(opts) {
    if (!opts) {
        return;
    }
    return {
        // dropLocalVer: toOptVal(opts.dropLocalVer),
        remoteVersion: (0, protobuf_msg_1.toOptVal)(opts.remoteVersion)
    };
}
function remoteAdoptionOptsFromMsg(msg) {
    if (!msg) {
        return;
    }
    return {
        // dropLocalVer: valOfOpt(msg.dropLocalVer),
        remoteVersion: (0, protobuf_msg_1.valOfOptInt)(msg.remoteVersion)
    };
}
var vsAdoptRemote;
(function (vsAdoptRemote) {
    const requestType = protobuf_type_1.ProtoType.for(file_proto_1.file.AdoptRemoteRequestBody);
    function wrapService(fn) {
        return buf => {
            const { opts } = requestType.unpack(buf);
            const promise = fn(remoteAdoptionOptsFromMsg(opts));
            return { promise };
        };
    }
    vsAdoptRemote.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'adoptRemote');
        return opts => caller
            .startPromiseCall(path, requestType.pack({
            opts: remoteAdoptionOptsToMsg(opts)
        }));
    }
    vsAdoptRemote.makeCaller = makeCaller;
})(vsAdoptRemote || (vsAdoptRemote = {}));
Object.freeze(vsAdoptRemote);
var vListVersions;
(function (vListVersions) {
    const replyType = protobuf_type_1.ProtoType.for(file_proto_1.file.ListVersionsReplyBody);
    function packReply(v) {
        return replyType.pack({
            current: (0, protobuf_msg_1.toOptVal)(v.current),
            archived: v.archived
        });
    }
    vListVersions.packReply = packReply;
    function unpackReply(b) {
        const r = replyType.unpack(b);
        return {
            current: (0, protobuf_msg_1.valOfOptInt)(r.current),
            archived: ((r.archived.length > 0) ?
                r.archived.map(protobuf_msg_1.fixInt) : undefined)
        };
    }
    vListVersions.unpackReply = unpackReply;
    function wrapService(fn) {
        return () => {
            const promise = fn()
                .then(packReply);
            return { promise };
        };
    }
    vListVersions.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'listVersions');
        return () => caller
            .startPromiseCall(path)
            .then(unpackReply);
    }
    vListVersions.makeCaller = makeCaller;
})(vListVersions || (exports.vListVersions = vListVersions = {}));
Object.freeze(vListVersions);
var vArchiveCurrent;
(function (vArchiveCurrent) {
    const requestType = protobuf_type_1.ProtoType.for(file_proto_1.file.ArchiveCurrentRequestBody);
    function wrapService(fn) {
        return buf => {
            const { version } = requestType.unpack(buf);
            const promise = fn((0, protobuf_msg_1.valOfOptInt)(version))
                .then(protobuf_msg_1.packInt);
            return { promise };
        };
    }
    vArchiveCurrent.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'archiveCurrent');
        return version => caller
            .startPromiseCall(path, requestType.pack({ version: (0, protobuf_msg_1.toOptVal)(version) }))
            .then(protobuf_msg_1.unpackInt);
    }
    vArchiveCurrent.makeCaller = makeCaller;
})(vArchiveCurrent || (vArchiveCurrent = {}));
Object.freeze(vArchiveCurrent);
function diffTStoMsg(diffTS) {
    return (diffTS ? {
        current: diffTS.current.valueOf(),
        remote: diffTS.remote.valueOf(),
        synced: diffTS.synced.valueOf(),
    } : undefined);
}
function diffTSfromMsg(msg) {
    return (msg ? {
        current: new Date((0, protobuf_msg_1.fixInt)(msg.current)),
        remote: new Date((0, protobuf_msg_1.fixInt)(msg.remote)),
        synced: new Date((0, protobuf_msg_1.fixInt)(msg.synced)),
    } : undefined);
}
function commonDiffToMsg(diff) {
    return {
        remoteVersion: (0, protobuf_msg_1.toOptVal)(diff.remoteVersion),
        currentVersion: diff.currentVersion,
        syncedVersion: (0, protobuf_msg_1.toOptVal)(diff.syncedVersion),
        isCurrentLocal: diff.isCurrentLocal,
        isRemoteRemoved: diff.isRemoteRemoved,
        ctime: diffTStoMsg((diff.ctime)),
        mtime: diffTStoMsg(diff.mtime),
        xattrs: (diff.xattrs ? Object.entries(diff.xattrs).map(([name, { addedIn, changedIn, removedIn }]) => ({
            name,
            addedIn: (0, protobuf_msg_1.toOptVal)(addedIn),
            changedIn: (0, protobuf_msg_1.toOptVal)(changedIn),
            removedIn: (0, protobuf_msg_1.toOptVal)(removedIn)
        })) : undefined)
    };
}
function commonDiffFromMsg(msg) {
    let xattrs = undefined;
    if (msg.xattrs && (msg.xattrs.length > 0)) {
        xattrs = {};
        for (const { name, addedIn, changedIn, removedIn } of msg.xattrs) {
            xattrs[name] = {
                addedIn: (0, protobuf_msg_1.valOfOpt)(addedIn),
                changedIn: (0, protobuf_msg_1.valOfOpt)(changedIn),
                removedIn: (0, protobuf_msg_1.valOfOpt)(removedIn),
            };
        }
    }
    return {
        remoteVersion: (0, protobuf_msg_1.valOfOptInt)(msg.remoteVersion),
        currentVersion: (0, protobuf_msg_1.fixInt)(msg.currentVersion),
        syncedVersion: (0, protobuf_msg_1.valOfOptInt)(msg.syncedVersion),
        isCurrentLocal: msg.isCurrentLocal,
        isRemoteRemoved: msg.isRemoteRemoved,
        ctime: diffTSfromMsg(msg.ctime),
        mtime: diffTSfromMsg(msg.mtime),
        xattrs
    };
}
function fileDiffToMsg(diff) {
    if (!diff) {
        return;
    }
    return {
        ...commonDiffToMsg(diff),
        areContentsSame: diff.areContentsSame,
        size: diff.size
    };
}
function fileDiffFromMsg(msg) {
    if (!msg) {
        return;
    }
    return {
        ...commonDiffFromMsg(msg),
        areContentsSame: msg.areContentsSame,
        size: (msg.size ? {
            current: (0, protobuf_msg_1.fixInt)(msg.size.current),
            remote: (0, protobuf_msg_1.fixInt)(msg.size.remote)
        } : undefined)
    };
}
var vsDiffCurrentAndRemoteVersions;
(function (vsDiffCurrentAndRemoteVersions) {
    function optsFromMsg(opts) {
        return (opts ? {
            remoteVersion: (0, protobuf_msg_1.valOfOptInt)(opts.remoteVersion),
            compareContentIfSameMTime: (0, protobuf_msg_1.valOfOpt)(opts.compareContentIfSameMTime)
        } : undefined);
    }
    vsDiffCurrentAndRemoteVersions.optsFromMsg = optsFromMsg;
    function optsToMsg(opts) {
        return (opts ? {
            remoteVersion: (0, protobuf_msg_1.toOptVal)(opts.remoteVersion),
            compareContentIfSameMTime: (0, protobuf_msg_1.toOptVal)(opts.compareContentIfSameMTime)
        } : undefined);
    }
    vsDiffCurrentAndRemoteVersions.optsToMsg = optsToMsg;
    const requestType = protobuf_type_1.ProtoType.for(file_proto_1.file.DiffCurrentAndRemoteRequestBody);
    vsDiffCurrentAndRemoteVersions.replyType = protobuf_type_1.ProtoType.for(file_proto_1.file.DiffCurrentAndRemoteReplyBody);
    function wrapService(fn) {
        return buf => {
            const { opts } = requestType.unpack(buf);
            const promise = fn(optsFromMsg(opts))
                .then(diff => vsDiffCurrentAndRemoteVersions.replyType.pack({ diff: fileDiffToMsg(diff) }));
            return { promise };
        };
    }
    vsDiffCurrentAndRemoteVersions.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'diffCurrentAndRemoteVersions');
        return opts => caller
            .startPromiseCall(ipcPath, requestType.pack({ opts: optsToMsg(opts) }))
            .then(buf => fileDiffFromMsg(vsDiffCurrentAndRemoteVersions.replyType.unpack(buf).diff));
    }
    vsDiffCurrentAndRemoteVersions.makeCaller = makeCaller;
})(vsDiffCurrentAndRemoteVersions || (exports.vsDiffCurrentAndRemoteVersions = vsDiffCurrentAndRemoteVersions = {}));
Object.freeze(vsDiffCurrentAndRemoteVersions);
Object.freeze(exports);

}).call(this)}).call(this,{"isBuffer":require("../../../is-buffer/index.js")})
},{"../../../is-buffer/index.js":80,"../ipc-via-protobuf/connector":60,"../ipc-via-protobuf/protobuf-msg":61,"../lib-client/protobuf-type":63,"../lib-common/buffer-utils":65,"../lib-common/exceptions/error":66,"../lib-common/utils-for-observables":70,"../protos/common.proto":73,"../protos/file.proto":74,"./bytes":43,"rxjs":95,"rxjs/operators":320}],46:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2020, 2022, 2025 - 2026 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.fsItem = exports.fsMsgType = void 0;
exports.makeFSCaller = makeFSCaller;
exports.exposeFSService = exposeFSService;
const protobuf_msg_1 = require("../ipc-via-protobuf/protobuf-msg");
const protobuf_type_1 = require("../lib-client/protobuf-type");
const fs_proto_1 = require("../protos/fs.proto");
const connector_1 = require("../ipc-via-protobuf/connector");
const file_1 = require("./file");
const file = require("./file");
const assert_1 = require("../lib-common/assert");
const bytes_1 = require("./bytes");
const rxjs_1 = require("rxjs");
const deferred_1 = require("../lib-common/processes/deferred");
const operators_1 = require("rxjs/operators");
const utils_for_observables_1 = require("../lib-common/utils-for-observables");
function makeFSCaller(caller, fsMsg) {
    (0, connector_1.checkRefObjTypeIs)('FSImpl', fsMsg.impl);
    const objPath = fsMsg.impl.path;
    const fs = {
        name: fsMsg.name,
        type: fsMsg.type,
        writable: fsMsg.writable,
        checkFilePresence: checkPresence.makeFileCaller(caller, objPath),
        checkFolderPresence: checkPresence.makeFolderCaller(caller, objPath),
        checkLinkPresence: checkPresence.makeLinkCaller(caller, objPath),
        close: close.makeCaller(caller, objPath),
        getByteSource: getByteSource.makeCaller(caller, objPath),
        getXAttr: getXAttr.makeCaller(caller, objPath),
        listXAttrs: listXAttrs.makeCaller(caller, objPath),
        listFolder: listFolder.makeCaller(caller, objPath),
        readBytes: readBytes.makeCaller(caller, objPath),
        readLink: readLink.makeCaller(caller, objPath),
        readJSONFile: readJSONFile.makeCaller(caller, objPath),
        readTxtFile: readTxtFile.makeCaller(caller, objPath),
        readonlyFile: readonlyFile.makeCaller(caller, objPath),
        readonlySubRoot: readonlySubRoot.makeCaller(caller, objPath),
        select: select.makeCaller(caller, objPath),
        stat: stat.makeCaller(caller, objPath),
        watchFolder: watch.makeFolderCaller(caller, objPath),
        watchFile: watch.makeFileCaller(caller, objPath),
        watchTree: watchTree.makeCaller(caller, objPath),
    };
    if (fsMsg.writable) {
        fs.copyFile = copyFile.makeCaller(caller, objPath);
        fs.copyFolder = copyFolder.makeCaller(caller, objPath);
        fs.deleteFile = deleteFile.makeCaller(caller, objPath);
        fs.deleteFolder = deleteFolder.makeCaller(caller, objPath);
        fs.deleteLink = deleteLink.makeCaller(caller, objPath);
        fs.getByteSink = getByteSink.makeCaller(caller, objPath);
        fs.link = link.makeCaller(caller, objPath);
        fs.makeFolder = makeFolder.makeCaller(caller, objPath);
        fs.move = move.makeCaller(caller, objPath);
        fs.saveFile = saveFile.makeCaller(caller, objPath);
        fs.saveFolder = saveFolder.makeCaller(caller, objPath);
        fs.updateXAttrs = updateXAttrs.makeCaller(caller, objPath);
        fs.writableFile = writableFile.makeCaller(caller, objPath);
        fs.writableSubRoot = writableSubRoot.makeCaller(caller, objPath);
        fs.writeBytes = writeBytes.makeCaller(caller, objPath);
        fs.writeJSONFile = writeJSONFile.makeCaller(caller, objPath);
        fs.writeTxtFile = writeTxtFile.makeCaller(caller, objPath);
    }
    if (fsMsg.isVersioned) {
        const vPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'v');
        fs.v = {
            getByteSource: vGetByteSource.makeCaller(caller, vPath),
            stat: vStat.makeCaller(caller, vPath),
            getXAttr: vGetXAttr.makeCaller(caller, vPath),
            listXAttrs: vListXAttrs.makeCaller(caller, vPath),
            listFolder: vListFolder.makeCaller(caller, vPath),
            readBytes: vReadBytes.makeCaller(caller, vPath),
            readJSONFile: vReadJSONFile.makeCaller(caller, vPath),
            readTxtFile: vReadTxtFile.makeCaller(caller, vPath),
            listVersions: vListVersions.makeCaller(caller, vPath)
        };
        if (fs.writable) {
            fs.v.getByteSink = vGetByteSink.makeCaller(caller, vPath);
            fs.v.writeBytes = vWriteBytes.makeCaller(caller, vPath);
            fs.v.writeJSONFile = vWriteJSONFile.makeCaller(caller, vPath);
            fs.v.writeTxtFile = vWriteTxtFile.makeCaller(caller, vPath);
            fs.v.updateXAttrs = vUpdateXAttrs.makeCaller(caller, vPath);
            fs.v.archiveCurrent = vArchiveCurrent.makeCaller(caller, vPath);
        }
        if (fsMsg.isSynced) {
            const vsPath = (0, protobuf_msg_1.methodPathFor)(vPath, 'sync');
            fs.v.sync = {
                whenConnected: file.vsWhenConnected.makeCaller(caller, vsPath),
                status: vsStatus.makeCaller(caller, vsPath),
                isRemoteVersionOnDisk: vsIsRemoteVersionOnDisk.makeCaller(caller, vsPath),
                startDownload: vsDownload.makeCaller(caller, vsPath),
                adoptRemote: vsAdoptRemote.makeCaller(caller, vsPath),
                diffCurrentAndRemoteFolderVersions: vsDiffCurrentAndRemoteFolderVersions.makeCaller(caller, vsPath),
                diffCurrentAndRemoteFileVersions: vsDiffCurrentAndRemoteFileVersions.makeCaller(caller, vsPath),
                statRemoteItem: vsStatRemoteItem.makeCaller(caller, vsPath),
                listRemoteFolderItem: vsListRemoteFolderItem.makeCaller(caller, vsPath),
                getRemoteFileItem: vsGetRemoteFileItem.makeCaller(caller, vsPath),
                getRemoteFolderItem: vsGetRemoteFolderItem.makeCaller(caller, vsPath),
            };
            if (fs.writable) {
                fs.v.sync.startUpload = vsStartUpload.makeCaller(caller, vsPath);
                fs.v.sync.upload = vsUpload.makeCaller(caller, vsPath);
                fs.v.sync.adoptRemoteFolderItem = vsAdoptRemoteFolderItem.makeCaller(caller, vsPath);
                fs.v.sync.absorbRemoteFolderChanges = vsAbsorbRemoteFolderChanges.makeCaller(caller, vsPath);
            }
        }
    }
    caller.registerClientDrop(fs, fsMsg.impl, fsMsg);
    return fs;
}
function exposeFSService(fs, expServices) {
    const implExp = {
        checkFilePresence: checkPresence.wrapService(fs.checkFilePresence),
        checkFolderPresence: checkPresence.wrapService(fs.checkFolderPresence),
        checkLinkPresence: checkPresence.wrapService(fs.checkLinkPresence),
        close: close.wrapService(fs.close),
        getByteSource: getByteSource.wrapService(fs.getByteSource, expServices),
        getXAttr: getXAttr.wrapService(fs.getXAttr),
        listXAttrs: listXAttrs.wrapService(fs.listXAttrs),
        listFolder: listFolder.wrapService(fs.listFolder),
        readBytes: readBytes.wrapService(fs.readBytes),
        readLink: readLink.wrapService(fs.readLink, expServices),
        readJSONFile: readJSONFile.wrapService(fs.readJSONFile),
        readTxtFile: readTxtFile.wrapService(fs.readTxtFile),
        readonlyFile: readonlyFile.wrapService(fs.readonlyFile, expServices),
        readonlySubRoot: readonlySubRoot.wrapService(fs.readonlySubRoot, expServices),
        select: select.wrapService(fs.select, expServices),
        stat: stat.wrapService(fs.stat),
        watchFolder: watch.wrapService(fs.watchFolder),
        watchFile: watch.wrapService(fs.watchFile),
        watchTree: watchTree.wrapService(fs.watchTree),
    };
    if (fs.writable) {
        implExp.copyFile = copyFile.wrapService(fs.copyFile);
        implExp.copyFolder = copyFolder.wrapService(fs.copyFolder);
        implExp.deleteFile = deleteFile.wrapService(fs.deleteFile);
        implExp.deleteFolder = deleteFolder.wrapService(fs.deleteFolder);
        implExp.deleteLink = deleteLink.wrapService(fs.deleteLink);
        implExp.getByteSink = getByteSink.wrapService(fs.getByteSink, expServices);
        implExp.link = link.wrapService(fs.link, expServices);
        implExp.makeFolder = makeFolder.wrapService(fs.makeFolder);
        implExp.move = move.wrapService(fs.move);
        implExp.saveFile = saveFile.wrapService(fs.saveFile, expServices);
        implExp.saveFolder = saveFolder.wrapService(fs.saveFolder, expServices);
        implExp.updateXAttrs = updateXAttrs.wrapService(fs.updateXAttrs);
        implExp.writableFile = writableFile.wrapService(fs.writableFile, expServices);
        implExp.writableSubRoot = writableSubRoot.wrapService(fs.writableSubRoot, expServices);
        implExp.writeBytes = writeBytes.wrapService(fs.writeBytes);
        implExp.writeJSONFile = writeJSONFile.wrapService(fs.writeJSONFile);
        implExp.writeTxtFile = writeTxtFile.wrapService(fs.writeTxtFile);
    }
    if (fs.v) {
        implExp.v = {
            getByteSource: vGetByteSource.wrapService(fs.v.getByteSource, expServices),
            stat: vStat.wrapService(fs.v.stat),
            getXAttr: vGetXAttr.wrapService(fs.v.getXAttr),
            listXAttrs: vListXAttrs.wrapService(fs.v.listXAttrs),
            listFolder: vListFolder.wrapService(fs.v.listFolder),
            readBytes: vReadBytes.wrapService(fs.v.readBytes),
            readJSONFile: vReadJSONFile.wrapService(fs.v.readJSONFile),
            readTxtFile: vReadTxtFile.wrapService(fs.v.readTxtFile),
            listVersions: vListVersions.wrapService(fs.v.listVersions)
        };
        if (fs.writable) {
            implExp.v.getByteSink = vGetByteSink.wrapService(fs.v.getByteSink, expServices);
            implExp.v.writeBytes = vWriteBytes.wrapService(fs.v.writeBytes);
            implExp.v.writeJSONFile = vWriteJSONFile.wrapService(fs.v.writeJSONFile);
            implExp.v.writeTxtFile = vWriteTxtFile.wrapService(fs.v.writeTxtFile);
            implExp.v.updateXAttrs = vUpdateXAttrs.wrapService(fs.v.updateXAttrs);
            implExp.v.archiveCurrent = vArchiveCurrent.wrapService(fs.v.archiveCurrent);
        }
        if (fs.v.sync) {
            implExp.v.sync = {
                whenConnected: file.vsWhenConnected.wrapService(fs.v.sync.whenConnected),
                status: vsStatus.wrapService(fs.v.sync.status),
                isRemoteVersionOnDisk: vsIsRemoteVersionOnDisk.wrapService(fs.v.sync.isRemoteVersionOnDisk),
                startDownload: vsDownload.wrapService(fs.v.sync.startDownload),
                adoptRemote: vsAdoptRemote.wrapService(fs.v.sync.adoptRemote),
                statRemoteItem: vsStatRemoteItem.wrapService(fs.v.sync.statRemoteItem),
                listRemoteFolderItem: vsListRemoteFolderItem.wrapService(fs.v.sync.listRemoteFolderItem),
                getRemoteFileItem: vsGetRemoteFileItem.wrapService(fs.v.sync.getRemoteFileItem, expServices),
                getRemoteFolderItem: vsGetRemoteFolderItem.wrapService(fs.v.sync.getRemoteFolderItem, expServices),
                diffCurrentAndRemoteFolderVersions: vsDiffCurrentAndRemoteFolderVersions.wrapService(fs.v.sync.diffCurrentAndRemoteFolderVersions),
                diffCurrentAndRemoteFileVersions: vsDiffCurrentAndRemoteFileVersions.wrapService(fs.v.sync.diffCurrentAndRemoteFileVersions)
            };
            if (fs.writable) {
                implExp.v.sync.startUpload = vsStartUpload.wrapService(fs.v.sync.startUpload);
                implExp.v.sync.upload = vsUpload.wrapService(fs.v.sync.upload);
                implExp.v.sync.adoptRemoteFolderItem = vsAdoptRemoteFolderItem.wrapService(fs.v.sync.adoptRemoteFolderItem);
                implExp.v.sync.absorbRemoteFolderChanges = vsAbsorbRemoteFolderChanges.wrapService(fs.v.sync.absorbRemoteFolderChanges);
            }
        }
    }
    const impl = expServices.exposeDroppableService('FSImpl', implExp, fs);
    const fsMsg = {
        impl,
        isVersioned: !!fs.v,
        isSynced: !!(fs.v && fs.v.sync),
        name: fs.name,
        type: fs.type,
        writable: fs.writable
    };
    return fsMsg;
}
exports.fsMsgType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.FS);
var checkPresence;
(function (checkPresence) {
    const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.CheckPresenceRequestBody);
    function wrapService(fn) {
        return buf => {
            const { path, throwIfMissing } = requestType.unpack(buf);
            const promise = fn(path, (0, protobuf_msg_1.valOfOpt)(throwIfMissing))
                .then(found => protobuf_msg_1.boolValType.pack({ value: found }));
            return { promise };
        };
    }
    checkPresence.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        return (path, throwIfMissing) => caller
            .startPromiseCall(objPath, requestType.pack({
            path, throwIfMissing: (0, protobuf_msg_1.toOptVal)(throwIfMissing)
        }))
            .then(buf => protobuf_msg_1.boolValType.unpack(buf).value);
    }
    function makeFileCaller(caller, objPath) {
        return makeCaller(caller, (0, protobuf_msg_1.methodPathFor)(objPath, 'checkFilePresence'));
    }
    checkPresence.makeFileCaller = makeFileCaller;
    function makeFolderCaller(caller, objPath) {
        return makeCaller(caller, (0, protobuf_msg_1.methodPathFor)(objPath, 'checkFolderPresence'));
    }
    checkPresence.makeFolderCaller = makeFolderCaller;
    function makeLinkCaller(caller, objPath) {
        return makeCaller(caller, (0, protobuf_msg_1.methodPathFor)(objPath, 'checkLinkPresence'));
    }
    checkPresence.makeLinkCaller = makeLinkCaller;
})(checkPresence || (checkPresence = {}));
Object.freeze(checkPresence);
const reqWithPathType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.PathOnlyRequestBody);
var stat;
(function (stat) {
    function wrapService(fn) {
        return buf => {
            const { path } = reqWithPathType.unpack(buf);
            const promise = fn(path)
                .then(file_1.packStats);
            return { promise };
        };
    }
    stat.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'stat');
        return path => caller
            .startPromiseCall(ipcPath, reqWithPathType.pack({ path }))
            .then(file_1.unpackStats);
    }
    stat.makeCaller = makeCaller;
})(stat || (stat = {}));
Object.freeze(stat);
var getXAttr;
(function (getXAttr) {
    const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.GetXAttrRequestBody);
    function wrapService(fn) {
        return buf => {
            const { path, xaName } = requestType.unpack(buf);
            const promise = fn(path, xaName)
                .then(file_1.packXAttrValue);
            return { promise };
        };
    }
    getXAttr.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'getXAttr');
        return (path, xaName) => caller
            .startPromiseCall(ipcPath, requestType.pack({ path, xaName }))
            .then(file_1.unpackXAttrValue);
    }
    getXAttr.makeCaller = makeCaller;
})(getXAttr || (getXAttr = {}));
Object.freeze(getXAttr);
var listXAttrs;
(function (listXAttrs) {
    function wrapService(fn) {
        return buf => {
            const { path } = reqWithPathType.unpack(buf);
            const promise = fn(path)
                .then(lst => protobuf_msg_1.strArrValType.pack({ values: lst }));
            return { promise };
        };
    }
    listXAttrs.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'listXAttrs');
        return path => caller
            .startPromiseCall(ipcPath, reqWithPathType.pack({ path }))
            .then(buf => (0, protobuf_msg_1.fixArray)(protobuf_msg_1.strArrValType.unpack(buf).values));
    }
    listXAttrs.makeCaller = makeCaller;
})(listXAttrs || (listXAttrs = {}));
Object.freeze(listXAttrs);
const symLinkMsgType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.SymLink);
const symLinkTargetType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.SymLinkTargetReplyBody);
function exposeSymLink(link, expServices) {
    const exp = () => {
        if (link.isFile) {
            const promise = link.target()
                .then(f => {
                const file = (0, file_1.exposeFileService)(f, expServices);
                return symLinkTargetType.pack({ file });
            });
            return { promise };
        }
        else if (link.isFolder) {
            const promise = link.target()
                .then(f => {
                const fs = exposeFSService(f, expServices);
                return symLinkTargetType.pack({ fs });
            });
            return { promise };
        }
        else {
            (0, assert_1.assert)(false);
        }
    };
    const ref = expServices.exposeDroppableService('SymLinkImpl', exp, link);
    const msg = {
        readonly: link.readonly,
        isFile: (0, protobuf_msg_1.toOptVal)(link.isFile),
        isFolder: (0, protobuf_msg_1.toOptVal)(link.isFolder),
        impl: ref
    };
    return msg;
}
function makeSymLinkCaller(caller, linkMsg) {
    (0, connector_1.checkRefObjTypeIs)('SymLinkImpl', linkMsg.impl);
    const link = {
        readonly: linkMsg.readonly,
        target: () => caller
            .startPromiseCall(linkMsg.impl.path, undefined)
            .then(buf => {
            const { file, fs } = symLinkTargetType.unpack(buf);
            if (file) {
                return (0, file_1.makeFileCaller)(caller, file);
            }
            else if (fs) {
                return makeFSCaller(caller, fs);
            }
            else {
                throw new Error('Missing target info');
            }
        }),
        isFile: (0, protobuf_msg_1.valOfOpt)(linkMsg.isFile),
        isFolder: (0, protobuf_msg_1.valOfOpt)(linkMsg.isFolder)
    };
    return link;
}
var readLink;
(function (readLink) {
    function wrapService(fn, expServices) {
        return buf => {
            const { path } = reqWithPathType.unpack(buf);
            const promise = fn(path)
                .then(link => {
                const msg = exposeSymLink(link, expServices);
                return symLinkMsgType.pack(msg);
            });
            return { promise };
        };
    }
    readLink.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'readLink');
        return path => caller
            .startPromiseCall(ipcPath, reqWithPathType.pack({ path }))
            .then(buf => {
            const linkMsg = symLinkMsgType.unpack(buf);
            return makeSymLinkCaller(caller, linkMsg);
        });
    }
    readLink.makeCaller = makeCaller;
})(readLink || (readLink = {}));
Object.freeze(readLink);
function lsEntryToMsg(e) {
    return {
        name: e.name,
        isFile: (0, protobuf_msg_1.toOptVal)(e.isFile),
        isFolder: (0, protobuf_msg_1.toOptVal)(e.isFolder),
        isLink: (0, protobuf_msg_1.toOptVal)(e.isLink)
    };
}
function lsEntryFromMsg(m) {
    const name = m.name;
    if ((0, protobuf_msg_1.valOfOpt)(m.isFile)) {
        return { name, isFile: true };
    }
    else if ((0, protobuf_msg_1.valOfOpt)(m.isFolder)) {
        return { name, isFolder: true };
    }
    else if ((0, protobuf_msg_1.valOfOpt)(m.isLink)) {
        return { name, isLink: true };
    }
    else {
        throw (0, connector_1.makeIPCException)({
            badReply: true, message: `Missing fs entry type flag`
        });
    }
}
var watch;
(function (watch) {
    function wrapService(fn) {
        return buf => {
            const { path } = reqWithPathType.unpack(buf);
            const s = new rxjs_1.Subject();
            const obs = s.asObservable().pipe((0, operators_1.map)(file_1.packEvent));
            const onCancel = fn(path, s);
            return { obs, onCancel };
        };
    }
    watch.wrapService = wrapService;
    function makeCaller(caller, ipcPath) {
        return (path, obs) => {
            const s = new rxjs_1.Subject();
            const unsub = caller.startObservableCall(ipcPath, reqWithPathType.pack({ path }), s);
            s.asObservable()
                .pipe((0, operators_1.map)(file_1.unpackEvent))
                .subscribe((0, utils_for_observables_1.toRxObserver)(obs));
            return unsub;
        };
    }
    function makeFolderCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'watchFolder');
        return makeCaller(caller, ipcPath);
    }
    watch.makeFolderCaller = makeFolderCaller;
    function makeFileCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'watchFile');
        return makeCaller(caller, ipcPath);
    }
    watch.makeFileCaller = makeFileCaller;
})(watch || (watch = {}));
Object.freeze(watch);
var watchTree;
(function (watchTree) {
    const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.WatchTreeRequestBody);
    function wrapService(fn) {
        return buf => {
            const { path, depth } = requestType.unpack(buf);
            const s = new rxjs_1.Subject();
            const obs = s.asObservable().pipe((0, operators_1.map)(file_1.packEvent));
            const onCancel = fn(path, (0, protobuf_msg_1.valOfOpt)(depth), s);
            return { obs, onCancel };
        };
    }
    watchTree.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'watchTree');
        return (path, depth, obs) => {
            const s = new rxjs_1.Subject();
            const unsub = caller.startObservableCall(ipcPath, requestType.pack({ path, depth: (0, protobuf_msg_1.toOptVal)(depth) }), s);
            s.asObservable()
                .pipe((0, operators_1.map)(file_1.unpackEvent))
                .subscribe((0, utils_for_observables_1.toRxObserver)(obs));
            return unsub;
        };
    }
    watchTree.makeCaller = makeCaller;
})(watchTree || (watchTree = {}));
Object.freeze(watchTree);
var close;
(function (close) {
    function wrapService(fn) {
        return () => {
            const promise = fn();
            return { promise };
        };
    }
    close.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'close');
        return () => caller
            .startPromiseCall(path, undefined);
    }
    close.makeCaller = makeCaller;
})(close || (close = {}));
Object.freeze(close);
var readonlySubRoot;
(function (readonlySubRoot) {
    function wrapService(fn, expServices) {
        return buf => {
            const { path } = reqWithPathType.unpack(buf);
            const promise = fn(path)
                .then(fs => {
                const msg = exposeFSService(fs, expServices);
                return exports.fsMsgType.pack(msg);
            });
            return { promise };
        };
    }
    readonlySubRoot.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'readonlySubRoot');
        return path => caller
            .startPromiseCall(ipcPath, reqWithPathType.pack({ path }))
            .then(buf => {
            const fsMsg = exports.fsMsgType.unpack(buf);
            return makeFSCaller(caller, fsMsg);
        });
    }
    readonlySubRoot.makeCaller = makeCaller;
})(readonlySubRoot || (readonlySubRoot = {}));
Object.freeze(readonlySubRoot);
var listFolder;
(function (listFolder) {
    const replyType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.ListFolderReplyBody);
    function packFolderListing(lst) {
        return replyType.pack({ entries: lst.map(lsEntryToMsg) });
    }
    listFolder.packFolderListing = packFolderListing;
    function unpackFolderListing(buf) {
        return (0, protobuf_msg_1.fixArray)(replyType.unpack(buf).entries).map(lsEntryFromMsg);
    }
    listFolder.unpackFolderListing = unpackFolderListing;
    function wrapService(fn) {
        return buf => {
            const { path } = reqWithPathType.unpack(buf);
            const promise = fn(path)
                .then(packFolderListing);
            return { promise };
        };
    }
    listFolder.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'listFolder');
        return path => caller
            .startPromiseCall(ipcPath, reqWithPathType.pack({ path }))
            .then(unpackFolderListing);
    }
    listFolder.makeCaller = makeCaller;
})(listFolder || (listFolder = {}));
Object.freeze(listFolder);
var readJSONFile;
(function (readJSONFile) {
    function wrapService(fn) {
        return buf => {
            const { path } = reqWithPathType.unpack(buf);
            const promise = fn(path)
                .then(file_1.packJSON);
            return { promise };
        };
    }
    readJSONFile.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'readJSONFile');
        return path => caller
            .startPromiseCall(ipcPath, reqWithPathType.pack({ path }))
            .then(file_1.unpackJSON);
    }
    readJSONFile.makeCaller = makeCaller;
})(readJSONFile || (readJSONFile = {}));
Object.freeze(readJSONFile);
var readTxtFile;
(function (readTxtFile) {
    function wrapService(fn) {
        return buf => {
            const { path } = reqWithPathType.unpack(buf);
            const promise = fn(path)
                .then(txt => (0, protobuf_msg_1.encodeToUtf8)(txt));
            return { promise };
        };
    }
    readTxtFile.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'readTxtFile');
        return path => caller
            .startPromiseCall(ipcPath, reqWithPathType.pack({ path }))
            .then(buf => (buf ? (0, protobuf_msg_1.decodeFromUtf8)(buf) : ''));
    }
    readTxtFile.makeCaller = makeCaller;
})(readTxtFile || (readTxtFile = {}));
Object.freeze(readTxtFile);
var readBytes;
(function (readBytes) {
    const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.ReadBytesRequestBody);
    function wrapService(fn) {
        return buf => {
            const { path, start, end } = requestType.unpack(buf);
            const promise = fn(path, (0, protobuf_msg_1.valOfOptInt)(start), (0, protobuf_msg_1.valOfOptInt)(end))
                .then(file.readBytes.packReply);
            return { promise };
        };
    }
    readBytes.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'readBytes');
        return (path, start, end) => caller
            .startPromiseCall(ipcPath, requestType.pack({
            path, start: (0, protobuf_msg_1.toOptVal)(start), end: (0, protobuf_msg_1.toOptVal)(end)
        }))
            .then(file.readBytes.unpackReply);
    }
    readBytes.makeCaller = makeCaller;
})(readBytes || (readBytes = {}));
Object.freeze(readBytes);
var getByteSource;
(function (getByteSource) {
    function wrapService(fn, expServices) {
        return buf => {
            const { path } = reqWithPathType.unpack(buf);
            const promise = fn(path)
                .then(src => {
                const ref = (0, bytes_1.exposeSrcService)(src, expServices);
                return protobuf_msg_1.objRefType.pack(ref);
            });
            return { promise };
        };
    }
    getByteSource.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'getByteSource');
        return path => caller
            .startPromiseCall(ipcPath, reqWithPathType.pack({ path }))
            .then(buf => {
            const ref = protobuf_msg_1.objRefType.unpack(buf);
            return (0, bytes_1.makeSrcCaller)(caller, ref);
        });
    }
    getByteSource.makeCaller = makeCaller;
})(getByteSource || (getByteSource = {}));
Object.freeze(getByteSource);
var readonlyFile;
(function (readonlyFile) {
    function wrapService(fn, expServices) {
        return buf => {
            const { path } = reqWithPathType.unpack(buf);
            const promise = fn(path)
                .then(file => {
                const fileMsg = (0, file_1.exposeFileService)(file, expServices);
                return file_1.fileMsgType.pack(fileMsg);
            });
            return { promise };
        };
    }
    readonlyFile.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'readonlyFile');
        return path => caller
            .startPromiseCall(ipcPath, reqWithPathType.pack({ path }))
            .then(buf => {
            const fileMsg = file_1.fileMsgType.unpack(buf);
            return (0, file_1.makeFileCaller)(caller, fileMsg);
        });
    }
    readonlyFile.makeCaller = makeCaller;
})(readonlyFile || (readonlyFile = {}));
Object.freeze(readonlyFile);
var select;
(function (select) {
    const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.SelectRequestBody);
    function criteriaToMsg(sc) {
        const c = {
            action: sc.action,
            type: (Array.isArray(sc.type) ?
                sc.type : ((typeof sc.type === 'string') ? [sc.type] : [])),
            depth: (0, protobuf_msg_1.toOptVal)(sc.depth),
        };
        if (typeof sc.name === 'string') {
            c.pattern = (0, protobuf_msg_1.toVal)(sc.name);
        }
        else if (sc.name.type === 'pattern') {
            c.pattern = (0, protobuf_msg_1.toVal)(sc.name.p);
        }
        else if (sc.name.type === 'exact') {
            c.exactName = (0, protobuf_msg_1.toVal)(sc.name.p);
        }
        else if (sc.name.type === 'regexp') {
            c.regexp = (0, protobuf_msg_1.toVal)(sc.name.p);
        }
        return c;
    }
    function criteriaFromMsg(c) {
        let name;
        if (c.exactName) {
            name = { type: 'exact', p: (0, protobuf_msg_1.valOf)(c.exactName) };
        }
        else if (c.pattern) {
            name = { type: 'pattern', p: (0, protobuf_msg_1.valOf)(c.pattern) };
        }
        else if (c.regexp) {
            name = { type: 'regexp', p: (0, protobuf_msg_1.valOf)(c.regexp) };
        }
        else {
            throw (0, connector_1.makeIPCException)({ message: `Invalid name parameter in select criteria` });
        }
        const typeArr = (0, protobuf_msg_1.fixArray)(c.type);
        const sc = {
            action: c.action,
            name,
            depth: (0, protobuf_msg_1.valOfOptInt)(c.depth),
            type: ((typeArr.length > 0) ? typeArr : undefined)
        };
        return sc;
    }
    function wrapService(fn, expServices) {
        return buf => {
            const { path, criteria } = requestType.unpack(buf);
            const s = new rxjs_1.Subject();
            fn(path, criteriaFromMsg(criteria))
                .then(({ completion, items }) => {
                const ref = fsCollection.exposeCollectionService(items, expServices);
                s.next(protobuf_msg_1.objRefType.pack(ref));
                completion.then(() => s.complete(), err => s.error(err));
            }, err => s.error(err));
            return { obs: s.asObservable() };
        };
    }
    select.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'select');
        return async (path, criteria) => {
            const req = { path, criteria: criteriaToMsg(criteria) };
            const s = new rxjs_1.Subject();
            caller.startObservableCall(ipcPath, requestType.pack(req), s);
            const reply = (0, deferred_1.defer)();
            let completion = undefined;
            s.subscribe({
                next: buf => {
                    const ref = protobuf_msg_1.objRefType.unpack(buf);
                    const collection = fsCollection.makeCollectionCaller(ref, caller);
                    reply.resolve(collection);
                    completion = (0, deferred_1.defer)();
                },
                complete: () => {
                    if (completion) {
                        completion.resolve();
                    }
                    else {
                        reply.reject((0, connector_1.makeIPCException)({
                            message: `Early completion sent by core side`
                        }));
                    }
                },
                error: err => {
                    if (completion) {
                        completion.reject(err);
                    }
                    else {
                        reply.reject(err);
                    }
                }
            });
            const items = await reply.promise;
            return { items, completion: completion.promise };
        };
    }
    select.makeCaller = makeCaller;
})(select || (select = {}));
Object.freeze(select);
var fsCollection;
(function (fsCollection) {
    function exposeCollectionService(collection, expServices) {
        const exp = {
            get: get.wrapService(collection.get, expServices),
            getAll: getAll.wrapService(collection.getAll, expServices),
            entries: entries.wrapService(collection.entries, expServices),
            watch: watch.wrapService(collection.watch, expServices)
        };
        const ref = expServices.exposeDroppableService('FSCollection', exp, collection);
        return ref;
    }
    fsCollection.exposeCollectionService = exposeCollectionService;
    function makeCollectionCaller(ref, caller) {
        (0, connector_1.checkRefObjTypeIs)('FSCollection', ref);
        const objPath = ref.path;
        const collection = {
            get: get.makeCaller(caller, objPath),
            getAll: getAll.makeCaller(caller, objPath),
            entries: entries.makeCaller(caller, objPath),
            watch: watch.makeCaller(caller, objPath)
        };
        caller.registerClientDrop(collection, ref);
        return collection;
    }
    fsCollection.makeCollectionCaller = makeCollectionCaller;
    let get;
    (function (get) {
        const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.FSCGetRequestBody);
        const replyType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.FSCGetReplyBody);
        function wrapService(fn, expServices) {
            return buf => {
                const { name } = requestType.unpack(buf);
                const promise = fn(name)
                    .then(item => {
                    const reply = (item ?
                        { item: fsItem.exposeFSItem(expServices, item) } : {});
                    return replyType.pack(reply);
                });
                return { promise };
            };
        }
        get.wrapService = wrapService;
        function makeCaller(caller, objPath) {
            const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'get');
            return name => caller
                .startPromiseCall(ipcPath, requestType.pack({ name }))
                .then(buf => {
                const { item } = replyType.unpack(buf);
                return (item ? fsItem.fsItemFromMsg(caller, item) : undefined);
            });
        }
        get.makeCaller = makeCaller;
    })(get || (get = {}));
    Object.freeze(get);
    let getAll;
    (function (getAll) {
        const replyType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.FSCGetAllReplyBody);
        function wrapService(fn, expServices) {
            return buf => {
                const promise = fn()
                    .then(items => {
                    const reply = { items: [] };
                    for (const [name, item] of items) {
                        reply.items.push({
                            name, item: fsItem.exposeFSItem(expServices, item)
                        });
                    }
                    return replyType.pack(reply);
                });
                return { promise };
            };
        }
        getAll.wrapService = wrapService;
        function makeCaller(caller, objPath) {
            const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'getAll');
            return () => caller
                .startPromiseCall(ipcPath, undefined)
                .then(buf => {
                const items = (0, protobuf_msg_1.fixArray)(replyType.unpack(buf).items);
                const pairs = [];
                for (const { name, item } of items) {
                    pairs.push([name, fsItem.fsItemFromMsg(caller, item)]);
                }
                return pairs;
            });
        }
        getAll.makeCaller = makeCaller;
    })(getAll || (getAll = {}));
    Object.freeze(getAll);
    let entries;
    (function (entries) {
        function exposeIter(iter, expServices) {
            const exp = {
                next: wrapIterNext(iter.next, expServices)
            };
            const ref = expServices.exposeDroppableService('FSItemsIter', exp, iter);
            return ref;
        }
        function makeIterCaller(ref, caller) {
            (0, connector_1.checkRefObjTypeIs)('FSItemsIter', ref);
            const objPath = ref.path;
            const iter = {
                next: makeIterNextCaller(caller, objPath)
            };
            caller.registerClientDrop(iter, ref);
            return iter;
        }
        const iterResMsgType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.IterResMsg);
        function packIterRes(res, expServices) {
            let msg;
            if (res.done) {
                msg = { done: (0, protobuf_msg_1.toVal)(true) };
            }
            else {
                const itemRef = fsItem.exposeFSItem(expServices, res.value[1]);
                msg = { value: { name: res.value[0], item: itemRef } };
            }
            return iterResMsgType.pack(msg);
        }
        function unpackIterRes(buf, caller) {
            const msg = iterResMsgType.unpack(buf);
            if (msg.done) {
                return { done: true };
            }
            else {
                const v = msg.value;
                const item = fsItem.fsItemFromMsg(caller, v.item);
                return { value: [v.name, item] };
            }
        }
        function wrapIterNext(fn, expServices) {
            return () => {
                const promise = fn()
                    .then(res => packIterRes(res, expServices));
                return { promise };
            };
        }
        function makeIterNextCaller(caller, objPath) {
            const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'next');
            return () => caller
                .startPromiseCall(ipcPath, undefined)
                .then(buf => unpackIterRes(buf, caller));
        }
        function wrapService(fn, expServices) {
            return () => {
                const promise = fn()
                    .then(iter => {
                    const ref = exposeIter(iter, expServices);
                    return protobuf_msg_1.objRefType.pack(ref);
                });
                return { promise };
            };
        }
        entries.wrapService = wrapService;
        function makeCaller(caller, objPath) {
            const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'entries');
            return () => caller
                .startPromiseCall(ipcPath, undefined)
                .then(buf => {
                const ref = protobuf_msg_1.objRefType.unpack(buf);
                return makeIterCaller(ref, caller);
            });
        }
        entries.makeCaller = makeCaller;
    })(entries || (entries = {}));
    Object.freeze(entries);
    let watch;
    (function (watch) {
        const eventType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.CollectionEvent);
        function wrapService(fn, expServices) {
            return () => {
                const s = new rxjs_1.Subject();
                const obs = s.asObservable().pipe((0, operators_1.map)(event => packEvent(event, expServices)));
                const onCancel = fn(s);
                return { obs, onCancel };
            };
        }
        watch.wrapService = wrapService;
        function packEvent(event, expServices) {
            const msg = {
                type: event.type,
                path: (0, protobuf_msg_1.toOptVal)(event.path)
            };
            if (event.item) {
                msg.item = fsItem.exposeFSItem(expServices, event.item);
            }
            return eventType.pack(msg);
        }
        function unpackEvent(buf, caller) {
            const msg = eventType.unpack(buf);
            const event = {
                type: msg.type,
                path: (0, protobuf_msg_1.valOfOpt)(msg.path)
            };
            if (msg.item) {
                event.item = fsItem.fsItemFromMsg(caller, msg.item);
            }
            return event;
        }
        function makeCaller(caller, objPath) {
            const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'watch');
            return obs => {
                const s = new rxjs_1.Subject();
                const unsub = caller.startObservableCall(path, undefined, s);
                s.asObservable()
                    .pipe((0, operators_1.map)(buf => unpackEvent(buf, caller)))
                    .subscribe((0, utils_for_observables_1.toRxObserver)(obs));
                return unsub;
            };
        }
        watch.makeCaller = makeCaller;
    })(watch || (watch = {}));
    Object.freeze(watch);
})(fsCollection || (fsCollection = {}));
Object.freeze(fsCollection);
var fsItem;
(function (fsItem) {
    fsItem.msgType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.FSItem);
    function exposeFSItem(expServices, item) {
        const msg = {
            isLink: (0, protobuf_msg_1.toOptVal)(item.isLink)
        };
        if (item.isFile) {
            msg.isFile = (0, protobuf_msg_1.toVal)(true);
            if (item.item) {
                msg.item = {
                    file: (0, file_1.exposeFileService)(item.item, expServices)
                };
            }
        }
        else if (item.isFolder) {
            msg.isFolder = (0, protobuf_msg_1.toVal)(true);
            if (item.item) {
                msg.item = {
                    fs: exposeFSService(item.item, expServices)
                };
            }
        }
        else if (item.isCollection) {
            msg.isCollection = (0, protobuf_msg_1.toVal)(true);
            if (item.item) {
                msg.item = {
                    collection: fsCollection.exposeCollectionService(item.item, expServices)
                };
            }
        }
        else {
            throw new TypeError(`Missing type flag in FSItem`);
        }
        if (item.location) {
            msg.location = {
                path: item.location.path,
                storageType: item.location.storageType,
                storageUse: item.location.storageUse,
                fs: exposeFSService(item.location.fs, expServices)
            };
        }
        return msg;
    }
    fsItem.exposeFSItem = exposeFSItem;
    function fsItemFromMsg(caller, msg) {
        const item = {
            isLink: (0, protobuf_msg_1.valOfOpt)(msg.isLink)
        };
        if ((0, protobuf_msg_1.valOfOpt)(msg.isFile)) {
            item.isFile = true;
            if (msg.item) {
                item.item = (0, file_1.makeFileCaller)(caller, msg.item.file);
            }
        }
        else if ((0, protobuf_msg_1.valOfOpt)(msg.isFolder)) {
            item.isFolder = true;
            if (msg.item) {
                item.item = makeFSCaller(caller, msg.item.fs);
            }
        }
        else if ((0, protobuf_msg_1.valOfOpt)(msg.isCollection)) {
            item.isCollection = true;
            if (msg.item) {
                item.item = fsCollection.makeCollectionCaller(msg.item.collection, caller);
            }
        }
        else {
            throw new TypeError(`Missing type flag in FSItem`);
        }
        if (msg.location) {
            item.location = {
                path: msg.location.path,
                storageType: msg.location.storageType,
                storageUse: msg.location.storageUse,
                fs: makeFSCaller(caller, msg.location.fs)
            };
        }
        return item;
    }
    fsItem.fsItemFromMsg = fsItemFromMsg;
})(fsItem || (exports.fsItem = fsItem = {}));
Object.freeze(fsItem);
const reqWithPathAndFlagsType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.PathAndFlagsRequestBody);
function packRequestWithPathAndFlags(path, flags) {
    return reqWithPathAndFlagsType.pack({
        path,
        flags: file.versionedReadFlagsToMsg(flags)
    });
}
function unpackRequestWithPathAndFlags(buf) {
    const { path, flags } = reqWithPathAndFlagsType.unpack(buf);
    return {
        path,
        flags: file.versionedReadFlagsFromMsg(flags)
    };
}
var vStat;
(function (vStat) {
    function wrapService(fn) {
        return buf => {
            const { path, flags } = unpackRequestWithPathAndFlags(buf);
            const promise = fn(path, flags)
                .then(file.packStats);
            return { promise };
        };
    }
    vStat.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'stat');
        return (path, flags) => caller
            .startPromiseCall(ipcPath, packRequestWithPathAndFlags(path, flags))
            .then(file.unpackStats);
    }
    vStat.makeCaller = makeCaller;
})(vStat || (vStat = {}));
Object.freeze(vStat);
var vGetXAttr;
(function (vGetXAttr) {
    const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.VersionedGetXAttrRequestBody);
    function wrapService(fn) {
        return buf => {
            const { path, xaName, flags } = requestType.unpack(buf);
            const promise = fn(path, xaName, file.versionedReadFlagsFromMsg(flags))
                .then(attrAndVer => file.vGetXAttr.replyType.pack(attrAndVer));
            return { promise };
        };
    }
    vGetXAttr.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'getXAttr');
        return (path, xaName, flags) => caller
            .startPromiseCall(ipcPath, requestType.pack({
            path, xaName, flags: file.versionedReadFlagsToMsg(flags)
        }))
            .then(file.vGetXAttr.unpackReply);
    }
    vGetXAttr.makeCaller = makeCaller;
})(vGetXAttr || (vGetXAttr = {}));
Object.freeze(vGetXAttr);
var vListXAttrs;
(function (vListXAttrs) {
    function wrapService(fn) {
        return buf => {
            const { path, flags } = unpackRequestWithPathAndFlags(buf);
            const promise = fn(path, flags)
                .then(({ version, lst }) => file.vListXAttrs.replyType.pack({ version, xaNames: lst }));
            return { promise };
        };
    }
    vListXAttrs.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'listXAttrs');
        return (path, flags) => caller
            .startPromiseCall(ipcPath, packRequestWithPathAndFlags(path, flags))
            .then(buf => {
            const { version: v, xaNames } = file.vListXAttrs.replyType.unpack(buf);
            return { version: (0, protobuf_msg_1.fixInt)(v), lst: (xaNames ? xaNames : []) };
        });
    }
    vListXAttrs.makeCaller = makeCaller;
})(vListXAttrs || (vListXAttrs = {}));
Object.freeze(vListXAttrs);
var vListFolder;
(function (vListFolder) {
    const replyType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.VersionedListFolderReplyBody);
    function wrapService(fn) {
        return buf => {
            const { path, flags } = unpackRequestWithPathAndFlags(buf);
            const promise = fn(path, flags)
                .then(({ version, lst }) => replyType.pack({
                version, entries: lst.map(lsEntryToMsg)
            }));
            return { promise };
        };
    }
    vListFolder.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'listFolder');
        return (path, flags) => caller
            .startPromiseCall(ipcPath, packRequestWithPathAndFlags(path, flags))
            .then(buf => {
            const { version: v, entries } = replyType.unpack(buf);
            return {
                version: (0, protobuf_msg_1.fixInt)(v), lst: (0, protobuf_msg_1.fixArray)(entries.map(lsEntryFromMsg))
            };
        });
    }
    vListFolder.makeCaller = makeCaller;
})(vListFolder || (vListFolder = {}));
Object.freeze(vListFolder);
var vReadJSONFile;
(function (vReadJSONFile) {
    function wrapService(fn) {
        return buf => {
            const { path, flags } = unpackRequestWithPathAndFlags(buf);
            const promise = fn(path, flags)
                .then(({ version, json }) => {
                return file.vReadJSON.replyType.pack({ version, json: JSON.stringify(json) });
            });
            return { promise };
        };
    }
    vReadJSONFile.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'readJSONFile');
        return (path, flags) => caller
            .startPromiseCall(ipcPath, packRequestWithPathAndFlags(path, flags))
            .then(buf => {
            const { version: v, json } = file.vReadJSON.replyType.unpack(buf);
            return { version: (0, protobuf_msg_1.fixInt)(v), json: JSON.parse(json) };
        });
    }
    vReadJSONFile.makeCaller = makeCaller;
})(vReadJSONFile || (vReadJSONFile = {}));
Object.freeze(vReadJSONFile);
var vReadTxtFile;
(function (vReadTxtFile) {
    function wrapService(fn) {
        return buf => {
            const { path, flags } = unpackRequestWithPathAndFlags(buf);
            const promise = fn(path, flags)
                .then(verAndTxt => file.vReadTxt.replyType.pack(verAndTxt));
            return { promise };
        };
    }
    vReadTxtFile.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'readTxtFile');
        return (path, flags) => caller
            .startPromiseCall(ipcPath, packRequestWithPathAndFlags(path, flags))
            .then(buf => {
            const { version: v, txt } = file.vReadTxt.replyType.unpack(buf);
            return { version: (0, protobuf_msg_1.fixInt)(v), txt };
        });
    }
    vReadTxtFile.makeCaller = makeCaller;
})(vReadTxtFile || (vReadTxtFile = {}));
Object.freeze(vReadTxtFile);
var vReadBytes;
(function (vReadBytes) {
    const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.VersionedReadBytesRequestBody);
    function wrapService(fn) {
        return buf => {
            const { path, start, end, flags } = requestType.unpack(buf);
            const promise = fn(path, (0, protobuf_msg_1.valOfOptInt)(start), (0, protobuf_msg_1.valOfOptInt)(end), file.versionedReadFlagsFromMsg(flags))
                .then(file.vReadBytes.packReply);
            return { promise };
        };
    }
    vReadBytes.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'readBytes');
        return (path, start, end, flags) => caller
            .startPromiseCall(ipcPath, requestType.pack({
            path, start: (0, protobuf_msg_1.toOptVal)(start), end: (0, protobuf_msg_1.toOptVal)(end),
            flags: file.versionedReadFlagsToMsg(flags)
        }))
            .then(file.vReadBytes.unpackReply);
    }
    vReadBytes.makeCaller = makeCaller;
})(vReadBytes || (vReadBytes = {}));
Object.freeze(vReadBytes);
var vGetByteSource;
(function (vGetByteSource) {
    function wrapService(fn, expServices) {
        return buf => {
            const { path, flags } = unpackRequestWithPathAndFlags(buf);
            const promise = fn(path)
                .then(({ version, src }) => {
                const ref = (0, bytes_1.exposeSrcService)(src, expServices);
                return file.vGetByteSource.replyType.pack({ version, src: ref });
            });
            return { promise };
        };
    }
    vGetByteSource.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'getByteSource');
        return (path, flags) => caller
            .startPromiseCall(ipcPath, packRequestWithPathAndFlags(path, flags))
            .then(buf => {
            const { version: v, src } = file.vGetByteSource.replyType.unpack(buf);
            return { version: (0, protobuf_msg_1.fixInt)(v), src: (0, bytes_1.makeSrcCaller)(caller, src) };
        });
    }
    vGetByteSource.makeCaller = makeCaller;
})(vGetByteSource || (vGetByteSource = {}));
Object.freeze(vGetByteSource);
var updateXAttrs;
(function (updateXAttrs) {
    const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.UpdateXAttrsRequestBody);
    function unpackRequest(buf) {
        const { changes, path } = requestType.unpack(buf);
        return { path, changes: file.updateXAttrs.fromReqChanges(changes) };
    }
    updateXAttrs.unpackRequest = unpackRequest;
    function packRequest(path, changes) {
        return requestType.pack({ path, changes: file.updateXAttrs.toReqChanges(changes) });
    }
    updateXAttrs.packRequest = packRequest;
    function wrapService(fn) {
        return buf => {
            const { path, changes } = unpackRequest(buf);
            const promise = fn(path, changes);
            return { promise };
        };
    }
    updateXAttrs.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'updateXAttrs');
        return (path, changes) => caller
            .startPromiseCall(ipcPath, packRequest(path, changes));
    }
    updateXAttrs.makeCaller = makeCaller;
})(updateXAttrs || (updateXAttrs = {}));
Object.freeze(updateXAttrs);
var makeFolder;
(function (makeFolder) {
    const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.MakeFolderRequestBody);
    function wrapService(fn) {
        return buf => {
            const { path, exclusive } = requestType.unpack(buf);
            const promise = fn(path, (0, protobuf_msg_1.valOfOpt)(exclusive));
            return { promise };
        };
    }
    makeFolder.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'makeFolder');
        return (path, exclusive) => caller
            .startPromiseCall(ipcPath, requestType.pack({
            path, exclusive: (0, protobuf_msg_1.toOptVal)(exclusive)
        }));
    }
    makeFolder.makeCaller = makeCaller;
})(makeFolder || (makeFolder = {}));
Object.freeze(makeFolder);
var deleteFolder;
(function (deleteFolder) {
    const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.DeleteFolderRequestBody);
    function wrapService(fn) {
        return buf => {
            const { path, removeContent } = requestType.unpack(buf);
            const promise = fn(path, (0, protobuf_msg_1.valOfOpt)(removeContent));
            return { promise };
        };
    }
    deleteFolder.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'deleteFolder');
        return (path, removeContent) => caller
            .startPromiseCall(ipcPath, requestType.pack({
            path, removeContent: (0, protobuf_msg_1.toOptVal)(removeContent)
        }));
    }
    deleteFolder.makeCaller = makeCaller;
})(deleteFolder || (deleteFolder = {}));
Object.freeze(deleteFolder);
var deleteFile;
(function (deleteFile) {
    function wrapService(fn) {
        return buf => {
            const { path } = reqWithPathType.unpack(buf);
            const promise = fn(path);
            return { promise };
        };
    }
    deleteFile.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'deleteFile');
        return path => caller
            .startPromiseCall(ipcPath, reqWithPathType.pack({ path }));
    }
    deleteFile.makeCaller = makeCaller;
})(deleteFile || (deleteFile = {}));
Object.freeze(deleteFile);
var deleteLink;
(function (deleteLink) {
    function wrapService(fn) {
        return buf => {
            const { path } = reqWithPathType.unpack(buf);
            const promise = fn(path);
            return { promise };
        };
    }
    deleteLink.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'deleteLink');
        return path => caller
            .startPromiseCall(ipcPath, reqWithPathType.pack({ path }));
    }
    deleteLink.makeCaller = makeCaller;
})(deleteLink || (deleteLink = {}));
Object.freeze(deleteLink);
var move;
(function (move) {
    const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.MoveRequestBody);
    function wrapService(fn) {
        return buf => {
            const { src, dst } = requestType.unpack(buf);
            const promise = fn(src, dst);
            return { promise };
        };
    }
    move.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'move');
        return (src, dst) => caller
            .startPromiseCall(ipcPath, requestType.pack({ src, dst }));
    }
    move.makeCaller = makeCaller;
})(move || (move = {}));
Object.freeze(move);
var copyFile;
(function (copyFile) {
    const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.CopyFileRequestBody);
    function wrapService(fn) {
        return buf => {
            const { src, dst, overwrite } = requestType.unpack(buf);
            const promise = fn(src, dst, (0, protobuf_msg_1.valOfOpt)(overwrite));
            return { promise };
        };
    }
    copyFile.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'copyFile');
        return (src, dst, overwrite) => caller
            .startPromiseCall(ipcPath, requestType.pack({
            src, dst, overwrite: (0, protobuf_msg_1.toOptVal)(overwrite)
        }));
    }
    copyFile.makeCaller = makeCaller;
})(copyFile || (copyFile = {}));
Object.freeze(copyFile);
var copyFolder;
(function (copyFolder) {
    const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.CopyFolderRequestBody);
    function wrapService(fn) {
        return buf => {
            const { src, dst, mergeAndOverwrite } = requestType.unpack(buf);
            const promise = fn(src, dst, (0, protobuf_msg_1.valOfOpt)(mergeAndOverwrite));
            return { promise };
        };
    }
    copyFolder.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'copyFolder');
        return (src, dst, mergeAndOverwrite) => caller
            .startPromiseCall(ipcPath, requestType.pack({
            src, dst, mergeAndOverwrite: (0, protobuf_msg_1.toOptVal)(mergeAndOverwrite)
        }));
    }
    copyFolder.makeCaller = makeCaller;
})(copyFolder || (copyFolder = {}));
Object.freeze(copyFolder);
var saveFile;
(function (saveFile) {
    const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.SaveFileRequestBody);
    function wrapService(fn, expServices) {
        return buf => {
            const { dst, file, overwrite } = requestType.unpack(buf);
            const f = expServices.getOriginalObj(file);
            const promise = fn(f, dst, (0, protobuf_msg_1.valOfOpt)(overwrite));
            return { promise };
        };
    }
    saveFile.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'saveFile');
        return (f, dst, overwrite) => caller
            .startPromiseCall(ipcPath, requestType.pack({
            file: caller.srvRefOf(f), dst, overwrite: (0, protobuf_msg_1.toOptVal)(overwrite)
        }));
    }
    saveFile.makeCaller = makeCaller;
})(saveFile || (saveFile = {}));
Object.freeze(saveFile);
var saveFolder;
(function (saveFolder) {
    const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.SaveFolderRequestBody);
    function wrapService(fn, expServices) {
        return buf => {
            const { dst, folder: file, overwrite } = requestType.unpack(buf);
            const f = expServices.getOriginalObj(file);
            const promise = fn(f, dst, (0, protobuf_msg_1.valOfOpt)(overwrite));
            return { promise };
        };
    }
    saveFolder.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'saveFolder');
        return (f, dst, overwrite) => caller
            .startPromiseCall(ipcPath, requestType.pack({
            folder: caller.srvRefOf(f), dst, overwrite: (0, protobuf_msg_1.toOptVal)(overwrite)
        }));
    }
    saveFolder.makeCaller = makeCaller;
})(saveFolder || (saveFolder = {}));
Object.freeze(saveFolder);
var link;
(function (link) {
    const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.LinkRequestBody);
    function wrapService(fn, expServices) {
        return buf => {
            const { path, target } = requestType.unpack(buf);
            const f = expServices.getOriginalObj(target);
            const promise = fn(path, f);
            return { promise };
        };
    }
    link.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'link');
        return (path, f) => caller
            .startPromiseCall(ipcPath, requestType.pack({ path, target: caller.srvRefOf(f) }));
    }
    link.makeCaller = makeCaller;
})(link || (link = {}));
Object.freeze(link);
const pathAndFileOptsType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.PathAndOptFileFlags);
function packPathAndFlags(path, flags) {
    return pathAndFileOptsType.pack({ path, flags: optFlagsToMsg(flags) });
}
function unpackPathAndFlags(buf) {
    const { path, flags } = pathAndFileOptsType.unpack(buf);
    return { path, flags: optFlagsFromMsg(flags) };
}
function optFlagsToMsg(flags) {
    return (flags ? {
        create: (0, protobuf_msg_1.toOptVal)(flags.create),
        exclusive: (0, protobuf_msg_1.toOptVal)(flags.exclusive),
        truncate: (0, protobuf_msg_1.toOptVal)(flags.truncate)
    } : undefined);
}
function optFlagsFromMsg(m) {
    return (m ? {
        create: (0, protobuf_msg_1.valOfOpt)(m.create),
        exclusive: (0, protobuf_msg_1.valOfOpt)(m.exclusive),
        truncate: (0, protobuf_msg_1.valOfOpt)(m.truncate)
    } : undefined);
}
var writableSubRoot;
(function (writableSubRoot) {
    function wrapService(fn, expServices) {
        return buf => {
            const { path, flags } = unpackPathAndFlags(buf);
            const promise = fn(path, flags)
                .then(fs => {
                const fsMsg = exposeFSService(fs, expServices);
                return exports.fsMsgType.pack(fsMsg);
            });
            return { promise };
        };
    }
    writableSubRoot.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'writableSubRoot');
        return (path, flags) => caller
            .startPromiseCall(ipcPath, packPathAndFlags(path, flags))
            .then(buf => {
            const fsMsg = exports.fsMsgType.unpack(buf);
            return makeFSCaller(caller, fsMsg);
        });
    }
    writableSubRoot.makeCaller = makeCaller;
})(writableSubRoot || (writableSubRoot = {}));
Object.freeze(writableSubRoot);
var writableFile;
(function (writableFile) {
    function wrapService(fn, expServices) {
        return buf => {
            const { path, flags } = unpackPathAndFlags(buf);
            const promise = fn(path, flags)
                .then(file => {
                const fileMsg = (0, file_1.exposeFileService)(file, expServices);
                return file_1.fileMsgType.pack(fileMsg);
            });
            return { promise };
        };
    }
    writableFile.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'writableFile');
        return (path, flags) => caller
            .startPromiseCall(ipcPath, packPathAndFlags(path, flags))
            .then(buf => {
            const fileMsg = file_1.fileMsgType.unpack(buf);
            return (0, file_1.makeFileCaller)(caller, fileMsg);
        });
    }
    writableFile.makeCaller = makeCaller;
})(writableFile || (writableFile = {}));
Object.freeze(writableFile);
var writeJSONFile;
(function (writeJSONFile) {
    const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.WriteJsonFileRequestBody);
    function wrapService(fn) {
        return buf => {
            const { path, json, flags } = requestType.unpack(buf);
            const promise = fn(path, JSON.parse(json), optFlagsFromMsg(flags));
            return { promise };
        };
    }
    writeJSONFile.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'writeJSONFile');
        return (path, json, flags) => caller
            .startPromiseCall(ipcPath, requestType.pack({
            path, json: JSON.stringify(json), flags: optFlagsToMsg(flags)
        }));
    }
    writeJSONFile.makeCaller = makeCaller;
})(writeJSONFile || (writeJSONFile = {}));
Object.freeze(writeJSONFile);
var writeTxtFile;
(function (writeTxtFile) {
    const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.WriteTxtFileRequestBody);
    function wrapService(fn) {
        return buf => {
            const { path, txt, flags } = requestType.unpack(buf);
            const promise = fn(path, txt, optFlagsFromMsg(flags));
            return { promise };
        };
    }
    writeTxtFile.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'writeTxtFile');
        return (path, txt, flags) => caller
            .startPromiseCall(ipcPath, requestType.pack({
            path, txt, flags: optFlagsToMsg(flags)
        }));
    }
    writeTxtFile.makeCaller = makeCaller;
})(writeTxtFile || (writeTxtFile = {}));
Object.freeze(writeTxtFile);
var writeBytes;
(function (writeBytes) {
    const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.WriteBytesRequestBody);
    function wrapService(fn) {
        return buf => {
            const { path, bytes, flags } = requestType.unpack(buf);
            const promise = fn(path, bytes, optFlagsFromMsg(flags));
            return { promise };
        };
    }
    writeBytes.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'writeBytes');
        return (path, bytes, flags) => caller
            .startPromiseCall(ipcPath, requestType.pack({
            path, bytes: bytes, flags: optFlagsToMsg(flags)
        }));
    }
    writeBytes.makeCaller = makeCaller;
})(writeBytes || (writeBytes = {}));
Object.freeze(writeBytes);
var getByteSink;
(function (getByteSink) {
    function wrapService(fn, expServices) {
        return buf => {
            const { path, flags } = unpackPathAndFlags(buf);
            const promise = fn(path, flags)
                .then(sink => {
                const ref = (0, bytes_1.exposeSinkService)(sink, expServices);
                return protobuf_msg_1.objRefType.pack(ref);
            });
            return { promise };
        };
    }
    getByteSink.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'getByteSink');
        return (path, flags) => caller
            .startPromiseCall(ipcPath, packPathAndFlags(path, flags))
            .then(buf => {
            const ref = protobuf_msg_1.objRefType.unpack(buf);
            return (0, bytes_1.makeSinkCaller)(caller, ref);
        });
    }
    getByteSink.makeCaller = makeCaller;
})(getByteSink || (getByteSink = {}));
Object.freeze(getByteSink);
var vUpdateXAttrs;
(function (vUpdateXAttrs) {
    function wrapService(fn) {
        return buf => {
            const { path, changes } = updateXAttrs.unpackRequest(buf);
            const promise = fn(path, changes)
                .then(protobuf_msg_1.packInt);
            return { promise };
        };
    }
    vUpdateXAttrs.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'updateXAttrs');
        return (path, changes) => caller
            .startPromiseCall(ipcPath, updateXAttrs.packRequest(path, changes))
            .then(protobuf_msg_1.unpackInt);
    }
    vUpdateXAttrs.makeCaller = makeCaller;
})(vUpdateXAttrs || (vUpdateXAttrs = {}));
Object.freeze(vUpdateXAttrs);
function optVerFlagsToMsg(f) {
    if (!f) {
        return;
    }
    const m = optFlagsToMsg(f);
    m.currentVersion = (0, protobuf_msg_1.toOptVal)(f.currentVersion);
    return m;
}
function optVerFlagsFromMsg(m) {
    if (!m) {
        return;
    }
    const f = optFlagsFromMsg(m);
    f.currentVersion = (0, protobuf_msg_1.valOfOpt)(m.currentVersion);
    return f;
}
var vWriteJSONFile;
(function (vWriteJSONFile) {
    const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.VersionedWriteJsonFileRequestBody);
    function wrapService(fn) {
        return buf => {
            const { path, json, flags } = requestType.unpack(buf);
            const promise = fn(path, JSON.parse(json), optVerFlagsFromMsg(flags))
                .then(protobuf_msg_1.packInt);
            return { promise };
        };
    }
    vWriteJSONFile.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'writeJSONFile');
        return (path, json, flags) => caller
            .startPromiseCall(ipcPath, requestType.pack({
            path, json: JSON.stringify(json), flags: optVerFlagsToMsg(flags)
        }))
            .then(protobuf_msg_1.unpackInt);
    }
    vWriteJSONFile.makeCaller = makeCaller;
})(vWriteJSONFile || (vWriteJSONFile = {}));
Object.freeze(vWriteJSONFile);
var vWriteTxtFile;
(function (vWriteTxtFile) {
    const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.VersionedWriteTxtFileRequestBody);
    function wrapService(fn) {
        return buf => {
            const { path, txt, flags } = requestType.unpack(buf);
            const promise = fn(path, txt, optVerFlagsFromMsg(flags))
                .then(protobuf_msg_1.packInt);
            return { promise };
        };
    }
    vWriteTxtFile.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'writeTxtFile');
        return (path, txt, flags) => caller
            .startPromiseCall(ipcPath, requestType.pack({
            path, txt, flags: optVerFlagsToMsg(flags)
        }))
            .then(protobuf_msg_1.unpackInt);
    }
    vWriteTxtFile.makeCaller = makeCaller;
})(vWriteTxtFile || (vWriteTxtFile = {}));
Object.freeze(vWriteTxtFile);
var vWriteBytes;
(function (vWriteBytes) {
    const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.VersionedWriteBytesRequestBody);
    function wrapService(fn) {
        return buf => {
            const { path, bytes, flags } = requestType.unpack(buf);
            const promise = fn(path, bytes, optVerFlagsFromMsg(flags))
                .then(protobuf_msg_1.packInt);
            return { promise };
        };
    }
    vWriteBytes.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'writeBytes');
        return (path, bytes, flags) => caller
            .startPromiseCall(ipcPath, requestType.pack({
            path, bytes: bytes, flags: optVerFlagsToMsg(flags)
        }))
            .then(protobuf_msg_1.unpackInt);
    }
    vWriteBytes.makeCaller = makeCaller;
})(vWriteBytes || (vWriteBytes = {}));
Object.freeze(vWriteBytes);
var vGetByteSink;
(function (vGetByteSink) {
    const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.VersionedGetByteSinkRequestBody);
    function wrapService(fn, expServices) {
        return buf => {
            const { path, flags } = requestType.unpack(buf);
            const promise = fn(path, optVerFlagsFromMsg(flags))
                .then(({ version, sink }) => {
                const ref = (0, bytes_1.exposeSinkService)(sink, expServices);
                return file.vGetByteSink.replyType.pack({ version, sink: ref });
            });
            return { promise };
        };
    }
    vGetByteSink.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'getByteSink');
        return (path, flags) => caller
            .startPromiseCall(ipcPath, requestType.pack({
            path, flags: optVerFlagsToMsg(flags)
        }))
            .then(buf => {
            const { sink, version: v } = file.vGetByteSink.replyType.unpack(buf);
            return { version: (0, protobuf_msg_1.fixInt)(v), sink: (0, bytes_1.makeSinkCaller)(caller, sink) };
        });
    }
    vGetByteSink.makeCaller = makeCaller;
})(vGetByteSink || (vGetByteSink = {}));
Object.freeze(vGetByteSink);
var vsStatus;
(function (vsStatus) {
    const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.FSSyncStatusRequestBody);
    function wrapService(fn) {
        return buf => {
            const { path, skipServerCheck } = requestType.unpack(buf);
            const promise = fn(path, skipServerCheck)
                .then(file.packSyncStatus);
            return { promise };
        };
    }
    vsStatus.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'status');
        return (path, skipServerCheck) => caller
            .startPromiseCall(ipcPath, requestType.pack({ path, skipServerCheck: !!skipServerCheck }))
            .then(file.unpackSyncStatus);
    }
    vsStatus.makeCaller = makeCaller;
})(vsStatus || (vsStatus = {}));
Object.freeze(vsStatus);
var vsIsRemoteVersionOnDisk;
(function (vsIsRemoteVersionOnDisk) {
    const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.FSSyncIsOnDiskRequestBody);
    const replyType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.FSSyncIsOnDiskReplyBody);
    function wrapService(fn) {
        return buf => {
            const { path, version } = requestType.unpack(buf);
            const promise = fn(path, (0, protobuf_msg_1.fixInt)(version))
                .then(status => replyType.pack({ status }));
            return { promise };
        };
    }
    vsIsRemoteVersionOnDisk.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'isRemoteVersionOnDisk');
        return (path, version) => caller
            .startPromiseCall(ipcPath, requestType.pack({ path, version }))
            .then(buf => replyType.unpack(buf).status);
    }
    vsIsRemoteVersionOnDisk.makeCaller = makeCaller;
})(vsIsRemoteVersionOnDisk || (vsIsRemoteVersionOnDisk = {}));
Object.freeze(vsIsRemoteVersionOnDisk);
var vsDownload;
(function (vsDownload) {
    const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.FSSyncStartDownloadRequestBody);
    function wrapService(fn) {
        return buf => {
            const { path, version } = requestType.unpack(buf);
            const promise = fn(path, (0, protobuf_msg_1.fixInt)(version))
                .then(startedDownload => file.vsStartDownload.replyType.pack({ startedDownload }));
            return { promise };
        };
    }
    vsDownload.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'startDownload');
        return (path, version) => caller
            .startPromiseCall(ipcPath, requestType.pack({ path, version }))
            .then(buf => {
            const { startedDownload } = file.vsStartDownload.replyType.unpack(buf);
            if (startedDownload) {
                return {
                    downloadTaskId: (0, protobuf_msg_1.fixInt)(startedDownload.downloadTaskId)
                };
            }
        });
    }
    vsDownload.makeCaller = makeCaller;
})(vsDownload || (vsDownload = {}));
Object.freeze(vsDownload);
var vsStartUpload;
(function (vsStartUpload) {
    const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.FSSyncUploadRequestBody);
    const replyType = file.vsStartUpload.replyType;
    function wrapService(fn) {
        return buf => {
            const { path, opts } = requestType.unpack(buf);
            const promise = fn(path, file.optionsToUploadLocalFromMsg(opts))
                .then(startedUpload => replyType.pack({ startedUpload }));
            return { promise };
        };
    }
    vsStartUpload.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'startUpload');
        return (path, opts) => caller
            .startPromiseCall(ipcPath, requestType.pack({
            path, opts: file.optionsToUploadLocalToMsg(opts)
        }))
            .then(buf => {
            const { startedUpload } = replyType.unpack(buf);
            if (startedUpload) {
                const { uploadTaskId, uploadVersion } = startedUpload;
                return {
                    uploadVersion: (0, protobuf_msg_1.fixInt)(uploadVersion),
                    uploadTaskId: (0, protobuf_msg_1.fixInt)(uploadTaskId)
                };
            }
        });
    }
    vsStartUpload.makeCaller = makeCaller;
})(vsStartUpload || (vsStartUpload = {}));
Object.freeze(vsStartUpload);
var vsUpload;
(function (vsUpload) {
    const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.FSSyncUploadRequestBody);
    const replyType = file.vsUpload.replyType;
    function wrapService(fn) {
        return buf => {
            const { path, opts } = requestType.unpack(buf);
            const promise = fn(path, file.optionsToUploadLocalFromMsg(opts))
                .then(uploadedVersion => replyType.pack({
                uploadedVersion: (0, protobuf_msg_1.toOptVal)(uploadedVersion)
            }));
            return { promise };
        };
    }
    vsUpload.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'upload');
        return (path, opts) => caller
            .startPromiseCall(ipcPath, requestType.pack({
            path, opts: file.optionsToUploadLocalToMsg(opts)
        }))
            .then(buf => (0, protobuf_msg_1.valOfOptInt)(replyType.unpack(buf).uploadedVersion));
    }
    vsUpload.makeCaller = makeCaller;
})(vsUpload || (vsUpload = {}));
Object.freeze(vsUpload);
var vsAdoptRemoteFolderItem;
(function (vsAdoptRemoteFolderItem) {
    const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.AdoptRemoteFolderItemRequestBody);
    function optionsFromMsg(msg) {
        if (!msg) {
            return;
        }
        return {
            localVersion: (0, protobuf_msg_1.valOfOptInt)(msg.localVersion),
            remoteVersion: (0, protobuf_msg_1.valOfOptInt)(msg.remoteVersion),
            replaceLocalItem: (0, protobuf_msg_1.valOfOpt)(msg.replaceLocalItem),
            newItemName: (0, protobuf_msg_1.valOfOpt)(msg.newItemName)
        };
    }
    function optionsToMsg(opts) {
        if (!opts) {
            return;
        }
        return {
            localVersion: (0, protobuf_msg_1.toOptVal)(opts.localVersion),
            remoteVersion: (0, protobuf_msg_1.toOptVal)(opts.remoteVersion),
            replaceLocalItem: (0, protobuf_msg_1.toOptVal)(opts.replaceLocalItem),
            newItemName: (0, protobuf_msg_1.toOptVal)(opts.newItemName)
        };
    }
    function wrapService(fn) {
        return buf => {
            const { path, itemName, opts } = requestType.unpack(buf);
            const promise = fn(path, itemName, optionsFromMsg(opts))
                .then(protobuf_msg_1.packInt);
            return { promise };
        };
    }
    vsAdoptRemoteFolderItem.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'adoptRemoteFolderItem');
        return (path, itemName, opts) => caller
            .startPromiseCall(ipcPath, requestType.pack({
            path, itemName, opts: optionsToMsg(opts)
        }))
            .then(protobuf_msg_1.unpackInt);
    }
    vsAdoptRemoteFolderItem.makeCaller = makeCaller;
})(vsAdoptRemoteFolderItem || (vsAdoptRemoteFolderItem = {}));
Object.freeze(vsAdoptRemoteFolderItem);
var vsAbsorbRemoteFolderChanges;
(function (vsAbsorbRemoteFolderChanges) {
    const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.AbsorbRemoteFolderChangesRequestBody);
    function optionsFromMsg(msg) {
        if (!msg) {
            return;
        }
        return {
            localVersion: (0, protobuf_msg_1.valOfOptInt)(msg.localVersion),
            remoteVersion: (0, protobuf_msg_1.valOfOptInt)(msg.remoteVersion),
            postfixForNameOverlaps: (0, protobuf_msg_1.valOfOpt)(msg.postfixForNameOverlaps),
        };
    }
    function optionsToMsg(opts) {
        if (!opts) {
            return;
        }
        return {
            localVersion: (0, protobuf_msg_1.toOptVal)(opts.localVersion),
            remoteVersion: (0, protobuf_msg_1.toOptVal)(opts.remoteVersion),
            postfixForNameOverlaps: (0, protobuf_msg_1.toOptVal)(opts.postfixForNameOverlaps),
        };
    }
    const replyType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.AbsorbRemoteFolderChangesReplyBody);
    function wrapService(fn) {
        return buf => {
            const { path, opts } = requestType.unpack(buf);
            const promise = fn(path, optionsFromMsg(opts))
                .then(newVersion => replyType.pack({ newVersion: (0, protobuf_msg_1.toOptVal)(newVersion) }));
            return { promise };
        };
    }
    vsAbsorbRemoteFolderChanges.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'absorbRemoteFolderChanges');
        return (path, opts) => caller
            .startPromiseCall(ipcPath, requestType.pack({ path, opts: optionsToMsg(opts) }))
            .then(buf => (0, protobuf_msg_1.valOfOptInt)(replyType.unpack(buf).newVersion));
    }
    vsAbsorbRemoteFolderChanges.makeCaller = makeCaller;
})(vsAbsorbRemoteFolderChanges || (vsAbsorbRemoteFolderChanges = {}));
Object.freeze(vsAbsorbRemoteFolderChanges);
var vsAdoptRemote;
(function (vsAdoptRemote) {
    const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.AdoptRemoteRequestBody);
    function wrapService(fn) {
        return buf => {
            const { path, opts } = requestType.unpack(buf);
            const promise = fn(path, file.remoteAdoptionOptsFromMsg(opts));
            return { promise };
        };
    }
    vsAdoptRemote.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'adoptRemote');
        return (path, opts) => caller
            .startPromiseCall(ipcPath, requestType.pack({
            path, opts: file.remoteAdoptionOptsToMsg(opts)
        }));
    }
    vsAdoptRemote.makeCaller = makeCaller;
})(vsAdoptRemote || (vsAdoptRemote = {}));
Object.freeze(vsAdoptRemote);
const remoteChildReqType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.RemoteChildRequestBody);
;
var vsStatRemoteItem;
(function (vsStatRemoteItem) {
    function wrapService(fn) {
        return buf => {
            const { path, remoteItemName, remoteVersion } = remoteChildReqType.unpack(buf);
            const promise = fn(path, remoteItemName, (0, protobuf_msg_1.valOfOptInt)(remoteVersion))
                .then(file.packStats);
            return { promise };
        };
    }
    vsStatRemoteItem.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'statRemoteItem');
        return (path, remoteItemName, remoteVersion) => caller
            .startPromiseCall(ipcPath, remoteChildReqType.pack({
            path, remoteItemName, remoteVersion: (0, protobuf_msg_1.toOptVal)(remoteVersion)
        }))
            .then(file.unpackStats);
    }
    vsStatRemoteItem.makeCaller = makeCaller;
})(vsStatRemoteItem || (vsStatRemoteItem = {}));
Object.freeze(vsStatRemoteItem);
var vsListRemoteFolderItem;
(function (vsListRemoteFolderItem) {
    function wrapService(fn) {
        return buf => {
            const { path, remoteItemName, remoteVersion } = remoteChildReqType.unpack(buf);
            const promise = fn(path, remoteItemName, (0, protobuf_msg_1.valOfOptInt)(remoteVersion))
                .then(listFolder.packFolderListing);
            return { promise };
        };
    }
    vsListRemoteFolderItem.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'listRemoteFolderItem');
        return (path, remoteItemName, remoteVersion) => caller
            .startPromiseCall(ipcPath, remoteChildReqType.pack({
            path, remoteItemName, remoteVersion: (0, protobuf_msg_1.toOptVal)(remoteVersion)
        }))
            .then(listFolder.unpackFolderListing);
    }
    vsListRemoteFolderItem.makeCaller = makeCaller;
})(vsListRemoteFolderItem || (vsListRemoteFolderItem = {}));
Object.freeze(vsListRemoteFolderItem);
var vsGetRemoteFileItem;
(function (vsGetRemoteFileItem) {
    function wrapService(fn, expServices) {
        return buf => {
            const { path, remoteItemName, remoteVersion } = remoteChildReqType.unpack(buf);
            const promise = fn(path, remoteItemName, (0, protobuf_msg_1.valOfOptInt)(remoteVersion))
                .then(file => {
                const fileMsg = (0, file_1.exposeFileService)(file, expServices);
                return file_1.fileMsgType.pack(fileMsg);
            });
            return { promise };
        };
    }
    vsGetRemoteFileItem.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'getRemoteFileItem');
        return (path, remoteItemName, remoteVersion) => caller
            .startPromiseCall(ipcPath, remoteChildReqType.pack({
            path, remoteItemName, remoteVersion: (0, protobuf_msg_1.toOptVal)(remoteVersion)
        }))
            .then(buf => {
            const fileMsg = file_1.fileMsgType.unpack(buf);
            return (0, file_1.makeFileCaller)(caller, fileMsg);
        });
    }
    vsGetRemoteFileItem.makeCaller = makeCaller;
})(vsGetRemoteFileItem || (vsGetRemoteFileItem = {}));
Object.freeze(vsGetRemoteFileItem);
var vsGetRemoteFolderItem;
(function (vsGetRemoteFolderItem) {
    function wrapService(fn, expServices) {
        return buf => {
            const { path, remoteItemName, remoteVersion } = remoteChildReqType.unpack(buf);
            const promise = fn(path, remoteItemName, (0, protobuf_msg_1.valOfOptInt)(remoteVersion))
                .then(fs => {
                const fsMsg = exposeFSService(fs, expServices);
                return exports.fsMsgType.pack(fsMsg);
            });
            return { promise };
        };
    }
    vsGetRemoteFolderItem.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'getRemoteFolderItem');
        return (path, remoteItemName, remoteVersion) => caller
            .startPromiseCall(ipcPath, remoteChildReqType.pack({
            path, remoteItemName, remoteVersion: (0, protobuf_msg_1.toOptVal)(remoteVersion)
        }))
            .then(buf => {
            const fsMsg = exports.fsMsgType.unpack(buf);
            return makeFSCaller(caller, fsMsg);
        });
    }
    vsGetRemoteFolderItem.makeCaller = makeCaller;
})(vsGetRemoteFolderItem || (vsGetRemoteFolderItem = {}));
Object.freeze(vsGetRemoteFolderItem);
var vListVersions;
(function (vListVersions) {
    function wrapService(fn) {
        return buf => {
            const { path } = reqWithPathType.unpack(buf);
            const promise = fn(path)
                .then(file.vListVersions.packReply);
            return { promise };
        };
    }
    vListVersions.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'listVersions');
        return path => caller
            .startPromiseCall(ipcPath, reqWithPathType.pack({ path }))
            .then(file.vListVersions.unpackReply);
    }
    vListVersions.makeCaller = makeCaller;
})(vListVersions || (vListVersions = {}));
Object.freeze(vListVersions);
var vArchiveCurrent;
(function (vArchiveCurrent) {
    const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.ArchiveCurrentRequestBody);
    function wrapService(fn) {
        return buf => {
            const { path, version } = requestType.unpack(buf);
            const promise = fn(path, (0, protobuf_msg_1.valOfOptInt)(version))
                .then(protobuf_msg_1.packInt);
            return { promise };
        };
    }
    vArchiveCurrent.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'archiveCurrent');
        return (path, version) => caller
            .startPromiseCall(ipcPath, requestType.pack({ path, version: (0, protobuf_msg_1.toOptVal)(version) }))
            .then(protobuf_msg_1.unpackInt);
    }
    vArchiveCurrent.makeCaller = makeCaller;
})(vArchiveCurrent || (vArchiveCurrent = {}));
Object.freeze(vArchiveCurrent);
var vsDiffCurrentAndRemoteFileVersions;
(function (vsDiffCurrentAndRemoteFileVersions) {
    const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.DiffCurrentAndRemoteFileVersionsRequestBody);
    const replyType = file.vsDiffCurrentAndRemoteVersions.replyType;
    function wrapService(fn) {
        return buf => {
            const { path, opts } = requestType.unpack(buf);
            const promise = fn(path, file.vsDiffCurrentAndRemoteVersions.optsFromMsg(opts))
                .then(diff => replyType.pack({ diff: file.fileDiffToMsg(diff) }));
            return { promise };
        };
    }
    vsDiffCurrentAndRemoteFileVersions.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'diffCurrentAndRemoteFileVersions');
        return (path, opts) => caller
            .startPromiseCall(ipcPath, requestType.pack({
            path, opts: file.vsDiffCurrentAndRemoteVersions.optsToMsg(opts)
        }))
            .then(buf => file.fileDiffFromMsg(replyType.unpack(buf).diff));
    }
    vsDiffCurrentAndRemoteFileVersions.makeCaller = makeCaller;
})(vsDiffCurrentAndRemoteFileVersions || (vsDiffCurrentAndRemoteFileVersions = {}));
Object.freeze(vsDiffCurrentAndRemoteFileVersions);
function folderDiffToMsg(diff) {
    if (!diff) {
        return;
    }
    return {
        ...file.commonDiffToMsg(diff),
        added: diff.added,
        removed: diff.removed,
        renamed: (diff.renamed && (diff.renamed.length > 0) ?
            diff.renamed.map(({ local, remote, renamedIn }) => ({ local, remote, renamedIn })) : undefined),
        rekeyed: (diff.rekeyed && (diff.rekeyed.length > 0) ?
            diff.rekeyed.map(({ local, remote, rekeyedIn }) => ({ local, remote, rekeyedIn })) : undefined),
        nameOverlaps: (diff.nameOverlaps && (diff.nameOverlaps.length > 0) ? diff.nameOverlaps.concat() : undefined)
    };
}
function folderDiffFromMsg(msg) {
    if (!msg) {
        return;
    }
    return {
        ...file.commonDiffFromMsg(msg),
        added: reduceEmptyIn(msg.added),
        removed: reduceEmptyIn(msg.removed),
        renamed: reduceEmptyArr(msg.renamed),
        rekeyed: reduceEmptyArr(msg.rekeyed),
        nameOverlaps: reduceEmptyArr(msg.nameOverlaps),
    };
}
function reduceEmptyIn(c) {
    if (!c) {
        return;
    }
    if (c.inLocal && (c.inLocal.length > 0)) {
        if (c.inRemote && (c.inRemote.length > 0)) {
            return c;
        }
        else {
            return { inLocal: c.inLocal };
        }
    }
    else {
        if (c.inRemote && (c.inRemote.length > 0)) {
            return { inRemote: c.inRemote };
        }
        else {
            return;
        }
    }
}
function reduceEmptyArr(arr) {
    return (arr && (arr.length > 0) ? arr : undefined);
}
var vsDiffCurrentAndRemoteFolderVersions;
(function (vsDiffCurrentAndRemoteFolderVersions) {
    const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.DiffCurrentAndRemoteFolderVersionsRequestBody);
    const replyType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.DiffCurrentAndRemoteReplyBody);
    function wrapService(fn) {
        return buf => {
            const { path, remoteVersion } = requestType.unpack(buf);
            const promise = fn(path, (0, protobuf_msg_1.valOfOptInt)(remoteVersion))
                .then(diff => replyType.pack({ diff: folderDiffToMsg(diff) }));
            return { promise };
        };
    }
    vsDiffCurrentAndRemoteFolderVersions.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'diffCurrentAndRemoteFolderVersions');
        return (path, remoteVersion) => caller
            .startPromiseCall(ipcPath, requestType.pack({
            path, remoteVersion: (0, protobuf_msg_1.toOptVal)(remoteVersion)
        }))
            .then(buf => folderDiffFromMsg(replyType.unpack(buf).diff));
    }
    vsDiffCurrentAndRemoteFolderVersions.makeCaller = makeCaller;
})(vsDiffCurrentAndRemoteFolderVersions || (vsDiffCurrentAndRemoteFolderVersions = {}));
Object.freeze(vsDiffCurrentAndRemoteFolderVersions);
Object.freeze(exports);

},{"../ipc-via-protobuf/connector":60,"../ipc-via-protobuf/protobuf-msg":61,"../lib-client/protobuf-type":63,"../lib-common/assert":64,"../lib-common/processes/deferred":69,"../lib-common/utils-for-observables":70,"../protos/fs.proto":75,"./bytes":43,"./file":45,"rxjs":95,"rxjs/operators":320}],47:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2021 - 2022, 2024 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.exposeCAPs = exposeCAPs;
exports.makeClientSide = makeClientSide;
exports.promiseClientSide = promiseClientSide;
const connector_1 = require("../ipc-via-protobuf/connector");
const assert_1 = require("../lib-common/assert");
function exposeCAPs(coreSide, w3n, mainCAPs, extraCAPs) {
    const expW3N = {};
    addCAPsInExposure(expW3N, coreSide, w3n, mainCAPs);
    if (extraCAPs) {
        addCAPsInExposure(expW3N, coreSide, w3n, extraCAPs);
    }
    coreSide.exposedServices.exposeW3NService(expW3N);
}
function addCAPsInExposure(expW3N, { exposedServices, caller: callerToClient }, w3n, capExposures) {
    for (const capName in capExposures) {
        const expose = capExposures[capName];
        (0, assert_1.assert)(typeof expose === 'function');
        (0, assert_1.assert)(!expW3N[capName], `Capability ${capName} is already exposed, and we specifically have no shadowing.`);
        const cap = w3n[capName];
        if (cap) {
            expW3N[capName] = expose(cap, exposedServices, callerToClient);
        }
    }
}
function makeClientSide({ caller, exposedServices }, mainCAPs, extraCAPs) {
    (0, assert_1.assert)(!!caller.listObj);
    const objPath = [connector_1.W3N_NAME];
    const lstOfCAPs = caller.listObj(objPath);
    const w3n = {};
    for (const cap of lstOfCAPs) {
        const capObjPath = objPath.concat(cap);
        if (mainCAPs[cap]) {
            const makeCap = mainCAPs[cap];
            (0, assert_1.assert)(typeof makeCap === 'function');
            w3n[cap] = makeCap(caller, capObjPath, exposedServices);
        }
        else if (extraCAPs) {
            const makeCap = extraCAPs[cap];
            (0, assert_1.assert)(typeof makeCap === 'function');
            w3n[cap] = makeCap(caller, capObjPath, exposedServices);
        }
    }
    return w3n;
}
async function promiseClientSide({ caller, exposedServices }, mainCAPs, extraCAPs) {
    (0, assert_1.assert)(!!caller.listObjAsync);
    const objPath = [connector_1.W3N_NAME];
    const lstOfCAPs = (await caller.listObjAsync(objPath));
    const w3n = {};
    for (const cap of lstOfCAPs) {
        const capObjPath = objPath.concat(cap);
        if (mainCAPs[cap]) {
            const makeCap = mainCAPs[cap];
            (0, assert_1.assert)(typeof makeCap === 'function');
            w3n[cap] = await makeCap(caller, capObjPath, exposedServices);
        }
        else if (extraCAPs) {
            const makeCap = extraCAPs[cap];
            (0, assert_1.assert)(typeof makeCap === 'function');
            w3n[cap] = await makeCap(caller, capObjPath, exposedServices);
        }
    }
    return w3n;
}
Object.freeze(exports);

},{"../ipc-via-protobuf/connector":60,"../lib-common/assert":64}],48:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2022 - 2025 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.makeReqRepFuncCaller = makeReqRepFuncCaller;
exports.makeReqRepObjCaller = makeReqRepObjCaller;
exports.makeObservableFuncCaller = makeObservableFuncCaller;
const rxjs_1 = require("rxjs");
const json_n_binary_1 = require("./json-n-binary");
function replyFromPassedDatum(bytes, transforms) {
    if (!bytes) {
        return;
    }
    if (transforms === null || transforms === void 0 ? void 0 : transforms.unpackReply) {
        if (transforms.unpackReply === 'noop') {
            return [bytes];
        }
        else {
            return transforms.unpackReply(bytes);
        }
    }
    else {
        return (bytes ? (0, json_n_binary_1.deserializeArgs)(bytes, transforms === null || transforms === void 0 ? void 0 : transforms.findReferencedObj)[0] : undefined);
    }
}
function argsToPassedDatum(args, transforms) {
    if (args === undefined) {
        return;
    }
    if (transforms === null || transforms === void 0 ? void 0 : transforms.packRequest) {
        if (transforms.packRequest === 'noop') {
            if (!ArrayBuffer.isView(args[0])) {
                throw new Error(`Method returned non-binary, while no serialization is set`);
            }
            return args[0];
        }
        return transforms.packRequest(args);
    }
    else {
        return (0, json_n_binary_1.serializeArgs)(args, transforms === null || transforms === void 0 ? void 0 : transforms.findRefOf);
    }
}
function makeReqRepFuncCaller(clientSide, path, transforms) {
    return (async (...args) => {
        const bytes = argsToPassedDatum(args, transforms);
        const reply = await clientSide.startPromiseCall(path, bytes);
        return replyFromPassedDatum(reply, transforms);
    });
}
function makeReqRepObjCaller(clientSide, objPath, method, transforms) {
    return makeReqRepFuncCaller(clientSide, objPath.concat(method), transforms);
}
function makeObservableFuncCaller(clientSide, path, transforms) {
    return (obs, ...args) => {
        const bytes = argsToPassedDatum(args, transforms);
        const s = new rxjs_1.Subject();
        const unsub = clientSide.startObservableCall(path, bytes, s);
        s.subscribe({
            next: data => {
                if (!obs.next) {
                    return;
                }
                const ev = replyFromPassedDatum(data, transforms);
                obs.next(ev);
            },
            complete: () => { var _a; return (_a = obs.complete) === null || _a === void 0 ? void 0 : _a.call(obs); },
            error: err => { var _a; return (_a = obs.error) === null || _a === void 0 ? void 0 : _a.call(obs, err); }
        });
        return unsub;
    };
}

},{"./json-n-binary":49,"rxjs":95}],49:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2022 - 2023, 2025 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.serializeArgs = serializeArgs;
exports.deserializeArgs = deserializeArgs;
const protobuf_type_1 = require("../../lib-client/protobuf-type");
const json_utils_1 = require("../../lib-common/json-utils");
const json_ipc_proto_1 = require("../../protos/json-ipc.proto");
const valuesType = protobuf_type_1.ProtoType.for(json_ipc_proto_1.json_ipc.ValuesSequence);
function serializeArgs(args, findRefOf) {
    const seq = argsToValuesSequence(args, findRefOf);
    return valuesType.pack(seq);
}
function argsToValuesSequence(args, findRefOf) {
    const seq = { values: [] };
    for (const arg of args) {
        if (arg && (typeof arg === 'object')) {
            if (ArrayBuffer.isView(arg)) {
                seq.values.push({
                    arr: { arr: arg, objLocation: [] }
                });
            }
            else if (arg._isObjectFromCore) {
                if (!findRefOf) {
                    throw new Error(`Function to find reference for object from core is not given`);
                }
                const objRef = findRefOf(arg);
                if (!objRef) {
                    throw new Error(`Reference for object from core wasn't found`);
                }
                seq.values.push({
                    transferred: { objLocation: [], objRef }
                });
            }
            else {
                seq.values.push(turnToJsonExtractingBinaryAndTransferable(arg, findRefOf));
            }
        }
        else {
            seq.values.push({
                json: JSON.stringify(arg)
            });
        }
    }
    return seq;
}
function turnToJsonExtractingBinaryAndTransferable(arg, findRefOf) {
    const parts = extractNonJsonableFrom(arg, findRefOf);
    if (parts) {
        const { copy, binaryInJson, transferredInJson } = parts;
        return {
            json: JSON.stringify(copy),
            binaryInJson: ((binaryInJson.length > 0) ? binaryInJson : undefined),
            transferredInJson: ((transferredInJson.length > 0) ?
                transferredInJson : undefined)
        };
    }
    else {
        return { json: JSON.stringify(arg) };
    }
}
function extractNonJsonableFrom(arg, findRefOf) {
    const nonJsonLocations = findAllNonJsonable(arg);
    if (!nonJsonLocations) {
        return;
    }
    const copy = (0, json_utils_1.copy)(arg);
    const binaryInJson = [];
    const transferredInJson = [];
    for (const objLocation of nonJsonLocations) {
        const nonJson = getValueAtObjLocation(arg, objLocation);
        setNewValueAtObjLocation(copy, objLocation, null);
        if (nonJson._isObjectFromCore) {
            if (!findRefOf) {
                throw new Error(`Function to find reference for object from core is not given`);
            }
            const objRef = findRefOf(arg);
            if (!objRef) {
                throw new Error(`Reference for object from core wasn't found`);
            }
            transferredInJson.push({ objLocation, objRef });
        }
        else {
            binaryInJson.push({ arr: nonJson, objLocation });
        }
    }
    return { copy, binaryInJson, transferredInJson };
}
function findAllNonJsonable(o) {
    const foundObjLocations = [];
    if (ArrayBuffer.isView(o)
        || o._isObjectFromCore) {
        return [[]];
    }
    if (Array.isArray(o)) {
        for (let i = 0; i < o.length; i += 1) {
            const child = o[i];
            if (child && (typeof child === 'object')) {
                const inChild = findAllNonJsonable(child);
                if (inChild) {
                    for (const objLocation of inChild) {
                        foundObjLocations.push([`${i}`, ...objLocation]);
                    }
                }
            }
        }
    }
    else {
        for (const [field, child] of Object.entries(o)) {
            if (child && (typeof child === 'object')) {
                const inChild = findAllNonJsonable(child);
                if (inChild) {
                    for (const objLocation of inChild) {
                        foundObjLocations.push([field, ...objLocation]);
                    }
                }
            }
        }
    }
    return ((foundObjLocations.length > 0) ? foundObjLocations : undefined);
}
function getValueAtObjLocation(o, objLocation) {
    const value = o[objLocation[0]];
    if (objLocation.length > 1) {
        return getValueAtObjLocation(value, objLocation.slice(1));
    }
    else {
        return value;
    }
}
function setNewValueAtObjLocation(o, objLocation, newValue) {
    const value = o[objLocation[0]];
    if (objLocation.length > 1) {
        setNewValueAtObjLocation(value, objLocation.slice(1), newValue);
    }
    else {
        o[objLocation[0]] = newValue;
    }
}
function deserializeArgs(bytes, findReferencedObj) {
    const values = valuesType.unpack(bytes);
    const args = [];
    for (const val of values.values) {
        const { json, binaryInJson, transferredInJson, arr, transferred } = val;
        if (arr) {
            args.push(arr.arr);
        }
        else if (transferred) {
            if (!findReferencedObj) {
                throw new Error(`Function to find referenced object is not given`);
            }
            args.push(findReferencedObj(transferred.objRef));
        }
        else if ((typeof json === 'string') && (json.length > 0)) {
            const arg = JSON.parse(json);
            if (binaryInJson) {
                attachBinaryArrays(arg, binaryInJson);
            }
            if (Array.isArray(transferredInJson) && (transferredInJson.length > 0)) {
                if (!findReferencedObj) {
                    throw new Error(`Function to find referenced object is not given`);
                }
                attachTransferred(arg, transferredInJson, findReferencedObj);
            }
            args.push(arg);
        }
        else {
            args.push(undefined);
        }
    }
    return args;
}
function attachBinaryArrays(arg, binaryInJson) {
    for (const { arr, objLocation } of binaryInJson) {
        setNewValueAtObjLocation(arg, objLocation, arr);
    }
}
function attachTransferred(arg, transferredInJson, findReferencedObj) {
    for (const { objRef, objLocation } of transferredInJson) {
        setNewValueAtObjLocation(arg, objLocation, findReferencedObj(objRef));
    }
}

},{"../../lib-client/protobuf-type":63,"../../lib-common/json-utils":68,"../../protos/json-ipc.proto":77}],50:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2022 - 2025 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.wrapReqReplySrvMethod = wrapReqReplySrvMethod;
exports.wrapReqReplyFunc = wrapReqReplyFunc;
exports.wrapObservingFunc = wrapObservingFunc;
const rxjs_1 = require("rxjs");
const json_n_binary_1 = require("./json-n-binary");
function wrapReqReplySrvMethod(srv, method, transforms) {
    return wrapReqReplyFunc(srv, srv[method], transforms);
}
function wrapReqReplyFunc(srvOrFn, funcOrTransforms, transforms) {
    let srv;
    let func;
    if (typeof srvOrFn === 'function') {
        srv = undefined;
        func = srvOrFn;
        transforms = funcOrTransforms;
    }
    else {
        srv = srvOrFn;
        func = funcOrTransforms;
    }
    return buf => {
        const args = argsFromPassedDatum(buf, transforms);
        let promise = (args ?
            func.call(srv, ...args) :
            func.call(srv));
        if (promise === undefined) {
            promise = Promise.resolve();
        }
        else if ((promise === null) || !promise.then) {
            promise = Promise.resolve(resultToBuffer(promise, transforms));
        }
        else {
            promise = promise.then(result => resultToBuffer(result, transforms));
        }
        return { promise };
    };
}
function argsFromPassedDatum(bytes, transforms) {
    if (!bytes) {
        return;
    }
    if (transforms === null || transforms === void 0 ? void 0 : transforms.unpackRequest) {
        if (transforms.unpackRequest === 'noop') {
            return [bytes];
        }
        else {
            return transforms.unpackRequest(bytes);
        }
    }
    else {
        return (bytes ? (0, json_n_binary_1.deserializeArgs)(bytes, transforms === null || transforms === void 0 ? void 0 : transforms.findReferencedObj) : undefined);
    }
}
function resultToBuffer(data, transforms) {
    if (data === undefined) {
        return;
    }
    if (transforms === null || transforms === void 0 ? void 0 : transforms.packReply) {
        if (transforms.packReply === 'noop') {
            if (!ArrayBuffer.isView(data)) {
                throw new Error(`Method returned non-binary, while no serialization is set`);
            }
            return data;
        }
        return transforms.packReply(data);
    }
    else {
        return (0, json_n_binary_1.serializeArgs)([data], transforms === null || transforms === void 0 ? void 0 : transforms.findRefOf);
    }
}
function wrapObservingFunc(srvOrFn, funcOrTransforms, transforms) {
    let srv;
    let func;
    if (typeof srvOrFn === 'function') {
        srv = undefined;
        func = srvOrFn;
        transforms = funcOrTransforms;
    }
    else {
        srv = srvOrFn;
        func = funcOrTransforms;
    }
    return buf => {
        const args = argsFromPassedDatum(buf, transforms);
        const s = new rxjs_1.Subject();
        const obs = s.asObservable().pipe((0, rxjs_1.map)(ev => resultToBuffer(ev, transforms)));
        const onCancel = (args ?
            func.call(srv, s, ...args) :
            func.call(srv, s));
        return { obs, onCancel };
    };
}

},{"./json-n-binary":49,"rxjs":95}],51:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2020, 2022, 2024 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.exposeLogger = exposeLogger;
exports.makeLogCaller = makeLogCaller;
const error_1 = require("../lib-common/exceptions/error");
const caller_side_wrap_1 = require("./json-ipc-wrapping/caller-side-wrap");
const service_side_wrap_1 = require("./json-ipc-wrapping/service-side-wrap");
function exposeLogger(fn) {
    return (0, service_side_wrap_1.wrapReqReplyFunc)(fn);
}
function makeLogCaller(caller, path) {
    const log = (0, caller_side_wrap_1.makeReqRepFuncCaller)(caller, path);
    return (type, msg, err) => log(type, msg, (0, error_1.stringifyErr)(err)).catch(noop);
}
function noop() { }
Object.freeze(exports);

},{"../lib-common/exceptions/error":66,"./json-ipc-wrapping/caller-side-wrap":48,"./json-ipc-wrapping/service-side-wrap":50}],52:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2020 - 2021 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.exposeStartupW3N = exposeStartupW3N;
exports.makeStartupW3Nclient = makeStartupW3Nclient;
const connector_1 = require("../ipc-via-protobuf/connector");
const startup_cap_1 = require("../core/startup/startup-cap");
const generic_1 = require("./generic");
function exposeStartupW3N(coreSide, w3n, extraCAPs) {
    const startupCAPsExposures = {
        signIn: startup_cap_1.wrapSignInCAP,
        signUp: startup_cap_1.wrapSignUpCAP,
    };
    (0, generic_1.exposeCAPs)(coreSide, w3n, startupCAPsExposures, extraCAPs);
}
// This is not used, but it ensures that some require runs, providing function
// for protobuf-something.
const unused = connector_1.W3N_NAME;
function makeStartupW3Nclient(clientSide, extraCAPs) {
    const mainCAPs = {
        signIn: startup_cap_1.makeSignInCaller,
        signUp: startup_cap_1.makeSignUpCaller,
    };
    return (0, generic_1.makeClientSide)(clientSide, mainCAPs, extraCAPs);
}
Object.freeze(exports);

},{"../core/startup/startup-cap":56,"../ipc-via-protobuf/connector":60,"./generic":47}],53:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2020 - 2023, 2025 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.exposeASMailCAP = exposeASMailCAP;
exports.makeASMailCaller = makeASMailCaller;
exports.promiseASMailCaller = promiseASMailCaller;
const protobuf_msg_1 = require("../../ipc-via-protobuf/protobuf-msg");
const protobuf_type_1 = require("../../lib-client/protobuf-type");
const asmail_proto_1 = require("../../protos/asmail.proto");
const connector_1 = require("../../ipc-via-protobuf/connector");
const rxjs_1 = require("rxjs");
const operators_1 = require("rxjs/operators");
const fs_1 = require("../../core-ipc/fs");
const utils_for_observables_1 = require("../../lib-common/utils-for-observables");
const caller_side_wrap_1 = require("../../core-ipc/json-ipc-wrapping/caller-side-wrap");
const service_side_wrap_1 = require("../../core-ipc/json-ipc-wrapping/service-side-wrap");
function exposeASMailCAP(cap, expServices) {
    const out = cap.delivery;
    const box = cap.inbox;
    if (!box && !out.addMsg) {
        return {
            getUserId: getUserId.wrapService(cap.getUserId),
            delivery: {
                preFlight: preFlight.wrapService(out.preFlight),
            }
        };
    }
    else {
        return {
            getUserId: getUserId.wrapService(cap.getUserId),
            delivery: {
                addMsg: addMsg.wrapService(out.addMsg, expServices),
                currentState: currentState.wrapService(out.currentState),
                listMsgs: delivListMsgs.wrapService(out.listMsgs),
                observeAllDeliveries: observeAllDeliveries.wrapService(out.observeAllDeliveries),
                observeDelivery: observeDelivery.wrapService(out.observeDelivery),
                preFlight: preFlight.wrapService(out.preFlight),
                rmMsg: rmMsg.wrapService(out.rmMsg)
            },
            inbox: {
                getMsg: getMsg.wrapService(box.getMsg, expServices),
                listMsgs: inboxListMsgs.wrapService(box.listMsgs),
                removeMsg: removeMsg.wrapService(box.removeMsg),
                subscribe: inboxSubscribe.wrapService(box.subscribe, expServices)
            },
            config: exposeConfigCAP(cap.config)
        };
    }
}
function makeASMailBasedOnListing(caller, objPath, capLists) {
    const delivPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'delivery');
    const inboxPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'inbox');
    if (capLists === 'asmail') {
        return {
            getUserId: getUserId.makeCaller(caller, objPath),
            delivery: {
                addMsg: addMsg.makeCaller(caller, delivPath),
                currentState: currentState.makeCaller(caller, delivPath),
                listMsgs: delivListMsgs.makeCaller(caller, delivPath),
                observeAllDeliveries: observeAllDeliveries.makeCaller(caller, delivPath),
                observeDelivery: observeDelivery.makeCaller(caller, delivPath),
                preFlight: preFlight.makeCaller(caller, delivPath),
                rmMsg: rmMsg.makeCaller(caller, delivPath)
            },
            inbox: {
                getMsg: getMsg.makeCaller(caller, inboxPath),
                listMsgs: inboxListMsgs.makeCaller(caller, inboxPath),
                removeMsg: removeMsg.makeCaller(caller, inboxPath),
                subscribe: inboxSubscribe.makeCaller(caller, inboxPath)
            },
            config: makeConfigCaller(caller, objPath.concat('config'))
        };
    }
    else if (capLists === 'preflight') {
        return {
            getUserId: getUserId.makeCaller(caller, objPath),
            delivery: {
                preFlight: preFlight.makeCaller(caller, delivPath),
            }
        };
    }
    else {
        throw new Error(`Unknown capLists value ${capLists}`);
    }
}
function makeASMailCaller(caller, objPath) {
    if (!caller.listObj) {
        throw new Error(`Caller here expects to have method 'listObj'`);
    }
    const topLst = caller.listObj(objPath);
    const capLists = (topLst.includes('inbox') ? 'asmail' : 'preflight');
    return makeASMailBasedOnListing(caller, objPath, capLists);
}
async function promiseASMailCaller(caller, objPath) {
    if (!caller.listObjAsync) {
        throw new Error(`Caller here expects to have method 'listObjAsync'`);
    }
    const topLst = await caller.listObjAsync(objPath);
    const capLists = (topLst.includes('inbox') ? 'asmail' : 'preflight');
    return makeASMailBasedOnListing(caller, objPath, capLists);
}
var getUserId;
(function (getUserId) {
    function wrapService(fn) {
        return () => {
            const promise = fn()
                .then(userId => (0, protobuf_msg_1.encodeToUtf8)(userId));
            return { promise };
        };
    }
    getUserId.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'getUserId');
        return () => caller.startPromiseCall(path, undefined)
            .then(buf => {
            if (!buf) {
                throw (0, connector_1.makeIPCException)({ missingBodyBytes: true });
            }
            return (0, protobuf_msg_1.decodeFromUtf8)(buf);
        });
    }
    getUserId.makeCaller = makeCaller;
})(getUserId || (getUserId = {}));
Object.freeze(getUserId);
var inboxListMsgs;
(function (inboxListMsgs) {
    const requestType = protobuf_type_1.ProtoType.for(asmail_proto_1.asmail.ListMsgsRequestBody);
    const replyType = protobuf_type_1.ProtoType.for(asmail_proto_1.asmail.ListMsgsInboxReplyBody);
    function unpackMsgInfos(buf) {
        const msgs = (0, protobuf_msg_1.fixArray)(replyType.unpack(buf).infos);
        for (const msg of msgs) {
            msg.deliveryTS = (0, protobuf_msg_1.fixInt)(msg.deliveryTS);
        }
        return msgs;
    }
    function wrapService(fn) {
        return (reqBody) => {
            const { fromTS } = requestType.unpack(reqBody);
            const promise = fn((0, protobuf_msg_1.valOfOptInt)(fromTS))
                .then(infos => replyType.pack({ infos }));
            return { promise };
        };
    }
    inboxListMsgs.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'listMsgs');
        return fromTS => {
            const req = (fromTS ? { fromTS: (0, protobuf_msg_1.toVal)(fromTS) } : {});
            return caller
                .startPromiseCall(path, requestType.pack(req))
                .then(unpackMsgInfos);
        };
    }
    inboxListMsgs.makeCaller = makeCaller;
})(inboxListMsgs || (inboxListMsgs = {}));
Object.freeze(inboxListMsgs);
var removeMsg;
(function (removeMsg) {
    const requestType = protobuf_type_1.ProtoType.for(asmail_proto_1.asmail.RemoveMsgRequestBody);
    function wrapService(fn) {
        return (reqBody) => {
            const { msgId } = requestType.unpack(reqBody);
            const promise = fn(msgId);
            return { promise };
        };
    }
    removeMsg.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'removeMsg');
        return async (msgId) => {
            await caller.startPromiseCall(path, requestType.pack({ msgId }));
        };
    }
    removeMsg.makeCaller = makeCaller;
})(removeMsg || (removeMsg = {}));
Object.freeze(removeMsg);
var getMsg;
(function (getMsg) {
    const requestType = protobuf_type_1.ProtoType.for(asmail_proto_1.asmail.GetMsgRequestBody);
    function wrapService(fn, expServices) {
        return (reqBody) => {
            const { msgId } = requestType.unpack(reqBody);
            const promise = fn(msgId)
                .then(msg => packIncomingMessage(msg, expServices));
            return { promise };
        };
    }
    getMsg.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'getMsg');
        return msgId => caller
            .startPromiseCall(path, requestType.pack({ msgId }))
            .then(buf => unpackIncomingMessage(buf, caller));
    }
    getMsg.makeCaller = makeCaller;
})(getMsg || (getMsg = {}));
Object.freeze(getMsg);
const incomingMessageType = protobuf_type_1.ProtoType.for(asmail_proto_1.asmail.IncomingMessageMsg);
function packIncomingMessage(m, expServices) {
    const ipcMsg = {
        msgType: m.msgType,
        msgId: m.msgId,
        deliveryTS: m.deliveryTS,
        sender: m.sender,
        establishedSenderKeyChain: m.establishedSenderKeyChain,
        subject: (0, protobuf_msg_1.toOptVal)(m.subject),
        plainTxtBody: (0, protobuf_msg_1.toOptVal)(m.plainTxtBody),
        htmlTxtBody: (0, protobuf_msg_1.toOptVal)(m.htmlTxtBody),
        jsonBody: (0, protobuf_msg_1.toOptJson)(m.jsonBody),
        carbonCopy: m.carbonCopy,
        recipients: m.recipients,
        attachments: (m.attachments ?
            (0, fs_1.exposeFSService)(m.attachments, expServices) : undefined)
    };
    return incomingMessageType.pack(ipcMsg);
}
function unpackIncomingMessage(buf, caller) {
    const ipcMsg = incomingMessageType.unpack(buf);
    const msg = {
        msgType: ipcMsg.msgType,
        msgId: ipcMsg.msgId,
        deliveryTS: (0, protobuf_msg_1.fixInt)(ipcMsg.deliveryTS),
        sender: ipcMsg.sender,
        establishedSenderKeyChain: ipcMsg.establishedSenderKeyChain,
        subject: (0, protobuf_msg_1.valOfOpt)(ipcMsg.subject),
        plainTxtBody: (0, protobuf_msg_1.valOfOpt)(ipcMsg.plainTxtBody),
        htmlTxtBody: (0, protobuf_msg_1.valOfOpt)(ipcMsg.htmlTxtBody),
        jsonBody: (0, protobuf_msg_1.valOfOptJson)(ipcMsg.jsonBody),
        carbonCopy: ipcMsg.carbonCopy,
        recipients: ipcMsg.recipients,
        attachments: (ipcMsg.attachments ?
            (0, fs_1.makeFSCaller)(caller, ipcMsg.attachments) : undefined)
    };
    return msg;
}
var inboxSubscribe;
(function (inboxSubscribe) {
    const requestType = protobuf_type_1.ProtoType.for(asmail_proto_1.asmail.SubscribeStartCallBody);
    function wrapService(fn, expServices) {
        return buf => {
            const { event } = requestType.unpack(buf);
            const s = new rxjs_1.Subject();
            const obs = s.asObservable().pipe((0, operators_1.map)(msg => packIncomingMessage(msg, expServices)));
            const onCancel = fn(event, s);
            return { obs, onCancel };
        };
    }
    inboxSubscribe.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'subscribe');
        return (event, obs) => {
            const s = new rxjs_1.Subject();
            const unsub = caller.startObservableCall(path, requestType.pack({ event }), s);
            s.asObservable()
                .pipe((0, operators_1.map)(buf => unpackIncomingMessage(buf, caller)))
                .subscribe((0, utils_for_observables_1.toRxObserver)(obs));
            return unsub;
        };
    }
    inboxSubscribe.makeCaller = makeCaller;
})(inboxSubscribe || (inboxSubscribe = {}));
Object.freeze(inboxSubscribe);
var preFlight;
(function (preFlight) {
    const requestType = protobuf_type_1.ProtoType.for(asmail_proto_1.asmail.PreFlightRequestBody);
    function wrapService(fn) {
        return (reqBody) => {
            const { toAddress } = requestType.unpack(reqBody);
            const promise = fn(toAddress)
                .then(protobuf_msg_1.packInt);
            return { promise };
        };
    }
    preFlight.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'preFlight');
        return toAddress => caller
            .startPromiseCall(path, requestType.pack({ toAddress }))
            .then(protobuf_msg_1.unpackInt);
    }
    preFlight.makeCaller = makeCaller;
})(preFlight || (preFlight = {}));
Object.freeze(preFlight);
var addMsg;
(function (addMsg) {
    const requestType = protobuf_type_1.ProtoType.for(asmail_proto_1.asmail.AddMsgRequestBody);
    function packMsg(m, caller) {
        const ipcMsg = {
            msgType: m.msgType,
            htmlTxtBody: (0, protobuf_msg_1.toOptVal)(m.htmlTxtBody),
            jsonBody: (0, protobuf_msg_1.toOptJson)(m.jsonBody),
            msgId: (0, protobuf_msg_1.toOptVal)(m.msgType),
            plainTxtBody: (0, protobuf_msg_1.toOptVal)(m.plainTxtBody),
            recipients: m.recipients,
            carbonCopy: m.carbonCopy,
            subject: (0, protobuf_msg_1.toOptVal)(m.subject)
        };
        if (m.attachments) {
            const attachments = {};
            if (m.attachments.files) {
                const pairs = Object.entries(m.attachments.files)
                    .map(([name, f]) => ({
                    name,
                    item: caller.srvRefOf(f)
                }));
                if (pairs.length > 0) {
                    attachments.files = pairs;
                }
            }
            if (m.attachments.folders) {
                const pairs = Object.entries(m.attachments.folders)
                    .map(([name, f]) => ({
                    name,
                    item: caller.srvRefOf(f)
                }));
                if (pairs.length > 0) {
                    attachments.folders = pairs;
                }
            }
            if (attachments.files || attachments.folders) {
                ipcMsg.attachments = attachments;
            }
        }
        return ipcMsg;
    }
    function unpackMsg(ipcMsg, expServices) {
        const msg = {
            msgType: ipcMsg.msgType,
            htmlTxtBody: (0, protobuf_msg_1.valOfOpt)(ipcMsg.htmlTxtBody),
            jsonBody: (0, protobuf_msg_1.valOfOptJson)(ipcMsg.jsonBody),
            msgId: (0, protobuf_msg_1.valOfOpt)(ipcMsg.msgId),
            plainTxtBody: (0, protobuf_msg_1.valOfOpt)(ipcMsg.plainTxtBody),
            recipients: ipcMsg.recipients,
            carbonCopy: ipcMsg.carbonCopy,
            subject: (0, protobuf_msg_1.valOfOpt)(ipcMsg.subject)
        };
        if (ipcMsg.attachments) {
            const attachments = {};
            if (ipcMsg.attachments.files
                && (ipcMsg.attachments.files.length > 0)) {
                attachments.files = {};
                for (const { name, item } of ipcMsg.attachments.files) {
                    attachments.files[name] = expServices.getOriginalObj(item);
                }
            }
            if (ipcMsg.attachments.folders
                && (ipcMsg.attachments.folders.length > 0)) {
                attachments.folders = {};
                for (const { name, item } of ipcMsg.attachments.folders) {
                    attachments.folders[name] = expServices.getOriginalObj(item);
                }
            }
            if (attachments.files || attachments.folders) {
                msg.attachments = attachments;
            }
        }
        return msg;
    }
    function retryOptToMsg(opt) {
        if (!opt) {
            return;
        }
        return {
            numOfAttempts: opt.numOfAttempts,
            timeBetweenAttempts: (!!opt.timeBetweenAttempts ?
                opt.timeBetweenAttempts : 0)
        };
    }
    function retryOptFromMsg(msg) {
        if (!msg) {
            return;
        }
        return {
            numOfAttempts: msg.numOfAttempts,
            timeBetweenAttempts: (!!msg.timeBetweenAttempts ?
                msg.timeBetweenAttempts : undefined)
        };
    }
    function wrapService(fn, expServices) {
        return (reqBody) => {
            const { id, recipients, msg, localMeta, sendImmediately, retryRecipient } = requestType.unpack(reqBody);
            const promise = fn((0, protobuf_msg_1.fixArray)(recipients), unpackMsg(msg, expServices), id, {
                localMeta: (0, protobuf_msg_1.valOfOptAny)(localMeta),
                sendImmediately: (0, protobuf_msg_1.valOfOpt)(sendImmediately),
                retryRecipient: retryOptFromMsg(retryRecipient)
            });
            return { promise };
        };
    }
    addMsg.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'addMsg');
        return async (recipients, msg, id, opts) => {
            const req = { id, msg: packMsg(msg, caller), recipients };
            if (opts) {
                req.sendImmediately = (0, protobuf_msg_1.toOptVal)(opts.sendImmediately);
                req.localMeta = (0, protobuf_msg_1.toOptAny)(opts.localMeta);
                req.retryRecipient = retryOptToMsg(opts.retryRecipient);
            }
            await caller.startPromiseCall(path, requestType.pack(req));
        };
    }
    addMsg.makeCaller = makeCaller;
})(addMsg || (addMsg = {}));
Object.freeze(addMsg);
var delivListMsgs;
(function (delivListMsgs) {
    const replyType = protobuf_type_1.ProtoType.for(asmail_proto_1.asmail.ListMsgsDeliveryReplyBody);
    function wrapService(fn) {
        return () => {
            const promise = fn()
                .then(idAndInfo => {
                const msgs = idAndInfo.map(({ id, info }) => ({ id, info: packDeliveryProgress(info) }));
                return replyType.pack({ msgs });
            });
            return { promise };
        };
    }
    delivListMsgs.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'listMsgs');
        return () => caller
            .startPromiseCall(path, undefined)
            .then(buf => {
            const msgs = (0, protobuf_msg_1.fixArray)(replyType.unpack(buf).msgs);
            return msgs.map(({ id, info }) => ({ id, info: unpackDeliveryProgress(info) }));
        });
    }
    delivListMsgs.makeCaller = makeCaller;
})(delivListMsgs || (delivListMsgs = {}));
Object.freeze(delivListMsgs);
const deliveryProgressMsgType = protobuf_type_1.ProtoType.for(asmail_proto_1.asmail.DeliveryProgressMsg);
function packDeliveryProgress(p) {
    const m = {
        notConnected: (0, protobuf_msg_1.toOptVal)(p.notConnected),
        allDone: (0, protobuf_msg_1.toOptVal)(p.allDone),
        msgSize: p.msgSize,
        localMeta: (0, protobuf_msg_1.toOptAny)(p.localMeta),
        recipients: []
    };
    for (const [address, info] of Object.entries(p.recipients)) {
        m.recipients.push({
            address,
            info: {
                done: info.done,
                idOnDelivery: (0, protobuf_msg_1.toOptVal)(info.idOnDelivery),
                bytesSent: info.bytesSent,
                err: (info.err ? (0, protobuf_msg_1.errToMsg)(info.err) : undefined)
            }
        });
    }
    return m;
}
function unpackDeliveryProgress(m) {
    const p = {
        allDone: (0, protobuf_msg_1.valOfOpt)(m.allDone),
        msgSize: (0, protobuf_msg_1.fixInt)(m.msgSize),
        notConnected: (0, protobuf_msg_1.valOfOpt)(m.notConnected),
        localMeta: (0, protobuf_msg_1.valOfOptAny)(m.localMeta),
        recipients: {}
    };
    for (const { address, info } of (0, protobuf_msg_1.fixArray)(m.recipients)) {
        p.recipients[address] = {
            done: info.done,
            idOnDelivery: (0, protobuf_msg_1.valOfOpt)(info.idOnDelivery),
            bytesSent: (0, protobuf_msg_1.fixInt)(info.bytesSent),
            err: (info.err ? (0, protobuf_msg_1.errFromMsg)(info.err) : undefined)
        };
    }
    return p;
}
var currentState;
(function (currentState) {
    const requestType = protobuf_type_1.ProtoType.for(asmail_proto_1.asmail.CurrentStateRequestBody);
    function wrapService(fn) {
        return (reqBody) => {
            const { id } = requestType.unpack(reqBody);
            const promise = fn(id)
                .then(p => {
                if (p) {
                    const msg = packDeliveryProgress(p);
                    return deliveryProgressMsgType.pack(msg);
                }
            });
            return { promise };
        };
    }
    currentState.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'currentState');
        return id => caller
            .startPromiseCall(path, requestType.pack({ id }))
            .then(buf => {
            if (buf) {
                const msg = deliveryProgressMsgType.unpack(buf);
                return unpackDeliveryProgress(msg);
            }
        });
    }
    currentState.makeCaller = makeCaller;
})(currentState || (currentState = {}));
Object.freeze(currentState);
var rmMsg;
(function (rmMsg) {
    const requestType = protobuf_type_1.ProtoType.for(asmail_proto_1.asmail.RmMsgRequestBody);
    function wrapService(fn) {
        return (reqBody) => {
            const { id, cancelSending } = requestType.unpack(reqBody);
            const promise = fn(id, (0, protobuf_msg_1.valOfOpt)(cancelSending));
            return { promise };
        };
    }
    rmMsg.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'rmMsg');
        return (id, cancelSending) => caller
            .startPromiseCall(path, requestType.pack({
            id, cancelSending: (0, protobuf_msg_1.toOptVal)(cancelSending)
        }));
    }
    rmMsg.makeCaller = makeCaller;
})(rmMsg || (rmMsg = {}));
Object.freeze(rmMsg);
var observeAllDeliveries;
(function (observeAllDeliveries) {
    const notifType = protobuf_type_1.ProtoType.for(asmail_proto_1.asmail.DeliveryNotificationWithId);
    function wrapService(fn) {
        return () => {
            const s = new rxjs_1.Subject();
            const obs = s.asObservable().pipe((0, operators_1.map)(({ id, progress }) => notifType.pack({
                id,
                progress: packDeliveryProgress(progress)
            })));
            const onCancel = fn(s);
            return { obs, onCancel };
        };
    }
    observeAllDeliveries.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'observeAllDeliveries');
        return obs => {
            const s = new rxjs_1.Subject();
            const unsub = caller.startObservableCall(path, undefined, s);
            s.asObservable()
                .pipe((0, operators_1.map)(buf => {
                const { id, progress } = notifType.unpack(buf);
                return {
                    id, progress: unpackDeliveryProgress(progress)
                };
            }))
                .subscribe((0, utils_for_observables_1.toRxObserver)(obs));
            return unsub;
        };
    }
    observeAllDeliveries.makeCaller = makeCaller;
})(observeAllDeliveries || (observeAllDeliveries = {}));
Object.freeze(observeAllDeliveries);
var observeDelivery;
(function (observeDelivery) {
    const requestType = protobuf_type_1.ProtoType.for(asmail_proto_1.asmail.ObserveDeliveryRequestBody);
    function wrapService(fn) {
        return buf => {
            const { id } = requestType.unpack(buf);
            const s = new rxjs_1.Subject();
            const obs = s.asObservable().pipe((0, operators_1.map)(p => deliveryProgressMsgType.pack(packDeliveryProgress(p))));
            const onCancel = fn(id, s);
            return { obs, onCancel };
        };
    }
    observeDelivery.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'observeDelivery');
        return (id, obs) => {
            const s = new rxjs_1.Subject();
            const unsub = caller.startObservableCall(path, requestType.pack({ id }), s);
            s.asObservable()
                .pipe((0, operators_1.map)(buf => unpackDeliveryProgress(deliveryProgressMsgType.unpack(buf))))
                .subscribe((0, utils_for_observables_1.toRxObserver)(obs));
            return unsub;
        };
    }
    observeDelivery.makeCaller = makeCaller;
})(observeDelivery || (observeDelivery = {}));
Object.freeze(observeDelivery);
function exposeConfigCAP(cap) {
    return {
        getOnServer: (0, service_side_wrap_1.wrapReqReplySrvMethod)(cap, 'getOnServer'),
        setOnServer: (0, service_side_wrap_1.wrapReqReplySrvMethod)(cap, 'setOnServer')
    };
}
function callConfig(caller, objPath, method) {
    return (0, caller_side_wrap_1.makeReqRepObjCaller)(caller, objPath, method);
}
function makeConfigCaller(caller, objPath) {
    return {
        getOnServer: callConfig(caller, objPath, 'getOnServer'),
        setOnServer: callConfig(caller, objPath, 'setOnServer')
    };
}
Object.freeze(exports);

},{"../../core-ipc/fs":46,"../../core-ipc/json-ipc-wrapping/caller-side-wrap":48,"../../core-ipc/json-ipc-wrapping/service-side-wrap":50,"../../ipc-via-protobuf/connector":60,"../../ipc-via-protobuf/protobuf-msg":61,"../../lib-client/protobuf-type":63,"../../lib-common/utils-for-observables":70,"../../protos/asmail.proto":71,"rxjs":95,"rxjs/operators":320}],54:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2020, 2022, 2024 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.exposeMailerIdCAP = exposeMailerIdCAP;
exports.makeMailerIdCaller = makeMailerIdCaller;
const caller_side_wrap_1 = require("../../core-ipc/json-ipc-wrapping/caller-side-wrap");
const service_side_wrap_1 = require("../../core-ipc/json-ipc-wrapping/service-side-wrap");
function exposeMailerIdCAP(cap) {
    return {
        getUserId: (0, service_side_wrap_1.wrapReqReplySrvMethod)(cap, 'getUserId'),
        login: (0, service_side_wrap_1.wrapReqReplySrvMethod)(cap, 'login'),
        sign: (0, service_side_wrap_1.wrapReqReplySrvMethod)(cap, 'sign'),
        verifySignature: (0, service_side_wrap_1.wrapReqReplySrvMethod)(cap, 'verifySignature')
    };
}
function callMailerId(caller, objPath, method) {
    return (0, caller_side_wrap_1.makeReqRepObjCaller)(caller, objPath, method);
}
function makeMailerIdCaller(caller, objPath) {
    return {
        getUserId: callMailerId(caller, objPath, 'getUserId'),
        login: callMailerId(caller, objPath, 'login'),
        sign: callMailerId(caller, objPath, 'sign'),
        verifySignature: callMailerId(caller, objPath, 'verifySignature')
    };
}
Object.freeze(exports);

},{"../../core-ipc/json-ipc-wrapping/caller-side-wrap":48,"../../core-ipc/json-ipc-wrapping/service-side-wrap":50}],55:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2025 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.exposeKeyringsCAP = exposeKeyringsCAP;
exports.makeKeyringsCaller = makeKeyringsCaller;
const caller_side_wrap_1 = require("../../core-ipc/json-ipc-wrapping/caller-side-wrap");
const service_side_wrap_1 = require("../../core-ipc/json-ipc-wrapping/service-side-wrap");
function exposeKeyringsCAP(cap) {
    return {
        introKeyOnASMailServer: exposeIntroKey(cap.introKeyOnASMailServer),
        getCorrespondentKeys: (0, service_side_wrap_1.wrapReqReplySrvMethod)(cap, 'getCorrespondentKeys')
    };
}
function exposeIntroKey(cap) {
    return {
        getCurrent: (0, service_side_wrap_1.wrapReqReplySrvMethod)(cap, 'getCurrent'),
        makeAndPublishNew: (0, service_side_wrap_1.wrapReqReplySrvMethod)(cap, 'makeAndPublishNew'),
        remove: (0, service_side_wrap_1.wrapReqReplySrvMethod)(cap, 'remove'),
    };
}
function callIntroKeyOnASMailServer(caller, objPath, method) {
    return (0, caller_side_wrap_1.makeReqRepObjCaller)(caller, objPath, method);
}
function makeIntroKeyCaller(caller, objPath) {
    return {
        getCurrent: callIntroKeyOnASMailServer(caller, objPath, 'getCurrent'),
        makeAndPublishNew: callIntroKeyOnASMailServer(caller, objPath, 'makeAndPublishNew'),
        remove: callIntroKeyOnASMailServer(caller, objPath, 'remove'),
    };
}
function makeKeyringsCaller(caller, objPath) {
    return {
        introKeyOnASMailServer: makeIntroKeyCaller(caller, objPath.concat('introKeyOnASMailServer')),
        getCorrespondentKeys: (0, caller_side_wrap_1.makeReqRepFuncCaller)(caller, objPath.concat('getCorrespondentKeys'))
    };
}
Object.freeze(exports);

},{"../../core-ipc/json-ipc-wrapping/caller-side-wrap":48,"../../core-ipc/json-ipc-wrapping/service-side-wrap":50}],56:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2020, 2022, 2024 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.wrapSignInCAP = wrapSignInCAP;
exports.makeSignInCaller = makeSignInCaller;
exports.wrapSignUpCAP = wrapSignUpCAP;
exports.makeSignUpCaller = makeSignUpCaller;
const deferred_1 = require("../../lib-common/processes/deferred");
const service_side_wrap_1 = require("../../core-ipc/json-ipc-wrapping/service-side-wrap");
const caller_side_wrap_1 = require("../../core-ipc/json-ipc-wrapping/caller-side-wrap");
function wrapSignInCAP(cap) {
    return {
        completeLoginAndLocalSetup: (0, service_side_wrap_1.wrapObservingFunc)((obs, pass) => {
            cap.completeLoginAndLocalSetup(pass, p => { var _a; return (_a = obs.next) === null || _a === void 0 ? void 0 : _a.call(obs, { p }); })
                .then(decrResult => {
                var _a, _b;
                (_a = obs.next) === null || _a === void 0 ? void 0 : _a.call(obs, { p: 100, decrResult });
                (_b = obs.complete) === null || _b === void 0 ? void 0 : _b.call(obs);
            }, err => { var _a; return (_a = obs.error) === null || _a === void 0 ? void 0 : _a.call(obs, err); });
            return noop;
        }),
        getUsersOnDisk: (0, service_side_wrap_1.wrapReqReplySrvMethod)(cap, 'getUsersOnDisk'),
        startLoginToRemoteStorage: (0, service_side_wrap_1.wrapReqReplySrvMethod)(cap, 'startLoginToRemoteStorage'),
        useExistingStorage: (0, service_side_wrap_1.wrapObservingFunc)((obs, addr, pass) => {
            cap.useExistingStorage(addr, pass, p => { var _a; return (_a = obs.next) === null || _a === void 0 ? void 0 : _a.call(obs, { p }); })
                .then(decrResult => {
                var _a, _b;
                (_a = obs.next) === null || _a === void 0 ? void 0 : _a.call(obs, { p: 100, decrResult });
                (_b = obs.complete) === null || _b === void 0 ? void 0 : _b.call(obs);
            }, err => { var _a; return (_a = obs.error) === null || _a === void 0 ? void 0 : _a.call(obs, err); });
            return noop;
        }),
        watchBoot: (0, service_side_wrap_1.wrapObservingFunc)(cap.watchBoot)
    };
}
function makeSignInCaller(caller, objPath) {
    return {
        completeLoginAndLocalSetup: (() => {
            const obsFn = (0, caller_side_wrap_1.makeObservableFuncCaller)(caller, objPath.concat('completeLoginAndLocalSetup'));
            return (pass, progressCB) => {
                const { obs, promise } = completionAndObsOfProgress(progressCB);
                obsFn(obs, pass);
                return promise;
            };
        })(),
        getUsersOnDisk: callSignIn(caller, objPath, 'getUsersOnDisk'),
        startLoginToRemoteStorage: callSignIn(caller, objPath, 'startLoginToRemoteStorage'),
        useExistingStorage: (() => {
            const obsFn = (0, caller_side_wrap_1.makeObservableFuncCaller)(caller, objPath.concat('useExistingStorage'));
            return (addr, pass, progressCB) => {
                const { obs, promise } = completionAndObsOfProgress(progressCB);
                obsFn(obs, addr, pass);
                return promise;
            };
        })(),
        watchBoot: (0, caller_side_wrap_1.makeObservableFuncCaller)(caller, objPath.concat('watchBoot'))
    };
}
function callSignIn(caller, objPath, method) {
    return (0, caller_side_wrap_1.makeReqRepObjCaller)(caller, objPath, method);
}
function completionAndObsOfProgress(progressCB) {
    let completion = (0, deferred_1.defer)();
    const obs = {
        next: ({ p, decrResult }) => {
            if (typeof decrResult === 'boolean') {
                completion === null || completion === void 0 ? void 0 : completion.resolve(decrResult);
                completion = undefined;
            }
            else {
                progressCB(p);
            }
        },
        error: err => completion === null || completion === void 0 ? void 0 : completion.reject(err)
    };
    return {
        obs,
        promise: completion.promise
    };
}
function wrapSignUpCAP(cap) {
    return {
        setSignUpServer: (0, service_side_wrap_1.wrapReqReplySrvMethod)(cap, 'setSignUpServer'),
        getAvailableDomains: (0, service_side_wrap_1.wrapReqReplySrvMethod)(cap, 'getAvailableDomains'),
        getAvailableAddresses: (0, service_side_wrap_1.wrapReqReplySrvMethod)(cap, 'getAvailableAddresses'),
        addUser: (0, service_side_wrap_1.wrapReqReplySrvMethod)(cap, 'addUser'),
        createUserParams: (0, service_side_wrap_1.wrapObservingFunc)((obs, pass) => {
            cap.createUserParams(pass, p => { var _a; return (_a = obs.next) === null || _a === void 0 ? void 0 : _a.call(obs, p); })
                .then(() => { var _a; return (_a = obs.complete) === null || _a === void 0 ? void 0 : _a.call(obs); }, err => { var _a; return (_a = obs.error) === null || _a === void 0 ? void 0 : _a.call(obs, err); });
            return noop;
        }),
        isActivated: (0, service_side_wrap_1.wrapReqReplySrvMethod)(cap, 'isActivated'),
        watchBoot: (0, service_side_wrap_1.wrapObservingFunc)(cap.watchBoot)
    };
}
function noop() { }
function callSignUp(caller, objPath, method) {
    return (0, caller_side_wrap_1.makeReqRepObjCaller)(caller, objPath, method);
}
function makeSignUpCaller(caller, objPath) {
    return {
        setSignUpServer: callSignUp(caller, objPath, 'setSignUpServer'),
        getAvailableDomains: callSignUp(caller, objPath, 'getAvailableDomains'),
        getAvailableAddresses: callSignUp(caller, objPath, 'getAvailableAddresses'),
        addUser: callSignUp(caller, objPath, 'addUser'),
        createUserParams: (() => {
            const obsFn = (0, caller_side_wrap_1.makeObservableFuncCaller)(caller, objPath.concat('createUserParams'));
            return (pass, progressCB) => {
                const completion = (0, deferred_1.defer)();
                obsFn({
                    next: p => progressCB(p),
                    complete: () => completion.resolve(),
                    error: err => completion.reject(err)
                }, pass);
                return completion.promise;
            };
        })(),
        isActivated: callSignUp(caller, objPath, 'isActivated'),
        watchBoot: (0, caller_side_wrap_1.makeObservableFuncCaller)(caller, objPath.concat('watchBoot'))
    };
}
Object.freeze(exports);

},{"../../core-ipc/json-ipc-wrapping/caller-side-wrap":48,"../../core-ipc/json-ipc-wrapping/service-side-wrap":50,"../../lib-common/processes/deferred":69}],57:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2020 - 2022 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.exposeStorageCAP = exposeStorageCAP;
exports.makeStorageCaller = makeStorageCaller;
exports.promiseStorageCaller = promiseStorageCaller;
const protobuf_msg_1 = require("../../ipc-via-protobuf/protobuf-msg");
const fs_1 = require("../../core-ipc/fs");
const protobuf_type_1 = require("../../lib-client/protobuf-type");
const storage_proto_1 = require("../../protos/storage.proto");
function exposeStorageCAP(cap, expServices) {
    const wrap = {
        getAppLocalFS: getAppLocalFS.wrapService(cap.getAppLocalFS, expServices),
        getAppSyncedFS: getAppSyncedFS.wrapService(cap.getAppSyncedFS, expServices)
    };
    if (cap.getSysFS) {
        wrap.getSysFS = getSysFS.wrapService(cap.getSysFS, expServices);
    }
    if (cap.getUserFS) {
        wrap.getUserFS = getUserFS.wrapService(cap.getUserFS, expServices);
    }
    return wrap;
}
function makeStorageCaller(caller, objPath) {
    const lstStorageCAP = caller.listObj(objPath);
    return instantiateStorageCaller(caller, lstStorageCAP, objPath);
}
async function promiseStorageCaller(caller, objPath) {
    const lstStorageCAP = (await caller.listObjAsync(objPath));
    return instantiateStorageCaller(caller, lstStorageCAP, objPath);
}
function instantiateStorageCaller(caller, lstStorageCAP, objPath) {
    const sysFS = lstStorageCAP.includes('getSysFS');
    const userFS = lstStorageCAP.includes('getUserFS');
    const storage = {
        getAppLocalFS: getAppLocalFS.makeCaller(caller, objPath),
        getAppSyncedFS: getAppSyncedFS.makeCaller(caller, objPath)
    };
    if (sysFS) {
        storage.getSysFS = getSysFS.makeCaller(caller, objPath);
    }
    if (userFS) {
        storage.getUserFS = getUserFS.makeCaller(caller, objPath);
    }
    return storage;
}
var getAppLocalFS;
(function (getAppLocalFS) {
    const requestType = protobuf_type_1.ProtoType.for(storage_proto_1.storage.GetAppLocalFSRequestBody);
    function wrapService(fn, expServices) {
        return buf => {
            const { appName } = requestType.unpack(buf);
            const promise = fn((0, protobuf_msg_1.valOfOpt)(appName))
                .then(fs => {
                const fsMsg = (0, fs_1.exposeFSService)(fs, expServices);
                return fs_1.fsMsgType.pack(fsMsg);
            });
            return { promise };
        };
    }
    getAppLocalFS.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'getAppLocalFS');
        return appName => caller
            .startPromiseCall(path, requestType.pack({ appName: (0, protobuf_msg_1.toOptVal)(appName) }))
            .then(buf => {
            const fsMsg = fs_1.fsMsgType.unpack(buf);
            return (0, fs_1.makeFSCaller)(caller, fsMsg);
        });
    }
    getAppLocalFS.makeCaller = makeCaller;
})(getAppLocalFS || (getAppLocalFS = {}));
Object.freeze(getAppLocalFS);
var getAppSyncedFS;
(function (getAppSyncedFS) {
    const requestType = protobuf_type_1.ProtoType.for(storage_proto_1.storage.GetAppSyncedFSRequestBody);
    function wrapService(fn, expServices) {
        return buf => {
            const { appName } = requestType.unpack(buf);
            const promise = fn((0, protobuf_msg_1.valOfOpt)(appName))
                .then(fs => {
                const fsMsg = (0, fs_1.exposeFSService)(fs, expServices);
                return fs_1.fsMsgType.pack(fsMsg);
            });
            return { promise };
        };
    }
    getAppSyncedFS.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'getAppSyncedFS');
        return appName => caller
            .startPromiseCall(path, requestType.pack({ appName: (0, protobuf_msg_1.toOptVal)(appName) }))
            .then(buf => {
            const fsMsg = fs_1.fsMsgType.unpack(buf);
            return (0, fs_1.makeFSCaller)(caller, fsMsg);
        });
    }
    getAppSyncedFS.makeCaller = makeCaller;
})(getAppSyncedFS || (getAppSyncedFS = {}));
Object.freeze(getAppSyncedFS);
var getSysFS;
(function (getSysFS) {
    const requestType = protobuf_type_1.ProtoType.for(storage_proto_1.storage.GetSysFSRequestBody);
    function wrapService(fn, expServices) {
        return buf => {
            const { type, path } = requestType.unpack(buf);
            const promise = fn(type, (0, protobuf_msg_1.valOfOpt)(path))
                .then(item => {
                const msg = fs_1.fsItem.exposeFSItem(expServices, item);
                return fs_1.fsItem.msgType.pack(msg);
            });
            return { promise };
        };
    }
    getSysFS.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'getSysFS');
        return (type, path) => caller
            .startPromiseCall(ipcPath, requestType.pack({
            type, path: (0, protobuf_msg_1.toOptVal)(path)
        }))
            .then(buf => {
            const msg = fs_1.fsItem.msgType.unpack(buf);
            return fs_1.fsItem.fsItemFromMsg(caller, msg);
        });
    }
    getSysFS.makeCaller = makeCaller;
})(getSysFS || (getSysFS = {}));
Object.freeze(getSysFS);
var getUserFS;
(function (getUserFS) {
    const requestType = protobuf_type_1.ProtoType.for(storage_proto_1.storage.GetUserFSRequestBody);
    function wrapService(fn, expServices) {
        return buf => {
            const { type, path } = requestType.unpack(buf);
            const promise = fn(type, (0, protobuf_msg_1.valOfOpt)(path))
                .then(item => {
                const msg = fs_1.fsItem.exposeFSItem(expServices, item);
                return fs_1.fsItem.msgType.pack(msg);
            });
            return { promise };
        };
    }
    getUserFS.wrapService = wrapService;
    function makeCaller(caller, objPath) {
        const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'getUserFS');
        return (type, path) => caller
            .startPromiseCall(ipcPath, requestType.pack({
            type, path: (0, protobuf_msg_1.toOptVal)(path)
        }))
            .then(buf => {
            const msg = fs_1.fsItem.msgType.unpack(buf);
            return fs_1.fsItem.fsItemFromMsg(caller, msg);
        });
    }
    getUserFS.makeCaller = makeCaller;
})(getUserFS || (getUserFS = {}));
Object.freeze(getUserFS);
Object.freeze(exports);

},{"../../core-ipc/fs":46,"../../ipc-via-protobuf/protobuf-msg":61,"../../lib-client/protobuf-type":63,"../../protos/storage.proto":78}],58:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2020 - 2024 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.ClientsSideImpl = void 0;
const protobuf_msg_1 = require("./protobuf-msg");
const deferred_1 = require("../lib-common/processes/deferred");
const connector_1 = require("./connector");
const MAX_DUPLICATE_ATTEMPTS = 100;
class ClientsSideImpl {
    constructor(sendMsg, syncReqToListObj, asyncReqToListObj) {
        this.sendMsg = sendMsg;
        this.syncReqToListObj = syncReqToListObj;
        this.asyncReqToListObj = asyncReqToListObj;
        this.fnCalls = new Map();
        this.fnCallCounter = 1;
        this.srvRefs = new WeakMap();
        this.weakSrvByRefs = new Map();
        this.srvFinalRegistry = new FinalizationRegistry(this.doOnClientObjDrop.bind(this));
        this.isStopped = false;
        Object.seal(this);
    }
    stop(exc) {
        if (this.isStopped) {
            return;
        }
        this.isStopped = true;
        for (const call of this.fnCalls.values()) {
            if (call.deferred) {
                call.deferred.reject(exc);
            }
            else if (call.obs) {
                call.obs.error(exc);
            }
        }
        this.fnCalls.clear();
    }
    sendCallCancellation(fnCallNum) {
        this.sendMsg({
            headers: { fnCallNum: (0, protobuf_msg_1.toVal)(fnCallNum), msgType: 'cancel' }
        });
    }
    processInterimCallReply(fnCallNum, body) {
        const call = this.fnCalls.get(fnCallNum);
        if (!call) {
            return;
        }
        if (call.obs) {
            call.obs.next(body);
        }
        else if (call.deferred) {
            // XXX log presence of fn call with promise instead of observable
            call.deferred.resolve(body);
            this.sendCallCancellation(fnCallNum);
            this.fnCalls.delete(fnCallNum);
        }
        else {
            // XXX log presence of fn call without fields to signal reply
            this.sendCallCancellation(fnCallNum);
            this.fnCalls.delete(fnCallNum);
        }
    }
    processEndCallReply(fnCallNum, body) {
        const call = this.fnCalls.get(fnCallNum);
        if (!call) {
            return;
        }
        if (call.obs) {
            call.obs.complete();
        }
        else if (call.deferred) {
            call.deferred.resolve(body);
        }
        else {
            // XXX log presence of fn call without fields to signal reply
        }
        this.fnCalls.delete(fnCallNum);
    }
    processCallError(fnCallNum, body) {
        const call = this.fnCalls.get(fnCallNum);
        if (!call) {
            return;
        }
        this.fnCalls.delete(fnCallNum);
        const err = (body ? (0, protobuf_msg_1.errFromMsg)(protobuf_msg_1.errBodyType.unpack(body)) : undefined);
        if (err && (err.type === 'ipc')
            && err.duplicateFnCallNum) {
            this.retryWithOtherCallNum(call);
            return;
        }
        if (call.obs) {
            call.obs.error(err);
        }
        else if (call.deferred) {
            call.deferred.reject(err);
        }
        else {
            // XXX log presence of fn call without fields to signal reply
        }
    }
    retryWithOtherCallNum(call) {
        if (call.countOfDuplicateFnCallNum) {
            call.countOfDuplicateFnCallNum += 1;
            if (call.countOfDuplicateFnCallNum >= MAX_DUPLICATE_ATTEMPTS) {
                return;
            }
        }
        else {
            call.countOfDuplicateFnCallNum = 1;
        }
        const fnCallNum = this.nextFnCallNum();
        call.reqEnv.headers.fnCallNum.value = fnCallNum;
        this.fnCalls.set(fnCallNum, call);
        try {
            this.sendMsg(call.reqEnv);
        }
        catch (err) {
            this.fnCalls.delete(fnCallNum);
            if (call.deferred) {
                call.deferred.reject(err);
            }
            else if (call.obs) {
                call.obs.error(err);
            }
        }
    }
    nextFnCallNum() {
        while (this.fnCalls.has(this.fnCallCounter)) {
            if (this.fnCallCounter < Number.MAX_SAFE_INTEGER) {
                this.fnCallCounter += 1;
            }
            else {
                this.fnCallCounter = 1;
            }
        }
        const fnCallNum = this.fnCallCounter;
        this.fnCallCounter += 1;
        return fnCallNum;
    }
    caller() {
        const callerWrap = {
            listObj: (this.syncReqToListObj ? this.listObj.bind(this) : undefined),
            listObjAsync: (this.asyncReqToListObj ?
                this.listObjAsync.bind(this) : undefined),
            registerClientDrop: this.registerClientDrop.bind(this),
            srvRefOf: this.srvRefOf.bind(this),
            startObservableCall: this.startObservableCall.bind(this),
            startPromiseCall: this.startPromiseCall.bind(this),
            findCallingObjByRef: this.findCallingObjByRef.bind(this)
        };
        return callerWrap;
    }
    throwIfStopped() {
        if (this.isStopped) {
            throw (0, connector_1.makeIPCException)({ ipcNotConnected: true });
        }
    }
    startCall(reqEnv) {
        this.throwIfStopped();
        this.sendMsg(reqEnv);
    }
    setupFnCall(path, body, deferred, obs) {
        const fnCallNum = this.nextFnCallNum();
        const reqEnv = {
            headers: { fnCallNum: (0, protobuf_msg_1.toVal)(fnCallNum), msgType: 'start', path },
            body: (0, protobuf_msg_1.toOptVal)(body)
        };
        this.fnCalls.set(fnCallNum, { deferred, obs, reqEnv });
        return reqEnv;
    }
    startPromiseCall(path, req) {
        const deferred = (0, deferred_1.defer)();
        const reqEnv = this.setupFnCall(path, req, deferred, undefined);
        const fnCallNum = reqEnv.headers.fnCallNum.value;
        try {
            this.startCall(reqEnv);
        }
        catch (err) {
            this.fnCalls.delete(fnCallNum);
            deferred.reject(err);
        }
        return deferred.promise;
    }
    startObservableCall(path, req, obs) {
        const reqEnv = this.setupFnCall(path, req, undefined, obs);
        const fnCallNum = reqEnv.headers.fnCallNum.value;
        try {
            this.startCall(reqEnv);
            return () => this.sendCallCancellation(fnCallNum);
        }
        catch (err) {
            this.fnCalls.delete(fnCallNum);
            throw err;
        }
    }
    registerClientDrop(o, srvRef, reconstructData) {
        o._isObjectFromCore = true;
        this.srvFinalRegistry.register(o, srvRef);
        this.weakSrvByRefs.set(srvRef.path[0], {
            weakRef: new WeakRef(o), reconstructData
        });
        this.srvRefs.set(o, srvRef);
    }
    doOnClientObjDrop(srvRef) {
        var _a;
        if (!((_a = this.weakSrvByRefs.get(srvRef.path[0])) === null || _a === void 0 ? void 0 : _a.weakRef.deref())) {
            this.weakSrvByRefs.delete(srvRef.path[0]);
            this.sendObjDropMsg(srvRef);
        }
    }
    sendObjDropMsg(srvRef) {
        if (this.isStopped) {
            return;
        }
        this.sendMsg({ headers: { msgType: 'drop', path: srvRef.path } });
    }
    srvRefOf(clientObj) {
        const srvRef = this.srvRefs.get(clientObj);
        if (srvRef) {
            return srvRef;
        }
        else {
            throw (0, connector_1.makeIPCException)({ 'objectNotFound': true });
        }
    }
    findCallingObjByRef(ref) {
        const found = this.weakSrvByRefs.get(ref.path[0]);
        if (!found) {
            return;
        }
        const obj = found.weakRef.deref();
        if (obj) {
            return { obj };
        }
        else if (found.reconstructData) {
            return { reconstructData: found.reconstructData };
        }
        else {
            this.weakSrvByRefs.delete(ref.path[0]);
            return;
        }
    }
    listObj(path) {
        this.throwIfStopped();
        return this.syncReqToListObj(path);
    }
    listObjAsync(path) {
        this.throwIfStopped();
        return this.asyncReqToListObj(path);
    }
}
exports.ClientsSideImpl = ClientsSideImpl;
Object.freeze(ClientsSideImpl.prototype);
Object.freeze(ClientsSideImpl);
Object.freeze(exports);

},{"../lib-common/processes/deferred":69,"./connector":60,"./protobuf-msg":61}],59:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2020 - 2021, 2023 - 2024 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.ExposedObjs = exports.ServicesSideImpl = void 0;
const protobuf_msg_1 = require("./protobuf-msg");
const connector_1 = require("./connector");
class ServicesSideImpl {
    constructor(sendMsg) {
        this.sendMsg = sendMsg;
        this.exposedObjs = new ExposedObjs();
        this.fnCallProcs = new Map();
        Object.seal(this);
    }
    stop() {
        this.exposedObjs.dropAll();
        for (const call of this.fnCallProcs.values()) {
            if (call.sub) {
                call.sub.sub.unsubscribe();
                if (call.sub.onCancel) {
                    call.sub.onCancel();
                }
            }
        }
        this.fnCallProcs.clear();
    }
    sendCallError(fnCallNum, err) {
        this.sendMsg({
            headers: { fnCallNum: (0, protobuf_msg_1.toVal)(fnCallNum), msgType: 'error' },
            body: (0, protobuf_msg_1.toVal)(protobuf_msg_1.errBodyType.pack((0, protobuf_msg_1.errToMsg)(err)))
        });
    }
    sendCallReply(fnCallNum, last, body) {
        this.sendMsg({
            headers: {
                fnCallNum: (0, protobuf_msg_1.toVal)(fnCallNum),
                msgType: (last ? 'end' : 'interim')
            },
            body: (0, protobuf_msg_1.toOptVal)(body)
        });
    }
    processCallStart(fnCallNum, path, body) {
        if (this.fnCallProcs.has(fnCallNum)) {
            this.sendCallError(fnCallNum, (0, connector_1.makeIPCException)({ duplicateFnCallNum: true }));
            return;
        }
        try {
            const fn = this.exposedObjs.findFn(path);
            const out = fn(body);
            if (!out) {
                return;
            }
            else if (out.promise) {
                const prom = out.promise.then(buf => {
                    this.sendCallReply(fnCallNum, true, buf);
                    this.fnCallProcs.delete(fnCallNum);
                }, err => {
                    this.sendCallError(fnCallNum, err);
                    this.fnCallProcs.delete(fnCallNum);
                });
                this.fnCallProcs.set(fnCallNum, { prom });
            }
            else if (out.obs) {
                const sub = out.obs.subscribe({
                    next: buf => this.sendCallReply(fnCallNum, false, buf),
                    complete: () => {
                        this.sendCallReply(fnCallNum, true, undefined);
                        this.fnCallProcs.delete(fnCallNum);
                    },
                    error: err => {
                        this.sendCallError(fnCallNum, err);
                        this.fnCallProcs.delete(fnCallNum);
                    }
                });
                const onCancel = out.onCancel;
                this.fnCallProcs.set(fnCallNum, { sub: { sub, onCancel } });
            }
        }
        catch (err) {
            this.sendCallError(fnCallNum, err);
        }
    }
    processCallCancelation(fnCallNum) {
        const call = this.fnCallProcs.get(fnCallNum);
        if (!call) {
            return;
        }
        if (call.sub) {
            if (call.sub.onCancel) {
                call.sub.onCancel();
            }
            call.sub.sub.unsubscribe();
        }
        this.fnCallProcs.delete(fnCallNum);
    }
    processObjectDrop(path) {
        if (Array.isArray(path) && (path.length === 1)) {
            this.exposedObjs.drop(path[0]);
        }
        else {
            throw (0, connector_1.makeIPCException)({ invalidPath: true, path });
        }
    }
    processListObj(fnCallNum, path) {
        const obj = this.exposedObjs.find(path);
        if (obj) {
            const lst = Object.keys(obj);
            const buf = protobuf_msg_1.strArrValType.pack({ values: lst });
            this.sendCallReply(fnCallNum, true, buf);
        }
        else {
            const exc = (0, connector_1.makeIPCException)({ 'objectNotFound': true });
            this.sendCallError(fnCallNum, exc);
        }
    }
    exposedServices() {
        const expSrv = {
            exposeDroppableService: this.exposedObjs.exposeDroppableService.bind(this.exposedObjs),
            exposeStaticService: this.exposedObjs.exposeStaticService.bind(this.exposedObjs),
            exposeW3NService: this.exposedObjs.exposeW3NService.bind(this.exposedObjs),
            getOriginalObj: this.exposedObjs.getOriginalObj.bind(this.exposedObjs),
            listObj: path => {
                const obj = this.exposedObjs.find(path);
                return (obj ? Object.keys(obj) : null);
            },
            getObjForTransfer: this.exposedObjs.getObjForTransfer.bind(this.exposedObjs),
            findRefIfAlreadyExposed: this.exposedObjs.findRefIfAlreadyExposed.bind(this.exposedObjs)
        };
        return expSrv;
    }
}
exports.ServicesSideImpl = ServicesSideImpl;
Object.freeze(ServicesSideImpl.prototype);
Object.freeze(ServicesSideImpl);
class ExposedObjs {
    constructor() {
        this.objs = new Map();
        this.objToRefs = new Map();
    }
    exposeDroppableService(objType, exp, original) {
        const ref = this.newRef(objType);
        this.objs.set(ref.path[0], { exp, original, objType });
        this.objToRefs.set(original, ref);
        return ref;
    }
    newRef(objType) {
        let id;
        do {
            id = `${Math.floor(Math.random() * Number.MAX_SAFE_INTEGER)}`;
        } while (this.objs.has(id));
        return {
            objType, path: [id]
        };
    }
    getOriginalObj(ref) {
        const o = this.objs.get(ref.path[0]);
        if (o) {
            return o.original;
        }
        else {
            throw (0, connector_1.makeIPCException)({ 'objectNotFound': true });
        }
    }
    getObjForTransfer(ref) {
        const o = this.objs.get(ref.path[0]);
        if (!o) {
            throw (0, connector_1.makeIPCException)({ 'objectNotFound': true });
        }
        else if (ref.objType !== o.objType) {
            throw (0, connector_1.makeIPCException)({ 'invalidReference': true });
        }
        else {
            return { o: o.original, type: o.objType };
        }
    }
    findRefIfAlreadyExposed(o) {
        return this.objToRefs.get(o);
    }
    exposeW3NService(exp) {
        if (this.objs.has(connector_1.W3N_NAME)) {
            throw new Error(`${connector_1.W3N_NAME} object has already been added`);
        }
        this.objs.set(connector_1.W3N_NAME, {
            exp, original: undefined, objType: 'non-transferable'
        });
    }
    exposeStaticService(objType, exp) {
        const ref = this.newRef(objType);
        this.objs.set(ref.path[0], {
            exp, original: undefined, objType
        });
        return ref;
    }
    drop(name) {
        if (name !== connector_1.W3N_NAME) {
            const o = this.objs.get(name);
            if (o) {
                this.objs.delete(name);
                this.objToRefs.delete(o);
            }
        }
    }
    find(path) {
        if (!Array.isArray(path) || (path.length === 0)) {
            return;
        }
        const rootObj = this.objs.get(path[0]);
        if (!rootObj) {
            return;
        }
        let o = rootObj.exp;
        for (let i = 1; !!o && (i < path.length); i += 1) {
            if (typeof o !== 'object') {
                return;
            }
            o = o[path[i]];
        }
        return o;
    }
    findFn(path) {
        const fn = this.find(path);
        if (typeof fn === 'function') {
            return fn;
        }
        else {
            throw (0, connector_1.makeIPCException)({ callFnNotFound: true, path });
        }
    }
    dropAll() {
        this.objs.clear();
        this.objToRefs.clear();
    }
}
exports.ExposedObjs = ExposedObjs;
Object.freeze(ExposedObjs.prototype);
Object.freeze(ExposedObjs);
Object.freeze(exports);

},{"./connector":60,"./protobuf-msg":61}],60:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2020 - 2024 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.msgProtoType = exports.W3N_NAME = exports.ObjectsConnector = void 0;
exports.makeIPCException = makeIPCException;
exports.checkRefObjTypeIs = checkRefObjTypeIs;
const protobuf_msg_1 = require("./protobuf-msg");
const protobuf_type_1 = require("../lib-client/protobuf-type");
const ipc_proto_1 = require("../protos/ipc.proto");
// Note that make_?_Side functions could've been imported normally, but client
// side uses weakrefs, while services side doesn't, and services side can be
// used in embedding without weakrefs, needing to hide require points.
function makeServicesSide(sendMsg) {
    const srvClassFn = require('./connector-services-side').ServicesSideImpl;
    return new srvClassFn(sendMsg);
}
function makeClientsSide(sendMsg, syncReqToListObj, asyncReqToListObj) {
    const classFn = require('./connector-clients-side').ClientsSideImpl;
    return new classFn(sendMsg, syncReqToListObj, asyncReqToListObj);
}
class ObjectsConnector {
    constructor(side, msgSink, msgSrc, listObj, listObjAsync) {
        this.msgSink = msgSink;
        this.messagingProc = undefined;
        this.messagingProc = msgSrc.subscribe({
            next: msg => this.processIncomingMsg(msg),
            error: err => this.stop(true, err),
            complete: () => this.stop(true)
        });
        const sendMsg = (msg) => {
            if (!this.messagingProc) {
                return;
            }
            this.msgSink.next(msg);
        };
        switch (side) {
            case 'core':
                this.services = makeServicesSide(sendMsg);
                this.clients = makeClientsSide(sendMsg, undefined, undefined);
                break;
            case "client":
                if ((!listObj && !listObjAsync)
                    || (listObj && listObjAsync)) {
                    throw new Error(`Client side needs either listObj, or listObjAsync argument`);
                }
                this.clients = makeClientsSide(sendMsg, listObj, listObjAsync);
                this.services = makeServicesSide(sendMsg);
                break;
        }
        Object.seal(this);
    }
    static makeCoreSide(fromCore, toCore) {
        const connector = new ObjectsConnector('core', fromCore, toCore);
        const { exposeDroppableService, exposeW3NService, findRefIfAlreadyExposed, getObjForTransfer, getOriginalObj, listObj } = connector.services.exposedServices();
        const { registerClientDrop, srvRefOf, startObservableCall, startPromiseCall } = connector.clients.caller();
        return {
            exposedServices: {
                exposeDroppableService, exposeW3NService, findRefIfAlreadyExposed,
                getObjForTransfer, getOriginalObj, listObj
            },
            caller: {
                registerClientDrop, srvRefOf, startObservableCall, startPromiseCall
            },
            close: err => connector.close(err)
        };
    }
    static makeClientSide(fromClient, toClient, listObj, listObjAsync) {
        const connector = new ObjectsConnector('client', fromClient, toClient, listObj, listObjAsync);
        const { exposeDroppableService, findRefIfAlreadyExposed, getObjForTransfer, getOriginalObj, exposeStaticService } = connector.services.exposedServices();
        return {
            caller: connector.clients.caller(),
            exposedServices: {
                exposeDroppableService, findRefIfAlreadyExposed, getObjForTransfer,
                getOriginalObj, exposeStaticService
            },
            close: err => connector.close(err)
        };
    }
    stop(fromRemote, err) {
        this.messagingProc = undefined;
        this.msgSink = undefined;
        if (this.services) {
            this.services.stop();
        }
        if (this.clients) {
            const exc = (fromRemote ?
                makeIPCException({ stopFromOtherSide: true }) :
                makeIPCException({ connectorStop: true }));
            if (err) {
                exc.cause = err;
            }
            this.clients.stop(exc);
        }
    }
    close(err) {
        if (!this.messagingProc) {
            return;
        }
        this.messagingProc.unsubscribe();
        if (err) {
            this.msgSink.error(err);
        }
        else {
            this.msgSink.complete();
        }
        this.stop(false, err);
    }
    processIncomingMsg(msg) {
        var _a, _b, _c, _d, _e, _f, _g;
        const { msgType, path, fnCallNum: cNum } = msg.headers;
        const fnCallNum = (0, protobuf_msg_1.valOfOptInt)(cNum);
        const body = (0, protobuf_msg_1.valOfOpt)(msg.body);
        try {
            if (typeof fnCallNum === 'number') {
                if (msgType === 'start') {
                    (_a = this.services) === null || _a === void 0 ? void 0 : _a.processCallStart(fnCallNum, path, body);
                }
                else if (msgType === 'interim') {
                    (_b = this.clients) === null || _b === void 0 ? void 0 : _b.processInterimCallReply(fnCallNum, body);
                }
                else if (msgType === 'end') {
                    (_c = this.clients) === null || _c === void 0 ? void 0 : _c.processEndCallReply(fnCallNum, body);
                }
                else if (msgType === 'error') {
                    (_d = this.clients) === null || _d === void 0 ? void 0 : _d.processCallError(fnCallNum, body);
                }
                else if (msgType === 'cancel') {
                    (_e = this.services) === null || _e === void 0 ? void 0 : _e.processCallCancelation(fnCallNum);
                }
                else if (msgType === 'list-obj') {
                    (_f = this.services) === null || _f === void 0 ? void 0 : _f.processListObj(fnCallNum, path);
                }
                else {
                    this.sendCallError(fnCallNum, makeIPCException({
                        message: `Got unknown msg type ${msgType}`,
                        invalidType: true
                    }));
                }
            }
            else if (msgType === 'drop') {
                (_g = this.services) === null || _g === void 0 ? void 0 : _g.processObjectDrop(path);
            }
            else {
                throw makeIPCException({ invalidCallNum: true, path });
            }
        }
        catch (err) {
            this.close(err);
        }
    }
    sendCallError(fnCallNum, err) {
        if (!this.messagingProc) {
            return;
        }
        const msg = {
            headers: { fnCallNum: (0, protobuf_msg_1.toVal)(fnCallNum), msgType: 'error' },
            body: (0, protobuf_msg_1.toVal)(protobuf_msg_1.errBodyType.pack((0, protobuf_msg_1.errToMsg)(err)))
        };
        this.msgSink.next(msg);
    }
}
exports.ObjectsConnector = ObjectsConnector;
Object.freeze(ObjectsConnector.prototype);
Object.freeze(ObjectsConnector);
exports.W3N_NAME = 'w3n';
exports.msgProtoType = protobuf_type_1.ProtoType.for(ipc_proto_1.ipc.Envelope);
function makeIPCException(fields) {
    const exc = {
        runtimeException: true,
        type: 'ipc'
    };
    for (const [field, value] of Object.entries(fields)) {
        exc[field] = value;
    }
    return exc;
}
function checkRefObjTypeIs(expected, ref) {
    if (ref.objType !== expected) {
        throw new TypeError(`Expected reference to ${expected} type, instead got ${ref.objType}`);
    }
}
Object.freeze(exports);

},{"../lib-client/protobuf-type":63,"../protos/ipc.proto":76,"./connector-clients-side":58,"./connector-services-side":59,"./protobuf-msg":61}],61:[function(require,module,exports){
(function (Buffer){(function (){
"use strict";
/*
 Copyright (C) 2020 - 2022 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.errBodyType = exports.strArrValType = exports.boolValType = exports.objRefType = void 0;
exports.fixArray = fixArray;
exports.fixInt = fixInt;
exports.valOfOptInt = valOfOptInt;
exports.packInt = packInt;
exports.unpackInt = unpackInt;
exports.errToMsg = errToMsg;
exports.errFromMsg = errFromMsg;
exports.toVal = toVal;
exports.toOptVal = toOptVal;
exports.valOf = valOf;
exports.intValOf = intValOf;
exports.valOfOpt = valOfOpt;
exports.valOfOptJson = valOfOptJson;
exports.toOptJson = toOptJson;
exports.toOptAny = toOptAny;
exports.valOfOptAny = valOfOptAny;
exports.encodeToUtf8 = encodeToUtf8;
exports.decodeFromUtf8 = decodeFromUtf8;
exports.methodPathFor = methodPathFor;
const connector_1 = require("./connector");
const error_1 = require("../lib-common/exceptions/error");
const buffer_utils_1 = require("../lib-common/buffer-utils");
const common_proto_1 = require("../protos/common.proto");
const protobuf_type_1 = require("../lib-client/protobuf-type");
exports.objRefType = protobuf_type_1.ProtoType.for(common_proto_1.common.ObjectReference);
exports.boolValType = protobuf_type_1.ProtoType.for(common_proto_1.common.BooleanValue);
exports.strArrValType = protobuf_type_1.ProtoType.for(common_proto_1.common.StringArrayValue);
function fixArray(arr) {
    return (arr ? arr : []);
}
const MAX_HIGH = 0b111111111111111111111;
function fixInt(uint64) {
    if (typeof uint64 === 'object') {
        const { high, low } = uint64;
        if (high > MAX_HIGH) {
            throw (0, connector_1.makeIPCException)({
                invalidNumInBody: true,
                message: 'Integer is greater than 2^53-1'
            });
        }
        const fixedInt = 0x100000000 * high + ((low < 0) ? 0x100000000 + low : low);
        if (isNaN(fixedInt)) {
            throw new TypeError(`Can't construct integer from a given object`);
        }
        else {
            return fixedInt;
        }
    }
    else if (typeof uint64 === 'string') {
        return Number.parseInt(uint64);
    }
    else if (typeof uint64 === 'number') {
        return uint64;
    }
    else {
        throw new TypeError(`Can't extract integer from ${typeof uint64}`);
    }
}
function valOfOptInt(uint64) {
    if (!uint64) {
        return;
    }
    return intValOf(uint64);
}
const numValType = protobuf_type_1.ProtoType.for(common_proto_1.common.UInt64Value);
function packInt(uint64) {
    return numValType.pack({ value: uint64 });
}
function unpackInt(buf) {
    return fixInt(valOf(numValType.unpack(buf)));
}
exports.errBodyType = protobuf_type_1.ProtoType.for(common_proto_1.common.ErrorValue);
function errToMsg(err) {
    if (typeof err !== 'object') {
        return { err: JSON.stringify(err) };
    }
    else if (err.runtimeException) {
        return { runtimeExcJson: JSON.stringify((0, error_1.recursiveErrJSONify)(err)) };
    }
    else {
        return { err: (0, error_1.stringifyErr)(err) };
    }
}
function errFromMsg(msg) {
    if (msg.runtimeExcJson) {
        return JSON.parse(msg.runtimeExcJson);
    }
    else {
        return new Error(`Error from other side of ipc:\n${msg.err}`);
    }
}
function toVal(value) {
    return { value };
}
function toOptVal(value) {
    return ((value === undefined) ? undefined : { value });
}
function valOf(valObj) {
    return valObj.value;
}
function intValOf(uint64) {
    return fixInt(valOf(uint64));
}
function valOfOpt(valObj) {
    return (valObj ? valObj.value : undefined);
}
function valOfOptJson(valObj) {
    try {
        return (valObj ? JSON.parse(valObj.value) : undefined);
    }
    catch (err) {
        throw (0, connector_1.makeIPCException)({ cause: err, badReply: true });
    }
}
function toOptJson(json) {
    return ((json === undefined) ? undefined : toVal(JSON.stringify(json)));
}
function toOptAny(value) {
    if (value === undefined) {
        return undefined;
    }
    else if (Buffer.isBuffer(value)) {
        return { bytes: toVal(value) };
    }
    else if (ArrayBuffer.isView(value)) {
        return { bytes: toVal((0, buffer_utils_1.toBuffer)(value)) };
    }
    else {
        return { json: toVal(JSON.stringify(value)) };
    }
}
function valOfOptAny(valObj) {
    if (!valObj) {
        return undefined;
    }
    else if (valObj.json) {
        return JSON.parse(valOf(valObj.json));
    }
    else {
        return valOfOpt(valObj.bytes);
    }
}
function encodeToUtf8(str) {
    try {
        const enc = new TextEncoder();
        return enc.encode(str);
    }
    catch (err) {
        return buffer_utils_1.utf8.pack(str);
    }
}
function decodeFromUtf8(bytes) {
    try {
        const dec = new TextDecoder();
        return dec.decode(bytes);
    }
    catch (err) {
        return buffer_utils_1.utf8.open(bytes);
    }
}
function methodPathFor(objPath, method) {
    return objPath.concat(method);
}
Object.freeze(exports);

}).call(this)}).call(this,{"isBuffer":require("../../../is-buffer/index.js")})
},{"../../../is-buffer/index.js":80,"../lib-client/protobuf-type":63,"../lib-common/buffer-utils":65,"../lib-common/exceptions/error":66,"../protos/common.proto":73,"./connector":60}],62:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2020 - 2021, 2024 3NSoft Inc.

 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.

 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.

 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    var desc = Object.getOwnPropertyDescriptor(m, k);
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
      desc = { enumerable: true, get: function() { return m[k]; } };
    }
    Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
    for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.serviceSideJSONWrap = exports.callerSideJSONWrap = exports.exposeLogger = exports.makeLogCaller = exports.exposeSrcService = exports.makeSrcCaller = exports.exposeSinkService = exports.makeSinkCaller = exports.exposeFSService = exports.makeFSCaller = exports.exposeFileService = exports.makeFileCaller = void 0;
__exportStar(require("./core-ipc/common-caps"), exports);
__exportStar(require("./core-ipc/startup-caps"), exports);
__exportStar(require("./ipc-via-protobuf/connector"), exports);
var file_1 = require("./core-ipc/file");
Object.defineProperty(exports, "makeFileCaller", { enumerable: true, get: function () { return file_1.makeFileCaller; } });
Object.defineProperty(exports, "exposeFileService", { enumerable: true, get: function () { return file_1.exposeFileService; } });
var fs_1 = require("./core-ipc/fs");
Object.defineProperty(exports, "makeFSCaller", { enumerable: true, get: function () { return fs_1.makeFSCaller; } });
Object.defineProperty(exports, "exposeFSService", { enumerable: true, get: function () { return fs_1.exposeFSService; } });
var bytes_1 = require("./core-ipc/bytes");
Object.defineProperty(exports, "makeSinkCaller", { enumerable: true, get: function () { return bytes_1.makeSinkCaller; } });
Object.defineProperty(exports, "exposeSinkService", { enumerable: true, get: function () { return bytes_1.exposeSinkService; } });
Object.defineProperty(exports, "makeSrcCaller", { enumerable: true, get: function () { return bytes_1.makeSrcCaller; } });
Object.defineProperty(exports, "exposeSrcService", { enumerable: true, get: function () { return bytes_1.exposeSrcService; } });
var log_cap_1 = require("./core-ipc/log-cap");
Object.defineProperty(exports, "makeLogCaller", { enumerable: true, get: function () { return log_cap_1.makeLogCaller; } });
Object.defineProperty(exports, "exposeLogger", { enumerable: true, get: function () { return log_cap_1.exposeLogger; } });
exports.callerSideJSONWrap = require("./core-ipc/json-ipc-wrapping/caller-side-wrap");
exports.serviceSideJSONWrap = require("./core-ipc/json-ipc-wrapping/service-side-wrap");
Object.freeze(exports);

},{"./core-ipc/bytes":43,"./core-ipc/common-caps":44,"./core-ipc/file":45,"./core-ipc/fs":46,"./core-ipc/json-ipc-wrapping/caller-side-wrap":48,"./core-ipc/json-ipc-wrapping/service-side-wrap":50,"./core-ipc/log-cap":51,"./core-ipc/startup-caps":52,"./ipc-via-protobuf/connector":60}],63:[function(require,module,exports){
(function (Buffer){(function (){
"use strict";
/*
 Copyright (C) 2020 - 2022 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.ProtoType = void 0;
class ProtoType {
    constructor(type) {
        this.type = type;
        this.type = type;
        Object.freeze(this);
    }
    static for(type) {
        return new ProtoType(type);
    }
    pack(msg) {
        const err = this.type.verify(msg);
        if (err) {
            throw new Error(err);
        }
        return this.type.encode(msg).finish();
    }
    unpack(bytes) {
        if (!bytes) {
            throw {
                runtimeException: true,
                type: 'ipc',
                missingBodyBytes: true
            };
        }
        return this.type.decode(bytes);
    }
    packToBase64(msg) {
        return this.pack(msg).toString('base64');
    }
    unpackFromBase64(str) {
        return this.unpack(Buffer.from(str, 'base64'));
    }
}
exports.ProtoType = ProtoType;
Object.freeze(ProtoType.prototype);
Object.freeze(ProtoType);
Object.freeze(exports);

}).call(this)}).call(this,require("buffer").Buffer)
},{"buffer":42}],64:[function(require,module,exports){
"use strict";
/*
 Copyright(c) 2018 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>. */
Object.defineProperty(exports, "__esModule", { value: true });
exports.assert = assert;
function assert(ok, errMsg) {
    if (!ok) {
        throw new Error(errMsg);
    }
}
Object.freeze(exports);

},{}],65:[function(require,module,exports){
(function (Buffer){(function (){
"use strict";
/*
 Copyright (C) 2016, 2018 - 2020, 2025 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>. */
Object.defineProperty(exports, "__esModule", { value: true });
exports.utf8 = exports.base64urlSafe = exports.base64 = exports.EMPTY_BUFFER = void 0;
exports.toBuffer = toBuffer;
exports.bufFromJson = bufFromJson;
exports.joinByteArrs = joinByteArrs;
exports.byteLengthIn = byteLengthIn;
exports.makeUint8ArrayCopy = makeUint8ArrayCopy;
exports.EMPTY_BUFFER = Buffer.alloc(0);
/**
 * Buffer and Uint8Array are intimately linked in Node, starting with some
 * version. As a result, Uint8Array can be efficiently turned into Buffer,
 * or Buffer can be used as Uint8Array.
 * This function checks if given argument is a Buffer, and, if not, does
 * proper enveloping.
 * @param bytes that we need to have as a Buffer
 * @return Buffer with given bytes.
 */
function toBuffer(bytes) {
    if (Buffer.isBuffer(bytes)) {
        return bytes;
    }
    if (bytes.length === 0) {
        return exports.EMPTY_BUFFER;
    }
    return Buffer.from(bytes.buffer, bytes.byteOffset, bytes.length);
}
/**
 * Node's JSON.stringify turns Buffer into a particular json.
 * This function turns this json back to Buffer.
 * @param json of a Buffer
 * @return a Buffer reconstructed from a given json.
 */
function bufFromJson(json) {
    if ((json.type !== 'Buffer') || !Array.isArray(json.data)) {
        throw new Error('Given argument is not a buffer json.');
    }
    return Buffer.from(json.data);
}
var base64;
(function (base64) {
    function pack(bytes) {
        const buf = toBuffer(bytes);
        return buf.toString('base64');
    }
    base64.pack = pack;
    function open(str) {
        return Buffer.from(str, 'base64');
    }
    base64.open = open;
})(base64 || (exports.base64 = base64 = {}));
Object.freeze(base64);
var base64urlSafe;
(function (base64urlSafe) {
    function pack(bytes) {
        const str = base64.pack(bytes);
        return str
            .replace(/\+/g, '-')
            .replace(/\//g, '_');
    }
    base64urlSafe.pack = pack;
    function open(str) {
        str = str
            .replace(/-/g, '+')
            .replace(/_/g, '/');
        return base64.open(str);
    }
    base64urlSafe.open = open;
})(base64urlSafe || (exports.base64urlSafe = base64urlSafe = {}));
Object.freeze(base64);
var utf8;
(function (utf8) {
    function pack(str) {
        return Buffer.from(str, 'utf8');
    }
    utf8.pack = pack;
    function open(bytes) {
        const buf = toBuffer(bytes);
        return buf.toString('utf8');
    }
    utf8.open = open;
})(utf8 || (exports.utf8 = utf8 = {}));
Object.freeze(utf8);
function joinByteArrs(arrs) {
    if (arrs.length === 1) {
        return arrs[0];
    }
    let totalLen = 0;
    for (const arr of arrs) {
        totalLen += arr.length;
    }
    const allBytes = Buffer.allocUnsafe(totalLen);
    let ofs = 0;
    for (const arr of arrs) {
        allBytes.set(arr, ofs);
        ofs += arr.length;
    }
    return allBytes;
}
function byteLengthIn(arrs) {
    let len = 0;
    for (let i = 0; i < arrs.length; i += 1) {
        len += arrs[i].length;
    }
    return len;
}
function makeUint8ArrayCopy(arr) {
    const copy = new Uint8Array(arr.length);
    copy.set(arr);
    return copy;
}
Object.freeze(exports);

}).call(this)}).call(this,require("buffer").Buffer)
},{"buffer":42}],66:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2016 - 2017, 2020, 2022, 2024 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.errWithCause = errWithCause;
exports.recursiveErrJSONify = recursiveErrJSONify;
exports.stringifyErr = stringifyErr;
const runtime_1 = require("./runtime");
function errWithCause(cause, message) {
    if (cause.runtimeException) {
        return (0, runtime_1.makeRuntimeException)('secondary', { message, cause }, {});
    }
    else {
        const err = new Error(message);
        err.cause = cause;
        if (cause.failedCipherVerification) {
            err.failedCipherVerification = true;
        }
        return err;
    }
}
function recursiveErrJSONify(err) {
    if (!err || (typeof err !== 'object') || Array.isArray(err)) {
        return err;
    }
    else if (err.runtimeException) {
        if (err.cause) {
            err.cause = recursiveErrJSONify(err.cause);
        }
        return err;
    }
    else {
        const jsonErr = {
            message: err.message,
            stack: err.stack
        };
        if (err.cause) {
            jsonErr.cause = recursiveErrJSONify(err.cause);
        }
        return jsonErr;
    }
}
function stringifyErr(err) {
    if (!err) {
        return '';
    }
    let json = recursiveErrJSONify(err);
    let errStr;
    if (!json || (typeof json !== 'object') || err.runtimeException) {
        try {
            errStr = ((typeof json === 'string') ?
                json : `${JSON.stringify(json, null, '  ')}\n`);
        }
        catch (jsonErr) {
            errStr = `<report-error>${jsonErr.message}</report-error>\n`;
        }
    }
    else {
        errStr = `\nError message: ${json.message}\n`;
        if (json.stack) {
            errStr += `Error stack: ${json.stack}\n`;
        }
        if (json.cause) {
            try {
                let causeStr = ((typeof json.cause === 'string') ?
                    json.cause : JSON.stringify(json.cause, null, '  '));
                errStr += `Caused by: ${causeStr}\n`;
            }
            catch (jsonErr) {
                errStr += `Caused by:\n<report-error>${jsonErr.message}</report-error>\n`;
            }
        }
    }
    return errStr.split('\\n').join('\n').split('\\\\').join('\\');
}
Object.freeze(exports);

},{"./runtime":67}],67:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2021, 2026 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.makeRuntimeException = makeRuntimeException;
exports.getStackHere = getStackHere;
function makeRuntimeException(type, params, flags, addStack = false) {
    const exc = {
        runtimeException: true,
        type,
    };
    for (const [field, val] of Object.entries(params)) {
        if (val !== undefined) {
            exc[field] = val;
        }
    }
    for (const [field, val] of Object.entries(flags)) {
        if (val === true) {
            exc[field] = val;
        }
    }
    if (addStack) {
        exc.stack = getStackHere(1);
    }
    return exc;
}
/**
 *
 * @param numOfTopLayersToRemove
 * @returns
 */
function getStackHere(numOfTopLayersToRemove = 0) {
    var _a;
    const err = new Error('stack');
    return (_a = err.stack) === null || _a === void 0 ? void 0 : _a.split('\n').slice(2 + numOfTopLayersToRemove).join('\n');
}
Object.freeze(exports);

},{}],68:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2016 - 2018 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.copy = copy;
exports.deepEqual = deepEqual;
exports.deepFind = deepFind;
exports.applyChangesToJSON = applyChangesToJSON;
/**
 * This function creates a copy of json entity with a caveat that Buffer and
 * byte arrays are shared between original and a copy.
 * @param orig is an object, which copy is created. Buffer and byte arrays
 * passed through like primitives.
 * @param excludeTopFields is an optional list of fields to exclude from copy.
 */
function copy(orig, excludeTopFields) {
    const origType = typeof orig;
    if (origType !== 'object') {
        return ((origType !== 'function') ? orig : undefined);
    }
    if (orig === null) {
        return null;
    }
    if (ArrayBuffer.isView(orig)) {
        return orig;
    }
    if (Array.isArray(orig)) {
        const arr = orig;
        const c = [];
        for (let i = 0; i < arr.length; i += 1) {
            c[i] = copy(arr[i]);
        }
        return c;
    }
    else {
        const c = {};
        const fields = Object.keys(orig);
        if (excludeTopFields) {
            for (const f of fields) {
                if (excludeTopFields.includes(f)) {
                    continue;
                }
                c[f] = copy(orig[f]);
            }
        }
        else {
            for (const f of fields) {
                c[f] = copy(orig[f]);
            }
        }
        return c;
    }
}
function deepEqual(a, b) {
    const t = typeof a;
    if (t !== typeof b) {
        return false;
    }
    if (t !== 'object') {
        return (a === b);
    }
    if (a === b) {
        return true;
    }
    if ((a === null) || (b === null)) {
        return false;
    }
    if (Array.isArray(a)) {
        if (!Array.isArray(b)) {
            return false;
        }
        const aArr = a;
        const bArr = b;
        if (aArr.length !== bArr.length) {
            return false;
        }
        for (let i = 0; i < aArr.length; i += 1) {
            if (!deepEqual(aArr[i], bArr[i])) {
                return false;
            }
        }
    }
    else {
        const keys = Object.keys(a);
        if (keys.length !== Object.keys(b).length) {
            return false;
        }
        for (let i = 0; i < keys.length; i += 1) {
            const key = keys[i];
            if (!deepEqual(a[key], b[key])) {
                return false;
            }
        }
    }
    return true;
}
function* deepFind(a, predicate) {
    if ((typeof a !== 'object') || !a) {
        if (predicate(a)) {
            yield { pos: [], val: a };
        }
        return;
    }
    for (const field in a) {
        const val = a[field];
        if (predicate(val)) {
            yield { pos: [field], val };
        }
        else {
            for (const inner of deepFind(val, predicate)) {
                inner.pos.unshift(field);
                yield inner;
            }
        }
    }
}
/**
 * This function applies given changes to object.
 * @param json is an object that is being changed
 * @param changes is a set of changes to apply to an object. Undefined value in
 * in a fields means that respective field should be deleted from an object.
 */
function applyChangesToJSON(json, changes) {
    for (const f of Object.keys(changes)) {
        const newValue = changes[f];
        if (newValue === undefined) {
            delete json[f];
        }
        else {
            json[f] = newValue;
        }
    }
}
Object.freeze(exports);

},{}],69:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2015, 2017, 2019 - 2022 3NSoft Inc.
 
 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, either version 3 of the License, or (at your option) any later
 version.
 
 This program is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License along with
 this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.defer = defer;
function defer() {
    const d = {};
    d.promise = new Promise((resolve, reject) => {
        d.resolve = resolve;
        d.reject = reject;
    });
    Object.freeze(d);
    return d;
}
Object.freeze(exports);

},{}],70:[function(require,module,exports){
"use strict";
/*
 Copyright (C) 2017, 2019 - 2020, 2022 3NSoft Inc.

 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

 This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

 You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.Broadcast = void 0;
exports.flatMapComplete = flatMapComplete;
exports.allowOnlySingleStart = allowOnlySingleStart;
exports.flatTap = flatTap;
exports.toRxObserver = toRxObserver;
const rxjs_1 = require("rxjs");
const operators_1 = require("rxjs/operators");
/**
 * This is a pipeable operator that runs given async process on completion and
 * sends result downstream, followed by complete signal.
 * @param mapCompletion async map of completion to one more event.
 */
function flatMapComplete(mapCompletion) {
    return src => new rxjs_1.Observable(downstream => src.subscribe({
        next: x => downstream.next(x),
        error: err => downstream.error(err),
        complete: () => mapCompletion().then(mapped => {
            downstream.next(mapped);
            downstream.complete();
        }, err => downstream.error(err))
    }));
}
/**
 * This is a pipeable operator that allows only one start of an upstream
 * process, irrespectful of how many subscribe calls happen downstream.
 * Use share after this operator when several branches of processing are needed.
 * Combination of this operand and share ensures that upstream process can be
 * started only once.
 */
function allowOnlySingleStart() {
    let wasStarted = false;
    let isComplete = false;
    let okCompletion = false;
    let err = undefined;
    return src => new rxjs_1.Observable(downstream => {
        if (wasStarted) {
            if (!isComplete) {
                throw new Error(`Attempt to subscribe, when process hasn't completed indicates that functional closure is captured and called somewhere else, not in accordance with expected rxjs processing.`);
            }
            if (okCompletion) {
                return (0, rxjs_1.of)().subscribe(downstream);
            }
            else {
                return (0, rxjs_1.throwError)(err).subscribe(downstream);
            }
        }
        else {
            wasStarted = true;
            return src.pipe((0, operators_1.tap)({
                error: e => {
                    isComplete = true;
                    err = e;
                },
                complete: () => {
                    isComplete = true;
                    okCompletion = true;
                }
            })).subscribe(downstream);
        }
    });
}
/**
 * This is a pipeable operator that is like tap, but takes in async functions,
 * ensuring that they complete running before passing events to downstream.
 * At least one tapping function should be given.
 * @param onNext
 * @param onError
 * @param onComplete
 */
function flatTap(onNext, onError, onComplete) {
    if (!onNext && !onError && !onComplete) {
        throw new Error(`No tapping function given.`);
    }
    return src => new rxjs_1.Observable(downstream => src.subscribe({
        next: (onNext ?
            x => onNext(x).then(() => downstream.next(x), err => downstream.error(err)) :
            x => downstream.next(x)),
        error: (onError ?
            err => onError(err).then(() => downstream.error(err), err2 => downstream.error(err)) :
            err => downstream.error(err)),
        complete: (onComplete ?
            () => onComplete().then(() => downstream.complete(), err => downstream.error(err)) :
            () => downstream.complete())
    }));
}
/**
 * @param obs
 * @return given observer, or one with noop's in place of missing functions
 */
function toRxObserver(obs) {
    if (obs.next && obs.error && obs.complete) {
        return obs;
    }
    else {
        const next = (obs.next ? obs.next.bind(obs) : noop);
        const complete = (obs.complete ? obs.complete.bind(obs) : noop);
        const error = (obs.error ? obs.error.bind(obs) : noop);
        return { next, complete, error };
    }
}
function noop() { }
class Broadcast {
    constructor() {
        this.src = new rxjs_1.Subject();
        this.event$ = this.src.asObservable().pipe((0, operators_1.share)());
        this.sub = this.event$.subscribe(toRxObserver({}));
        Object.seal(this);
    }
    next(ev) {
        if (!this.sub) {
            return;
        }
        this.src.next(ev);
    }
    done(err) {
        if (!this.sub) {
            return;
        }
        if (err) {
            this.src.error(err);
        }
        else {
            this.src.complete();
        }
        this.sub = undefined;
    }
    isON() {
        return !!this.sub;
    }
}
exports.Broadcast = Broadcast;
Object.freeze(Broadcast.prototype);
Object.freeze(Broadcast);

},{"rxjs":95,"rxjs/operators":320}],71:[function(require,module,exports){
/*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.asmail = (function() {

    /**
     * Namespace asmail.
     * @exports asmail
     * @namespace
     */
    var asmail = {};

    asmail.ListMsgsRequestBody = (function() {

        /**
         * Properties of a ListMsgsRequestBody.
         * @memberof asmail
         * @interface IListMsgsRequestBody
         * @property {common.IUInt64Value|null} [fromTS] ListMsgsRequestBody fromTS
         */

        /**
         * Constructs a new ListMsgsRequestBody.
         * @memberof asmail
         * @classdesc Represents a ListMsgsRequestBody.
         * @implements IListMsgsRequestBody
         * @constructor
         * @param {asmail.IListMsgsRequestBody=} [properties] Properties to set
         */
        function ListMsgsRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ListMsgsRequestBody fromTS.
         * @member {common.IUInt64Value|null|undefined} fromTS
         * @memberof asmail.ListMsgsRequestBody
         * @instance
         */
        ListMsgsRequestBody.prototype.fromTS = null;

        /**
         * Creates a new ListMsgsRequestBody instance using the specified properties.
         * @function create
         * @memberof asmail.ListMsgsRequestBody
         * @static
         * @param {asmail.IListMsgsRequestBody=} [properties] Properties to set
         * @returns {asmail.ListMsgsRequestBody} ListMsgsRequestBody instance
         */
        ListMsgsRequestBody.create = function create(properties) {
            return new ListMsgsRequestBody(properties);
        };

        /**
         * Encodes the specified ListMsgsRequestBody message. Does not implicitly {@link asmail.ListMsgsRequestBody.verify|verify} messages.
         * @function encode
         * @memberof asmail.ListMsgsRequestBody
         * @static
         * @param {asmail.IListMsgsRequestBody} message ListMsgsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ListMsgsRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.fromTS != null && Object.hasOwnProperty.call(message, "fromTS"))
                $root.common.UInt64Value.encode(message.fromTS, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified ListMsgsRequestBody message, length delimited. Does not implicitly {@link asmail.ListMsgsRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof asmail.ListMsgsRequestBody
         * @static
         * @param {asmail.IListMsgsRequestBody} message ListMsgsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ListMsgsRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a ListMsgsRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof asmail.ListMsgsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {asmail.ListMsgsRequestBody} ListMsgsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ListMsgsRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.ListMsgsRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.fromTS = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a ListMsgsRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof asmail.ListMsgsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {asmail.ListMsgsRequestBody} ListMsgsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ListMsgsRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a ListMsgsRequestBody message.
         * @function verify
         * @memberof asmail.ListMsgsRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ListMsgsRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.fromTS != null && Object.hasOwnProperty.call(message, "fromTS")) {
                var error = $root.common.UInt64Value.verify(message.fromTS, long + 1);
                if (error)
                    return "fromTS." + error;
            }
            return null;
        };

        /**
         * Creates a ListMsgsRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof asmail.ListMsgsRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {asmail.ListMsgsRequestBody} ListMsgsRequestBody
         */
        ListMsgsRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.asmail.ListMsgsRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".asmail.ListMsgsRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.asmail.ListMsgsRequestBody();
            if (object.fromTS != null) {
                if (!$util.isObject(object.fromTS))
                    throw TypeError(".asmail.ListMsgsRequestBody.fromTS: object expected");
                message.fromTS = $root.common.UInt64Value.fromObject(object.fromTS, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a ListMsgsRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof asmail.ListMsgsRequestBody
         * @static
         * @param {asmail.ListMsgsRequestBody} message ListMsgsRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ListMsgsRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.fromTS = null;
            if (message.fromTS != null && Object.hasOwnProperty.call(message, "fromTS"))
                object.fromTS = $root.common.UInt64Value.toObject(message.fromTS, options, q + 1);
            return object;
        };

        /**
         * Converts this ListMsgsRequestBody to JSON.
         * @function toJSON
         * @memberof asmail.ListMsgsRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ListMsgsRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ListMsgsRequestBody
         * @function getTypeUrl
         * @memberof asmail.ListMsgsRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ListMsgsRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/asmail.ListMsgsRequestBody";
        };

        return ListMsgsRequestBody;
    })();

    asmail.ListMsgsInboxReplyBody = (function() {

        /**
         * Properties of a ListMsgsInboxReplyBody.
         * @memberof asmail
         * @interface IListMsgsInboxReplyBody
         * @property {Array.<asmail.ListMsgsInboxReplyBody.IMsgInfo>|null} [infos] ListMsgsInboxReplyBody infos
         */

        /**
         * Constructs a new ListMsgsInboxReplyBody.
         * @memberof asmail
         * @classdesc Represents a ListMsgsInboxReplyBody.
         * @implements IListMsgsInboxReplyBody
         * @constructor
         * @param {asmail.IListMsgsInboxReplyBody=} [properties] Properties to set
         */
        function ListMsgsInboxReplyBody(properties) {
            this.infos = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ListMsgsInboxReplyBody infos.
         * @member {Array.<asmail.ListMsgsInboxReplyBody.IMsgInfo>} infos
         * @memberof asmail.ListMsgsInboxReplyBody
         * @instance
         */
        ListMsgsInboxReplyBody.prototype.infos = $util.emptyArray;

        /**
         * Creates a new ListMsgsInboxReplyBody instance using the specified properties.
         * @function create
         * @memberof asmail.ListMsgsInboxReplyBody
         * @static
         * @param {asmail.IListMsgsInboxReplyBody=} [properties] Properties to set
         * @returns {asmail.ListMsgsInboxReplyBody} ListMsgsInboxReplyBody instance
         */
        ListMsgsInboxReplyBody.create = function create(properties) {
            return new ListMsgsInboxReplyBody(properties);
        };

        /**
         * Encodes the specified ListMsgsInboxReplyBody message. Does not implicitly {@link asmail.ListMsgsInboxReplyBody.verify|verify} messages.
         * @function encode
         * @memberof asmail.ListMsgsInboxReplyBody
         * @static
         * @param {asmail.IListMsgsInboxReplyBody} message ListMsgsInboxReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ListMsgsInboxReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.infos != null && message.infos.length)
                for (var i = 0; i < message.infos.length; ++i)
                    $root.asmail.ListMsgsInboxReplyBody.MsgInfo.encode(message.infos[i], writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified ListMsgsInboxReplyBody message, length delimited. Does not implicitly {@link asmail.ListMsgsInboxReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof asmail.ListMsgsInboxReplyBody
         * @static
         * @param {asmail.IListMsgsInboxReplyBody} message ListMsgsInboxReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ListMsgsInboxReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a ListMsgsInboxReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof asmail.ListMsgsInboxReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {asmail.ListMsgsInboxReplyBody} ListMsgsInboxReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ListMsgsInboxReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.ListMsgsInboxReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.infos && message.infos.length))
                            message.infos = [];
                        message.infos.push($root.asmail.ListMsgsInboxReplyBody.MsgInfo.decode(reader, reader.uint32(), undefined, long + 1));
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a ListMsgsInboxReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof asmail.ListMsgsInboxReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {asmail.ListMsgsInboxReplyBody} ListMsgsInboxReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ListMsgsInboxReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a ListMsgsInboxReplyBody message.
         * @function verify
         * @memberof asmail.ListMsgsInboxReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ListMsgsInboxReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.infos != null && Object.hasOwnProperty.call(message, "infos")) {
                if (!Array.isArray(message.infos))
                    return "infos: array expected";
                for (var i = 0; i < message.infos.length; ++i) {
                    var error = $root.asmail.ListMsgsInboxReplyBody.MsgInfo.verify(message.infos[i], long + 1);
                    if (error)
                        return "infos." + error;
                }
            }
            return null;
        };

        /**
         * Creates a ListMsgsInboxReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof asmail.ListMsgsInboxReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {asmail.ListMsgsInboxReplyBody} ListMsgsInboxReplyBody
         */
        ListMsgsInboxReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.asmail.ListMsgsInboxReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".asmail.ListMsgsInboxReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.asmail.ListMsgsInboxReplyBody();
            if (object.infos) {
                if (!Array.isArray(object.infos))
                    throw TypeError(".asmail.ListMsgsInboxReplyBody.infos: array expected");
                message.infos = [];
                for (var i = 0; i < object.infos.length; ++i) {
                    if (!$util.isObject(object.infos[i]))
                        throw TypeError(".asmail.ListMsgsInboxReplyBody.infos: object expected");
                    message.infos[i] = $root.asmail.ListMsgsInboxReplyBody.MsgInfo.fromObject(object.infos[i], long + 1);
                }
            }
            return message;
        };

        /**
         * Creates a plain object from a ListMsgsInboxReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof asmail.ListMsgsInboxReplyBody
         * @static
         * @param {asmail.ListMsgsInboxReplyBody} message ListMsgsInboxReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ListMsgsInboxReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.infos = [];
            if (message.infos && message.infos.length) {
                object.infos = [];
                for (var j = 0; j < message.infos.length; ++j)
                    object.infos[j] = $root.asmail.ListMsgsInboxReplyBody.MsgInfo.toObject(message.infos[j], options, q + 1);
            }
            return object;
        };

        /**
         * Converts this ListMsgsInboxReplyBody to JSON.
         * @function toJSON
         * @memberof asmail.ListMsgsInboxReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ListMsgsInboxReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ListMsgsInboxReplyBody
         * @function getTypeUrl
         * @memberof asmail.ListMsgsInboxReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ListMsgsInboxReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/asmail.ListMsgsInboxReplyBody";
        };

        ListMsgsInboxReplyBody.MsgInfo = (function() {

            /**
             * Properties of a MsgInfo.
             * @memberof asmail.ListMsgsInboxReplyBody
             * @interface IMsgInfo
             * @property {string|null} [msgId] MsgInfo msgId
             * @property {number|Long|null} [deliveryTS] MsgInfo deliveryTS
             * @property {string|null} [msgType] MsgInfo msgType
             */

            /**
             * Constructs a new MsgInfo.
             * @memberof asmail.ListMsgsInboxReplyBody
             * @classdesc Represents a MsgInfo.
             * @implements IMsgInfo
             * @constructor
             * @param {asmail.ListMsgsInboxReplyBody.IMsgInfo=} [properties] Properties to set
             */
            function MsgInfo(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * MsgInfo msgId.
             * @member {string} msgId
             * @memberof asmail.ListMsgsInboxReplyBody.MsgInfo
             * @instance
             */
            MsgInfo.prototype.msgId = "";

            /**
             * MsgInfo deliveryTS.
             * @member {number|Long} deliveryTS
             * @memberof asmail.ListMsgsInboxReplyBody.MsgInfo
             * @instance
             */
            MsgInfo.prototype.deliveryTS = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

            /**
             * MsgInfo msgType.
             * @member {string} msgType
             * @memberof asmail.ListMsgsInboxReplyBody.MsgInfo
             * @instance
             */
            MsgInfo.prototype.msgType = "";

            /**
             * Creates a new MsgInfo instance using the specified properties.
             * @function create
             * @memberof asmail.ListMsgsInboxReplyBody.MsgInfo
             * @static
             * @param {asmail.ListMsgsInboxReplyBody.IMsgInfo=} [properties] Properties to set
             * @returns {asmail.ListMsgsInboxReplyBody.MsgInfo} MsgInfo instance
             */
            MsgInfo.create = function create(properties) {
                return new MsgInfo(properties);
            };

            /**
             * Encodes the specified MsgInfo message. Does not implicitly {@link asmail.ListMsgsInboxReplyBody.MsgInfo.verify|verify} messages.
             * @function encode
             * @memberof asmail.ListMsgsInboxReplyBody.MsgInfo
             * @static
             * @param {asmail.ListMsgsInboxReplyBody.IMsgInfo} message MsgInfo message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            MsgInfo.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.msgId != null && Object.hasOwnProperty.call(message, "msgId"))
                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.msgId);
                if (message.deliveryTS != null && Object.hasOwnProperty.call(message, "deliveryTS"))
                    writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.deliveryTS);
                if (message.msgType != null && Object.hasOwnProperty.call(message, "msgType"))
                    writer.uint32(/* id 10, wireType 2 =*/82).string(message.msgType);
                return writer;
            };

            /**
             * Encodes the specified MsgInfo message, length delimited. Does not implicitly {@link asmail.ListMsgsInboxReplyBody.MsgInfo.verify|verify} messages.
             * @function encodeDelimited
             * @memberof asmail.ListMsgsInboxReplyBody.MsgInfo
             * @static
             * @param {asmail.ListMsgsInboxReplyBody.IMsgInfo} message MsgInfo message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            MsgInfo.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes a MsgInfo message from the specified reader or buffer.
             * @function decode
             * @memberof asmail.ListMsgsInboxReplyBody.MsgInfo
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {asmail.ListMsgsInboxReplyBody.MsgInfo} MsgInfo
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            MsgInfo.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.ListMsgsInboxReplyBody.MsgInfo();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.msgId = reader.string();
                            break;
                        }
                    case 2: {
                            message.deliveryTS = reader.uint64();
                            break;
                        }
                    case 10: {
                            message.msgType = reader.string();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a MsgInfo message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof asmail.ListMsgsInboxReplyBody.MsgInfo
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {asmail.ListMsgsInboxReplyBody.MsgInfo} MsgInfo
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            MsgInfo.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a MsgInfo message.
             * @function verify
             * @memberof asmail.ListMsgsInboxReplyBody.MsgInfo
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            MsgInfo.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.msgId != null && Object.hasOwnProperty.call(message, "msgId"))
                    if (!$util.isString(message.msgId))
                        return "msgId: string expected";
                if (message.deliveryTS != null && Object.hasOwnProperty.call(message, "deliveryTS"))
                    if (!$util.isInteger(message.deliveryTS) && !(message.deliveryTS && $util.isInteger(message.deliveryTS.low) && $util.isInteger(message.deliveryTS.high)))
                        return "deliveryTS: integer|Long expected";
                if (message.msgType != null && Object.hasOwnProperty.call(message, "msgType"))
                    if (!$util.isString(message.msgType))
                        return "msgType: string expected";
                return null;
            };

            /**
             * Creates a MsgInfo message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof asmail.ListMsgsInboxReplyBody.MsgInfo
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {asmail.ListMsgsInboxReplyBody.MsgInfo} MsgInfo
             */
            MsgInfo.fromObject = function fromObject(object, long) {
                if (object instanceof $root.asmail.ListMsgsInboxReplyBody.MsgInfo)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".asmail.ListMsgsInboxReplyBody.MsgInfo: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.asmail.ListMsgsInboxReplyBody.MsgInfo();
                if (object.msgId != null)
                    message.msgId = String(object.msgId);
                if (object.deliveryTS != null)
                    if ($util.Long)
                        message.deliveryTS = $util.Long.fromValue(object.deliveryTS, true);
                    else if (typeof object.deliveryTS === "string")
                        message.deliveryTS = parseInt(object.deliveryTS, 10);
                    else if (typeof object.deliveryTS === "number")
                        message.deliveryTS = object.deliveryTS;
                    else if (typeof object.deliveryTS === "object")
                        message.deliveryTS = new $util.LongBits(object.deliveryTS.low >>> 0, object.deliveryTS.high >>> 0).toNumber(true);
                if (object.msgType != null)
                    message.msgType = String(object.msgType);
                return message;
            };

            /**
             * Creates a plain object from a MsgInfo message. Also converts values to other types if specified.
             * @function toObject
             * @memberof asmail.ListMsgsInboxReplyBody.MsgInfo
             * @static
             * @param {asmail.ListMsgsInboxReplyBody.MsgInfo} message MsgInfo
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            MsgInfo.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults) {
                    object.msgId = "";
                    if ($util.Long) {
                        var long = new $util.Long(0, 0, true);
                        object.deliveryTS = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                    } else
                        object.deliveryTS = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                    object.msgType = "";
                }
                if (message.msgId != null && Object.hasOwnProperty.call(message, "msgId"))
                    object.msgId = message.msgId;
                if (message.deliveryTS != null && Object.hasOwnProperty.call(message, "deliveryTS"))
                    if (typeof BigInt !== "undefined" && options.longs === BigInt)
                        object.deliveryTS = typeof message.deliveryTS === "number" ? BigInt(message.deliveryTS) : $util.Long.fromBits(message.deliveryTS.low >>> 0, message.deliveryTS.high >>> 0, true).toBigInt();
                    else if (typeof message.deliveryTS === "number")
                        object.deliveryTS = options.longs === String ? String(message.deliveryTS) : message.deliveryTS;
                    else
                        object.deliveryTS = options.longs === String ? $util.Long.prototype.toString.call(message.deliveryTS) : options.longs === Number ? new $util.LongBits(message.deliveryTS.low >>> 0, message.deliveryTS.high >>> 0).toNumber(true) : message.deliveryTS;
                if (message.msgType != null && Object.hasOwnProperty.call(message, "msgType"))
                    object.msgType = message.msgType;
                return object;
            };

            /**
             * Converts this MsgInfo to JSON.
             * @function toJSON
             * @memberof asmail.ListMsgsInboxReplyBody.MsgInfo
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            MsgInfo.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for MsgInfo
             * @function getTypeUrl
             * @memberof asmail.ListMsgsInboxReplyBody.MsgInfo
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            MsgInfo.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/asmail.ListMsgsInboxReplyBody.MsgInfo";
            };

            return MsgInfo;
        })();

        return ListMsgsInboxReplyBody;
    })();

    asmail.RemoveMsgRequestBody = (function() {

        /**
         * Properties of a RemoveMsgRequestBody.
         * @memberof asmail
         * @interface IRemoveMsgRequestBody
         * @property {string|null} [msgId] RemoveMsgRequestBody msgId
         */

        /**
         * Constructs a new RemoveMsgRequestBody.
         * @memberof asmail
         * @classdesc Represents a RemoveMsgRequestBody.
         * @implements IRemoveMsgRequestBody
         * @constructor
         * @param {asmail.IRemoveMsgRequestBody=} [properties] Properties to set
         */
        function RemoveMsgRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * RemoveMsgRequestBody msgId.
         * @member {string} msgId
         * @memberof asmail.RemoveMsgRequestBody
         * @instance
         */
        RemoveMsgRequestBody.prototype.msgId = "";

        /**
         * Creates a new RemoveMsgRequestBody instance using the specified properties.
         * @function create
         * @memberof asmail.RemoveMsgRequestBody
         * @static
         * @param {asmail.IRemoveMsgRequestBody=} [properties] Properties to set
         * @returns {asmail.RemoveMsgRequestBody} RemoveMsgRequestBody instance
         */
        RemoveMsgRequestBody.create = function create(properties) {
            return new RemoveMsgRequestBody(properties);
        };

        /**
         * Encodes the specified RemoveMsgRequestBody message. Does not implicitly {@link asmail.RemoveMsgRequestBody.verify|verify} messages.
         * @function encode
         * @memberof asmail.RemoveMsgRequestBody
         * @static
         * @param {asmail.IRemoveMsgRequestBody} message RemoveMsgRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        RemoveMsgRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.msgId != null && Object.hasOwnProperty.call(message, "msgId"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.msgId);
            return writer;
        };

        /**
         * Encodes the specified RemoveMsgRequestBody message, length delimited. Does not implicitly {@link asmail.RemoveMsgRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof asmail.RemoveMsgRequestBody
         * @static
         * @param {asmail.IRemoveMsgRequestBody} message RemoveMsgRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        RemoveMsgRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a RemoveMsgRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof asmail.RemoveMsgRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {asmail.RemoveMsgRequestBody} RemoveMsgRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        RemoveMsgRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.RemoveMsgRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.msgId = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a RemoveMsgRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof asmail.RemoveMsgRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {asmail.RemoveMsgRequestBody} RemoveMsgRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        RemoveMsgRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a RemoveMsgRequestBody message.
         * @function verify
         * @memberof asmail.RemoveMsgRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        RemoveMsgRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.msgId != null && Object.hasOwnProperty.call(message, "msgId"))
                if (!$util.isString(message.msgId))
                    return "msgId: string expected";
            return null;
        };

        /**
         * Creates a RemoveMsgRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof asmail.RemoveMsgRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {asmail.RemoveMsgRequestBody} RemoveMsgRequestBody
         */
        RemoveMsgRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.asmail.RemoveMsgRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".asmail.RemoveMsgRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.asmail.RemoveMsgRequestBody();
            if (object.msgId != null)
                message.msgId = String(object.msgId);
            return message;
        };

        /**
         * Creates a plain object from a RemoveMsgRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof asmail.RemoveMsgRequestBody
         * @static
         * @param {asmail.RemoveMsgRequestBody} message RemoveMsgRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        RemoveMsgRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.msgId = "";
            if (message.msgId != null && Object.hasOwnProperty.call(message, "msgId"))
                object.msgId = message.msgId;
            return object;
        };

        /**
         * Converts this RemoveMsgRequestBody to JSON.
         * @function toJSON
         * @memberof asmail.RemoveMsgRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        RemoveMsgRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for RemoveMsgRequestBody
         * @function getTypeUrl
         * @memberof asmail.RemoveMsgRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        RemoveMsgRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/asmail.RemoveMsgRequestBody";
        };

        return RemoveMsgRequestBody;
    })();

    asmail.GetMsgRequestBody = (function() {

        /**
         * Properties of a GetMsgRequestBody.
         * @memberof asmail
         * @interface IGetMsgRequestBody
         * @property {string|null} [msgId] GetMsgRequestBody msgId
         */

        /**
         * Constructs a new GetMsgRequestBody.
         * @memberof asmail
         * @classdesc Represents a GetMsgRequestBody.
         * @implements IGetMsgRequestBody
         * @constructor
         * @param {asmail.IGetMsgRequestBody=} [properties] Properties to set
         */
        function GetMsgRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * GetMsgRequestBody msgId.
         * @member {string} msgId
         * @memberof asmail.GetMsgRequestBody
         * @instance
         */
        GetMsgRequestBody.prototype.msgId = "";

        /**
         * Creates a new GetMsgRequestBody instance using the specified properties.
         * @function create
         * @memberof asmail.GetMsgRequestBody
         * @static
         * @param {asmail.IGetMsgRequestBody=} [properties] Properties to set
         * @returns {asmail.GetMsgRequestBody} GetMsgRequestBody instance
         */
        GetMsgRequestBody.create = function create(properties) {
            return new GetMsgRequestBody(properties);
        };

        /**
         * Encodes the specified GetMsgRequestBody message. Does not implicitly {@link asmail.GetMsgRequestBody.verify|verify} messages.
         * @function encode
         * @memberof asmail.GetMsgRequestBody
         * @static
         * @param {asmail.IGetMsgRequestBody} message GetMsgRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        GetMsgRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.msgId != null && Object.hasOwnProperty.call(message, "msgId"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.msgId);
            return writer;
        };

        /**
         * Encodes the specified GetMsgRequestBody message, length delimited. Does not implicitly {@link asmail.GetMsgRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof asmail.GetMsgRequestBody
         * @static
         * @param {asmail.IGetMsgRequestBody} message GetMsgRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        GetMsgRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a GetMsgRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof asmail.GetMsgRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {asmail.GetMsgRequestBody} GetMsgRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        GetMsgRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.GetMsgRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.msgId = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a GetMsgRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof asmail.GetMsgRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {asmail.GetMsgRequestBody} GetMsgRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        GetMsgRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a GetMsgRequestBody message.
         * @function verify
         * @memberof asmail.GetMsgRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        GetMsgRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.msgId != null && Object.hasOwnProperty.call(message, "msgId"))
                if (!$util.isString(message.msgId))
                    return "msgId: string expected";
            return null;
        };

        /**
         * Creates a GetMsgRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof asmail.GetMsgRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {asmail.GetMsgRequestBody} GetMsgRequestBody
         */
        GetMsgRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.asmail.GetMsgRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".asmail.GetMsgRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.asmail.GetMsgRequestBody();
            if (object.msgId != null)
                message.msgId = String(object.msgId);
            return message;
        };

        /**
         * Creates a plain object from a GetMsgRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof asmail.GetMsgRequestBody
         * @static
         * @param {asmail.GetMsgRequestBody} message GetMsgRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        GetMsgRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.msgId = "";
            if (message.msgId != null && Object.hasOwnProperty.call(message, "msgId"))
                object.msgId = message.msgId;
            return object;
        };

        /**
         * Converts this GetMsgRequestBody to JSON.
         * @function toJSON
         * @memberof asmail.GetMsgRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        GetMsgRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for GetMsgRequestBody
         * @function getTypeUrl
         * @memberof asmail.GetMsgRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        GetMsgRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/asmail.GetMsgRequestBody";
        };

        return GetMsgRequestBody;
    })();

    asmail.IncomingMessageMsg = (function() {

        /**
         * Properties of an IncomingMessageMsg.
         * @memberof asmail
         * @interface IIncomingMessageMsg
         * @property {string|null} [msgId] IncomingMessageMsg msgId
         * @property {number|Long|null} [deliveryTS] IncomingMessageMsg deliveryTS
         * @property {string|null} [sender] IncomingMessageMsg sender
         * @property {boolean|null} [establishedSenderKeyChain] IncomingMessageMsg establishedSenderKeyChain
         * @property {string|null} [msgType] IncomingMessageMsg msgType
         * @property {Array.<string>|null} [recipients] IncomingMessageMsg recipients
         * @property {common.IStringValue|null} [subject] IncomingMessageMsg subject
         * @property {common.IStringValue|null} [plainTxtBody] IncomingMessageMsg plainTxtBody
         * @property {common.IStringValue|null} [htmlTxtBody] IncomingMessageMsg htmlTxtBody
         * @property {common.IStringValue|null} [jsonBody] IncomingMessageMsg jsonBody
         * @property {Array.<string>|null} [carbonCopy] IncomingMessageMsg carbonCopy
         * @property {fs.IFS|null} [attachments] IncomingMessageMsg attachments
         */

        /**
         * Constructs a new IncomingMessageMsg.
         * @memberof asmail
         * @classdesc Represents an IncomingMessageMsg.
         * @implements IIncomingMessageMsg
         * @constructor
         * @param {asmail.IIncomingMessageMsg=} [properties] Properties to set
         */
        function IncomingMessageMsg(properties) {
            this.recipients = [];
            this.carbonCopy = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * IncomingMessageMsg msgId.
         * @member {string} msgId
         * @memberof asmail.IncomingMessageMsg
         * @instance
         */
        IncomingMessageMsg.prototype.msgId = "";

        /**
         * IncomingMessageMsg deliveryTS.
         * @member {number|Long} deliveryTS
         * @memberof asmail.IncomingMessageMsg
         * @instance
         */
        IncomingMessageMsg.prototype.deliveryTS = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * IncomingMessageMsg sender.
         * @member {string} sender
         * @memberof asmail.IncomingMessageMsg
         * @instance
         */
        IncomingMessageMsg.prototype.sender = "";

        /**
         * IncomingMessageMsg establishedSenderKeyChain.
         * @member {boolean} establishedSenderKeyChain
         * @memberof asmail.IncomingMessageMsg
         * @instance
         */
        IncomingMessageMsg.prototype.establishedSenderKeyChain = false;

        /**
         * IncomingMessageMsg msgType.
         * @member {string} msgType
         * @memberof asmail.IncomingMessageMsg
         * @instance
         */
        IncomingMessageMsg.prototype.msgType = "";

        /**
         * IncomingMessageMsg recipients.
         * @member {Array.<string>} recipients
         * @memberof asmail.IncomingMessageMsg
         * @instance
         */
        IncomingMessageMsg.prototype.recipients = $util.emptyArray;

        /**
         * IncomingMessageMsg subject.
         * @member {common.IStringValue|null|undefined} subject
         * @memberof asmail.IncomingMessageMsg
         * @instance
         */
        IncomingMessageMsg.prototype.subject = null;

        /**
         * IncomingMessageMsg plainTxtBody.
         * @member {common.IStringValue|null|undefined} plainTxtBody
         * @memberof asmail.IncomingMessageMsg
         * @instance
         */
        IncomingMessageMsg.prototype.plainTxtBody = null;

        /**
         * IncomingMessageMsg htmlTxtBody.
         * @member {common.IStringValue|null|undefined} htmlTxtBody
         * @memberof asmail.IncomingMessageMsg
         * @instance
         */
        IncomingMessageMsg.prototype.htmlTxtBody = null;

        /**
         * IncomingMessageMsg jsonBody.
         * @member {common.IStringValue|null|undefined} jsonBody
         * @memberof asmail.IncomingMessageMsg
         * @instance
         */
        IncomingMessageMsg.prototype.jsonBody = null;

        /**
         * IncomingMessageMsg carbonCopy.
         * @member {Array.<string>} carbonCopy
         * @memberof asmail.IncomingMessageMsg
         * @instance
         */
        IncomingMessageMsg.prototype.carbonCopy = $util.emptyArray;

        /**
         * IncomingMessageMsg attachments.
         * @member {fs.IFS|null|undefined} attachments
         * @memberof asmail.IncomingMessageMsg
         * @instance
         */
        IncomingMessageMsg.prototype.attachments = null;

        /**
         * Creates a new IncomingMessageMsg instance using the specified properties.
         * @function create
         * @memberof asmail.IncomingMessageMsg
         * @static
         * @param {asmail.IIncomingMessageMsg=} [properties] Properties to set
         * @returns {asmail.IncomingMessageMsg} IncomingMessageMsg instance
         */
        IncomingMessageMsg.create = function create(properties) {
            return new IncomingMessageMsg(properties);
        };

        /**
         * Encodes the specified IncomingMessageMsg message. Does not implicitly {@link asmail.IncomingMessageMsg.verify|verify} messages.
         * @function encode
         * @memberof asmail.IncomingMessageMsg
         * @static
         * @param {asmail.IIncomingMessageMsg} message IncomingMessageMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        IncomingMessageMsg.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.msgId != null && Object.hasOwnProperty.call(message, "msgId"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.msgId);
            if (message.deliveryTS != null && Object.hasOwnProperty.call(message, "deliveryTS"))
                writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.deliveryTS);
            if (message.sender != null && Object.hasOwnProperty.call(message, "sender"))
                writer.uint32(/* id 3, wireType 2 =*/26).string(message.sender);
            if (message.establishedSenderKeyChain != null && Object.hasOwnProperty.call(message, "establishedSenderKeyChain"))
                writer.uint32(/* id 4, wireType 0 =*/32).bool(message.establishedSenderKeyChain);
            if (message.msgType != null && Object.hasOwnProperty.call(message, "msgType"))
                writer.uint32(/* id 10, wireType 2 =*/82).string(message.msgType);
            if (message.recipients != null && message.recipients.length)
                for (var i = 0; i < message.recipients.length; ++i)
                    writer.uint32(/* id 11, wireType 2 =*/90).string(message.recipients[i]);
            if (message.subject != null && Object.hasOwnProperty.call(message, "subject"))
                $root.common.StringValue.encode(message.subject, writer.uint32(/* id 12, wireType 2 =*/98).fork(), q + 1).ldelim();
            if (message.plainTxtBody != null && Object.hasOwnProperty.call(message, "plainTxtBody"))
                $root.common.StringValue.encode(message.plainTxtBody, writer.uint32(/* id 13, wireType 2 =*/106).fork(), q + 1).ldelim();
            if (message.htmlTxtBody != null && Object.hasOwnProperty.call(message, "htmlTxtBody"))
                $root.common.StringValue.encode(message.htmlTxtBody, writer.uint32(/* id 14, wireType 2 =*/114).fork(), q + 1).ldelim();
            if (message.jsonBody != null && Object.hasOwnProperty.call(message, "jsonBody"))
                $root.common.StringValue.encode(message.jsonBody, writer.uint32(/* id 15, wireType 2 =*/122).fork(), q + 1).ldelim();
            if (message.carbonCopy != null && message.carbonCopy.length)
                for (var i = 0; i < message.carbonCopy.length; ++i)
                    writer.uint32(/* id 16, wireType 2 =*/130).string(message.carbonCopy[i]);
            if (message.attachments != null && Object.hasOwnProperty.call(message, "attachments"))
                $root.fs.FS.encode(message.attachments, writer.uint32(/* id 17, wireType 2 =*/138).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified IncomingMessageMsg message, length delimited. Does not implicitly {@link asmail.IncomingMessageMsg.verify|verify} messages.
         * @function encodeDelimited
         * @memberof asmail.IncomingMessageMsg
         * @static
         * @param {asmail.IIncomingMessageMsg} message IncomingMessageMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        IncomingMessageMsg.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an IncomingMessageMsg message from the specified reader or buffer.
         * @function decode
         * @memberof asmail.IncomingMessageMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {asmail.IncomingMessageMsg} IncomingMessageMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        IncomingMessageMsg.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.IncomingMessageMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.msgId = reader.string();
                        break;
                    }
                case 2: {
                        message.deliveryTS = reader.uint64();
                        break;
                    }
                case 3: {
                        message.sender = reader.string();
                        break;
                    }
                case 4: {
                        message.establishedSenderKeyChain = reader.bool();
                        break;
                    }
                case 10: {
                        message.msgType = reader.string();
                        break;
                    }
                case 11: {
                        if (!(message.recipients && message.recipients.length))
                            message.recipients = [];
                        message.recipients.push(reader.string());
                        break;
                    }
                case 12: {
                        message.subject = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 13: {
                        message.plainTxtBody = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 14: {
                        message.htmlTxtBody = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 15: {
                        message.jsonBody = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 16: {
                        if (!(message.carbonCopy && message.carbonCopy.length))
                            message.carbonCopy = [];
                        message.carbonCopy.push(reader.string());
                        break;
                    }
                case 17: {
                        message.attachments = $root.fs.FS.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an IncomingMessageMsg message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof asmail.IncomingMessageMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {asmail.IncomingMessageMsg} IncomingMessageMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        IncomingMessageMsg.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an IncomingMessageMsg message.
         * @function verify
         * @memberof asmail.IncomingMessageMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        IncomingMessageMsg.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.msgId != null && Object.hasOwnProperty.call(message, "msgId"))
                if (!$util.isString(message.msgId))
                    return "msgId: string expected";
            if (message.deliveryTS != null && Object.hasOwnProperty.call(message, "deliveryTS"))
                if (!$util.isInteger(message.deliveryTS) && !(message.deliveryTS && $util.isInteger(message.deliveryTS.low) && $util.isInteger(message.deliveryTS.high)))
                    return "deliveryTS: integer|Long expected";
            if (message.sender != null && Object.hasOwnProperty.call(message, "sender"))
                if (!$util.isString(message.sender))
                    return "sender: string expected";
            if (message.establishedSenderKeyChain != null && Object.hasOwnProperty.call(message, "establishedSenderKeyChain"))
                if (typeof message.establishedSenderKeyChain !== "boolean")
                    return "establishedSenderKeyChain: boolean expected";
            if (message.msgType != null && Object.hasOwnProperty.call(message, "msgType"))
                if (!$util.isString(message.msgType))
                    return "msgType: string expected";
            if (message.recipients != null && Object.hasOwnProperty.call(message, "recipients")) {
                if (!Array.isArray(message.recipients))
                    return "recipients: array expected";
                for (var i = 0; i < message.recipients.length; ++i)
                    if (!$util.isString(message.recipients[i]))
                        return "recipients: string[] expected";
            }
            if (message.subject != null && Object.hasOwnProperty.call(message, "subject")) {
                var error = $root.common.StringValue.verify(message.subject, long + 1);
                if (error)
                    return "subject." + error;
            }
            if (message.plainTxtBody != null && Object.hasOwnProperty.call(message, "plainTxtBody")) {
                var error = $root.common.StringValue.verify(message.plainTxtBody, long + 1);
                if (error)
                    return "plainTxtBody." + error;
            }
            if (message.htmlTxtBody != null && Object.hasOwnProperty.call(message, "htmlTxtBody")) {
                var error = $root.common.StringValue.verify(message.htmlTxtBody, long + 1);
                if (error)
                    return "htmlTxtBody." + error;
            }
            if (message.jsonBody != null && Object.hasOwnProperty.call(message, "jsonBody")) {
                var error = $root.common.StringValue.verify(message.jsonBody, long + 1);
                if (error)
                    return "jsonBody." + error;
            }
            if (message.carbonCopy != null && Object.hasOwnProperty.call(message, "carbonCopy")) {
                if (!Array.isArray(message.carbonCopy))
                    return "carbonCopy: array expected";
                for (var i = 0; i < message.carbonCopy.length; ++i)
                    if (!$util.isString(message.carbonCopy[i]))
                        return "carbonCopy: string[] expected";
            }
            if (message.attachments != null && Object.hasOwnProperty.call(message, "attachments")) {
                var error = $root.fs.FS.verify(message.attachments, long + 1);
                if (error)
                    return "attachments." + error;
            }
            return null;
        };

        /**
         * Creates an IncomingMessageMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof asmail.IncomingMessageMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {asmail.IncomingMessageMsg} IncomingMessageMsg
         */
        IncomingMessageMsg.fromObject = function fromObject(object, long) {
            if (object instanceof $root.asmail.IncomingMessageMsg)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".asmail.IncomingMessageMsg: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.asmail.IncomingMessageMsg();
            if (object.msgId != null)
                message.msgId = String(object.msgId);
            if (object.deliveryTS != null)
                if ($util.Long)
                    message.deliveryTS = $util.Long.fromValue(object.deliveryTS, true);
                else if (typeof object.deliveryTS === "string")
                    message.deliveryTS = parseInt(object.deliveryTS, 10);
                else if (typeof object.deliveryTS === "number")
                    message.deliveryTS = object.deliveryTS;
                else if (typeof object.deliveryTS === "object")
                    message.deliveryTS = new $util.LongBits(object.deliveryTS.low >>> 0, object.deliveryTS.high >>> 0).toNumber(true);
            if (object.sender != null)
                message.sender = String(object.sender);
            if (object.establishedSenderKeyChain != null)
                message.establishedSenderKeyChain = Boolean(object.establishedSenderKeyChain);
            if (object.msgType != null)
                message.msgType = String(object.msgType);
            if (object.recipients) {
                if (!Array.isArray(object.recipients))
                    throw TypeError(".asmail.IncomingMessageMsg.recipients: array expected");
                message.recipients = [];
                for (var i = 0; i < object.recipients.length; ++i)
                    message.recipients[i] = String(object.recipients[i]);
            }
            if (object.subject != null) {
                if (!$util.isObject(object.subject))
                    throw TypeError(".asmail.IncomingMessageMsg.subject: object expected");
                message.subject = $root.common.StringValue.fromObject(object.subject, long + 1);
            }
            if (object.plainTxtBody != null) {
                if (!$util.isObject(object.plainTxtBody))
                    throw TypeError(".asmail.IncomingMessageMsg.plainTxtBody: object expected");
                message.plainTxtBody = $root.common.StringValue.fromObject(object.plainTxtBody, long + 1);
            }
            if (object.htmlTxtBody != null) {
                if (!$util.isObject(object.htmlTxtBody))
                    throw TypeError(".asmail.IncomingMessageMsg.htmlTxtBody: object expected");
                message.htmlTxtBody = $root.common.StringValue.fromObject(object.htmlTxtBody, long + 1);
            }
            if (object.jsonBody != null) {
                if (!$util.isObject(object.jsonBody))
                    throw TypeError(".asmail.IncomingMessageMsg.jsonBody: object expected");
                message.jsonBody = $root.common.StringValue.fromObject(object.jsonBody, long + 1);
            }
            if (object.carbonCopy) {
                if (!Array.isArray(object.carbonCopy))
                    throw TypeError(".asmail.IncomingMessageMsg.carbonCopy: array expected");
                message.carbonCopy = [];
                for (var i = 0; i < object.carbonCopy.length; ++i)
                    message.carbonCopy[i] = String(object.carbonCopy[i]);
            }
            if (object.attachments != null) {
                if (!$util.isObject(object.attachments))
                    throw TypeError(".asmail.IncomingMessageMsg.attachments: object expected");
                message.attachments = $root.fs.FS.fromObject(object.attachments, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an IncomingMessageMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof asmail.IncomingMessageMsg
         * @static
         * @param {asmail.IncomingMessageMsg} message IncomingMessageMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        IncomingMessageMsg.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults) {
                object.recipients = [];
                object.carbonCopy = [];
            }
            if (options.defaults) {
                object.msgId = "";
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.deliveryTS = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.deliveryTS = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.sender = "";
                object.establishedSenderKeyChain = false;
                object.msgType = "";
                object.subject = null;
                object.plainTxtBody = null;
                object.htmlTxtBody = null;
                object.jsonBody = null;
                object.attachments = null;
            }
            if (message.msgId != null && Object.hasOwnProperty.call(message, "msgId"))
                object.msgId = message.msgId;
            if (message.deliveryTS != null && Object.hasOwnProperty.call(message, "deliveryTS"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.deliveryTS = typeof message.deliveryTS === "number" ? BigInt(message.deliveryTS) : $util.Long.fromBits(message.deliveryTS.low >>> 0, message.deliveryTS.high >>> 0, true).toBigInt();
                else if (typeof message.deliveryTS === "number")
                    object.deliveryTS = options.longs === String ? String(message.deliveryTS) : message.deliveryTS;
                else
                    object.deliveryTS = options.longs === String ? $util.Long.prototype.toString.call(message.deliveryTS) : options.longs === Number ? new $util.LongBits(message.deliveryTS.low >>> 0, message.deliveryTS.high >>> 0).toNumber(true) : message.deliveryTS;
            if (message.sender != null && Object.hasOwnProperty.call(message, "sender"))
                object.sender = message.sender;
            if (message.establishedSenderKeyChain != null && Object.hasOwnProperty.call(message, "establishedSenderKeyChain"))
                object.establishedSenderKeyChain = message.establishedSenderKeyChain;
            if (message.msgType != null && Object.hasOwnProperty.call(message, "msgType"))
                object.msgType = message.msgType;
            if (message.recipients && message.recipients.length) {
                object.recipients = [];
                for (var j = 0; j < message.recipients.length; ++j)
                    object.recipients[j] = message.recipients[j];
            }
            if (message.subject != null && Object.hasOwnProperty.call(message, "subject"))
                object.subject = $root.common.StringValue.toObject(message.subject, options, q + 1);
            if (message.plainTxtBody != null && Object.hasOwnProperty.call(message, "plainTxtBody"))
                object.plainTxtBody = $root.common.StringValue.toObject(message.plainTxtBody, options, q + 1);
            if (message.htmlTxtBody != null && Object.hasOwnProperty.call(message, "htmlTxtBody"))
                object.htmlTxtBody = $root.common.StringValue.toObject(message.htmlTxtBody, options, q + 1);
            if (message.jsonBody != null && Object.hasOwnProperty.call(message, "jsonBody"))
                object.jsonBody = $root.common.StringValue.toObject(message.jsonBody, options, q + 1);
            if (message.carbonCopy && message.carbonCopy.length) {
                object.carbonCopy = [];
                for (var j = 0; j < message.carbonCopy.length; ++j)
                    object.carbonCopy[j] = message.carbonCopy[j];
            }
            if (message.attachments != null && Object.hasOwnProperty.call(message, "attachments"))
                object.attachments = $root.fs.FS.toObject(message.attachments, options, q + 1);
            return object;
        };

        /**
         * Converts this IncomingMessageMsg to JSON.
         * @function toJSON
         * @memberof asmail.IncomingMessageMsg
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        IncomingMessageMsg.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for IncomingMessageMsg
         * @function getTypeUrl
         * @memberof asmail.IncomingMessageMsg
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        IncomingMessageMsg.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/asmail.IncomingMessageMsg";
        };

        return IncomingMessageMsg;
    })();

    asmail.SubscribeStartCallBody = (function() {

        /**
         * Properties of a SubscribeStartCallBody.
         * @memberof asmail
         * @interface ISubscribeStartCallBody
         * @property {string|null} [event] SubscribeStartCallBody event
         */

        /**
         * Constructs a new SubscribeStartCallBody.
         * @memberof asmail
         * @classdesc Represents a SubscribeStartCallBody.
         * @implements ISubscribeStartCallBody
         * @constructor
         * @param {asmail.ISubscribeStartCallBody=} [properties] Properties to set
         */
        function SubscribeStartCallBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * SubscribeStartCallBody event.
         * @member {string} event
         * @memberof asmail.SubscribeStartCallBody
         * @instance
         */
        SubscribeStartCallBody.prototype.event = "";

        /**
         * Creates a new SubscribeStartCallBody instance using the specified properties.
         * @function create
         * @memberof asmail.SubscribeStartCallBody
         * @static
         * @param {asmail.ISubscribeStartCallBody=} [properties] Properties to set
         * @returns {asmail.SubscribeStartCallBody} SubscribeStartCallBody instance
         */
        SubscribeStartCallBody.create = function create(properties) {
            return new SubscribeStartCallBody(properties);
        };

        /**
         * Encodes the specified SubscribeStartCallBody message. Does not implicitly {@link asmail.SubscribeStartCallBody.verify|verify} messages.
         * @function encode
         * @memberof asmail.SubscribeStartCallBody
         * @static
         * @param {asmail.ISubscribeStartCallBody} message SubscribeStartCallBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SubscribeStartCallBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.event != null && Object.hasOwnProperty.call(message, "event"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.event);
            return writer;
        };

        /**
         * Encodes the specified SubscribeStartCallBody message, length delimited. Does not implicitly {@link asmail.SubscribeStartCallBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof asmail.SubscribeStartCallBody
         * @static
         * @param {asmail.ISubscribeStartCallBody} message SubscribeStartCallBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SubscribeStartCallBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a SubscribeStartCallBody message from the specified reader or buffer.
         * @function decode
         * @memberof asmail.SubscribeStartCallBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {asmail.SubscribeStartCallBody} SubscribeStartCallBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SubscribeStartCallBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.SubscribeStartCallBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.event = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a SubscribeStartCallBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof asmail.SubscribeStartCallBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {asmail.SubscribeStartCallBody} SubscribeStartCallBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SubscribeStartCallBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a SubscribeStartCallBody message.
         * @function verify
         * @memberof asmail.SubscribeStartCallBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        SubscribeStartCallBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.event != null && Object.hasOwnProperty.call(message, "event"))
                if (!$util.isString(message.event))
                    return "event: string expected";
            return null;
        };

        /**
         * Creates a SubscribeStartCallBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof asmail.SubscribeStartCallBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {asmail.SubscribeStartCallBody} SubscribeStartCallBody
         */
        SubscribeStartCallBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.asmail.SubscribeStartCallBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".asmail.SubscribeStartCallBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.asmail.SubscribeStartCallBody();
            if (object.event != null)
                message.event = String(object.event);
            return message;
        };

        /**
         * Creates a plain object from a SubscribeStartCallBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof asmail.SubscribeStartCallBody
         * @static
         * @param {asmail.SubscribeStartCallBody} message SubscribeStartCallBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        SubscribeStartCallBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.event = "";
            if (message.event != null && Object.hasOwnProperty.call(message, "event"))
                object.event = message.event;
            return object;
        };

        /**
         * Converts this SubscribeStartCallBody to JSON.
         * @function toJSON
         * @memberof asmail.SubscribeStartCallBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        SubscribeStartCallBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for SubscribeStartCallBody
         * @function getTypeUrl
         * @memberof asmail.SubscribeStartCallBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        SubscribeStartCallBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/asmail.SubscribeStartCallBody";
        };

        return SubscribeStartCallBody;
    })();

    asmail.PreFlightRequestBody = (function() {

        /**
         * Properties of a PreFlightRequestBody.
         * @memberof asmail
         * @interface IPreFlightRequestBody
         * @property {string|null} [toAddress] PreFlightRequestBody toAddress
         */

        /**
         * Constructs a new PreFlightRequestBody.
         * @memberof asmail
         * @classdesc Represents a PreFlightRequestBody.
         * @implements IPreFlightRequestBody
         * @constructor
         * @param {asmail.IPreFlightRequestBody=} [properties] Properties to set
         */
        function PreFlightRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * PreFlightRequestBody toAddress.
         * @member {string} toAddress
         * @memberof asmail.PreFlightRequestBody
         * @instance
         */
        PreFlightRequestBody.prototype.toAddress = "";

        /**
         * Creates a new PreFlightRequestBody instance using the specified properties.
         * @function create
         * @memberof asmail.PreFlightRequestBody
         * @static
         * @param {asmail.IPreFlightRequestBody=} [properties] Properties to set
         * @returns {asmail.PreFlightRequestBody} PreFlightRequestBody instance
         */
        PreFlightRequestBody.create = function create(properties) {
            return new PreFlightRequestBody(properties);
        };

        /**
         * Encodes the specified PreFlightRequestBody message. Does not implicitly {@link asmail.PreFlightRequestBody.verify|verify} messages.
         * @function encode
         * @memberof asmail.PreFlightRequestBody
         * @static
         * @param {asmail.IPreFlightRequestBody} message PreFlightRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        PreFlightRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.toAddress != null && Object.hasOwnProperty.call(message, "toAddress"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.toAddress);
            return writer;
        };

        /**
         * Encodes the specified PreFlightRequestBody message, length delimited. Does not implicitly {@link asmail.PreFlightRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof asmail.PreFlightRequestBody
         * @static
         * @param {asmail.IPreFlightRequestBody} message PreFlightRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        PreFlightRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a PreFlightRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof asmail.PreFlightRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {asmail.PreFlightRequestBody} PreFlightRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        PreFlightRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.PreFlightRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.toAddress = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a PreFlightRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof asmail.PreFlightRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {asmail.PreFlightRequestBody} PreFlightRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        PreFlightRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a PreFlightRequestBody message.
         * @function verify
         * @memberof asmail.PreFlightRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        PreFlightRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.toAddress != null && Object.hasOwnProperty.call(message, "toAddress"))
                if (!$util.isString(message.toAddress))
                    return "toAddress: string expected";
            return null;
        };

        /**
         * Creates a PreFlightRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof asmail.PreFlightRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {asmail.PreFlightRequestBody} PreFlightRequestBody
         */
        PreFlightRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.asmail.PreFlightRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".asmail.PreFlightRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.asmail.PreFlightRequestBody();
            if (object.toAddress != null)
                message.toAddress = String(object.toAddress);
            return message;
        };

        /**
         * Creates a plain object from a PreFlightRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof asmail.PreFlightRequestBody
         * @static
         * @param {asmail.PreFlightRequestBody} message PreFlightRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        PreFlightRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.toAddress = "";
            if (message.toAddress != null && Object.hasOwnProperty.call(message, "toAddress"))
                object.toAddress = message.toAddress;
            return object;
        };

        /**
         * Converts this PreFlightRequestBody to JSON.
         * @function toJSON
         * @memberof asmail.PreFlightRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        PreFlightRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for PreFlightRequestBody
         * @function getTypeUrl
         * @memberof asmail.PreFlightRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        PreFlightRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/asmail.PreFlightRequestBody";
        };

        return PreFlightRequestBody;
    })();

    asmail.AddMsgRequestBody = (function() {

        /**
         * Properties of an AddMsgRequestBody.
         * @memberof asmail
         * @interface IAddMsgRequestBody
         * @property {Array.<string>|null} [recipients] AddMsgRequestBody recipients
         * @property {asmail.IOutgoingMessageMsg|null} [msg] AddMsgRequestBody msg
         * @property {string|null} [id] AddMsgRequestBody id
         * @property {common.IBooleanValue|null} [sendImmediately] AddMsgRequestBody sendImmediately
         * @property {common.IAnyValue|null} [localMeta] AddMsgRequestBody localMeta
         * @property {asmail.AddMsgRequestBody.IRetryOpt|null} [retryRecipient] AddMsgRequestBody retryRecipient
         */

        /**
         * Constructs a new AddMsgRequestBody.
         * @memberof asmail
         * @classdesc Represents an AddMsgRequestBody.
         * @implements IAddMsgRequestBody
         * @constructor
         * @param {asmail.IAddMsgRequestBody=} [properties] Properties to set
         */
        function AddMsgRequestBody(properties) {
            this.recipients = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * AddMsgRequestBody recipients.
         * @member {Array.<string>} recipients
         * @memberof asmail.AddMsgRequestBody
         * @instance
         */
        AddMsgRequestBody.prototype.recipients = $util.emptyArray;

        /**
         * AddMsgRequestBody msg.
         * @member {asmail.IOutgoingMessageMsg|null|undefined} msg
         * @memberof asmail.AddMsgRequestBody
         * @instance
         */
        AddMsgRequestBody.prototype.msg = null;

        /**
         * AddMsgRequestBody id.
         * @member {string} id
         * @memberof asmail.AddMsgRequestBody
         * @instance
         */
        AddMsgRequestBody.prototype.id = "";

        /**
         * AddMsgRequestBody sendImmediately.
         * @member {common.IBooleanValue|null|undefined} sendImmediately
         * @memberof asmail.AddMsgRequestBody
         * @instance
         */
        AddMsgRequestBody.prototype.sendImmediately = null;

        /**
         * AddMsgRequestBody localMeta.
         * @member {common.IAnyValue|null|undefined} localMeta
         * @memberof asmail.AddMsgRequestBody
         * @instance
         */
        AddMsgRequestBody.prototype.localMeta = null;

        /**
         * AddMsgRequestBody retryRecipient.
         * @member {asmail.AddMsgRequestBody.IRetryOpt|null|undefined} retryRecipient
         * @memberof asmail.AddMsgRequestBody
         * @instance
         */
        AddMsgRequestBody.prototype.retryRecipient = null;

        /**
         * Creates a new AddMsgRequestBody instance using the specified properties.
         * @function create
         * @memberof asmail.AddMsgRequestBody
         * @static
         * @param {asmail.IAddMsgRequestBody=} [properties] Properties to set
         * @returns {asmail.AddMsgRequestBody} AddMsgRequestBody instance
         */
        AddMsgRequestBody.create = function create(properties) {
            return new AddMsgRequestBody(properties);
        };

        /**
         * Encodes the specified AddMsgRequestBody message. Does not implicitly {@link asmail.AddMsgRequestBody.verify|verify} messages.
         * @function encode
         * @memberof asmail.AddMsgRequestBody
         * @static
         * @param {asmail.IAddMsgRequestBody} message AddMsgRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AddMsgRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.recipients != null && message.recipients.length)
                for (var i = 0; i < message.recipients.length; ++i)
                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.recipients[i]);
            if (message.msg != null && Object.hasOwnProperty.call(message, "msg"))
                $root.asmail.OutgoingMessageMsg.encode(message.msg, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.id != null && Object.hasOwnProperty.call(message, "id"))
                writer.uint32(/* id 3, wireType 2 =*/26).string(message.id);
            if (message.sendImmediately != null && Object.hasOwnProperty.call(message, "sendImmediately"))
                $root.common.BooleanValue.encode(message.sendImmediately, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            if (message.localMeta != null && Object.hasOwnProperty.call(message, "localMeta"))
                $root.common.AnyValue.encode(message.localMeta, writer.uint32(/* id 5, wireType 2 =*/42).fork(), q + 1).ldelim();
            if (message.retryRecipient != null && Object.hasOwnProperty.call(message, "retryRecipient"))
                $root.asmail.AddMsgRequestBody.RetryOpt.encode(message.retryRecipient, writer.uint32(/* id 6, wireType 2 =*/50).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified AddMsgRequestBody message, length delimited. Does not implicitly {@link asmail.AddMsgRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof asmail.AddMsgRequestBody
         * @static
         * @param {asmail.IAddMsgRequestBody} message AddMsgRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AddMsgRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an AddMsgRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof asmail.AddMsgRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {asmail.AddMsgRequestBody} AddMsgRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AddMsgRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.AddMsgRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.recipients && message.recipients.length))
                            message.recipients = [];
                        message.recipients.push(reader.string());
                        break;
                    }
                case 2: {
                        message.msg = $root.asmail.OutgoingMessageMsg.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.id = reader.string();
                        break;
                    }
                case 4: {
                        message.sendImmediately = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 5: {
                        message.localMeta = $root.common.AnyValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 6: {
                        message.retryRecipient = $root.asmail.AddMsgRequestBody.RetryOpt.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an AddMsgRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof asmail.AddMsgRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {asmail.AddMsgRequestBody} AddMsgRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AddMsgRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an AddMsgRequestBody message.
         * @function verify
         * @memberof asmail.AddMsgRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        AddMsgRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.recipients != null && Object.hasOwnProperty.call(message, "recipients")) {
                if (!Array.isArray(message.recipients))
                    return "recipients: array expected";
                for (var i = 0; i < message.recipients.length; ++i)
                    if (!$util.isString(message.recipients[i]))
                        return "recipients: string[] expected";
            }
            if (message.msg != null && Object.hasOwnProperty.call(message, "msg")) {
                var error = $root.asmail.OutgoingMessageMsg.verify(message.msg, long + 1);
                if (error)
                    return "msg." + error;
            }
            if (message.id != null && Object.hasOwnProperty.call(message, "id"))
                if (!$util.isString(message.id))
                    return "id: string expected";
            if (message.sendImmediately != null && Object.hasOwnProperty.call(message, "sendImmediately")) {
                var error = $root.common.BooleanValue.verify(message.sendImmediately, long + 1);
                if (error)
                    return "sendImmediately." + error;
            }
            if (message.localMeta != null && Object.hasOwnProperty.call(message, "localMeta")) {
                var error = $root.common.AnyValue.verify(message.localMeta, long + 1);
                if (error)
                    return "localMeta." + error;
            }
            if (message.retryRecipient != null && Object.hasOwnProperty.call(message, "retryRecipient")) {
                var error = $root.asmail.AddMsgRequestBody.RetryOpt.verify(message.retryRecipient, long + 1);
                if (error)
                    return "retryRecipient." + error;
            }
            return null;
        };

        /**
         * Creates an AddMsgRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof asmail.AddMsgRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {asmail.AddMsgRequestBody} AddMsgRequestBody
         */
        AddMsgRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.asmail.AddMsgRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".asmail.AddMsgRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.asmail.AddMsgRequestBody();
            if (object.recipients) {
                if (!Array.isArray(object.recipients))
                    throw TypeError(".asmail.AddMsgRequestBody.recipients: array expected");
                message.recipients = [];
                for (var i = 0; i < object.recipients.length; ++i)
                    message.recipients[i] = String(object.recipients[i]);
            }
            if (object.msg != null) {
                if (!$util.isObject(object.msg))
                    throw TypeError(".asmail.AddMsgRequestBody.msg: object expected");
                message.msg = $root.asmail.OutgoingMessageMsg.fromObject(object.msg, long + 1);
            }
            if (object.id != null)
                message.id = String(object.id);
            if (object.sendImmediately != null) {
                if (!$util.isObject(object.sendImmediately))
                    throw TypeError(".asmail.AddMsgRequestBody.sendImmediately: object expected");
                message.sendImmediately = $root.common.BooleanValue.fromObject(object.sendImmediately, long + 1);
            }
            if (object.localMeta != null) {
                if (!$util.isObject(object.localMeta))
                    throw TypeError(".asmail.AddMsgRequestBody.localMeta: object expected");
                message.localMeta = $root.common.AnyValue.fromObject(object.localMeta, long + 1);
            }
            if (object.retryRecipient != null) {
                if (!$util.isObject(object.retryRecipient))
                    throw TypeError(".asmail.AddMsgRequestBody.retryRecipient: object expected");
                message.retryRecipient = $root.asmail.AddMsgRequestBody.RetryOpt.fromObject(object.retryRecipient, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an AddMsgRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof asmail.AddMsgRequestBody
         * @static
         * @param {asmail.AddMsgRequestBody} message AddMsgRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        AddMsgRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.recipients = [];
            if (options.defaults) {
                object.msg = null;
                object.id = "";
                object.sendImmediately = null;
                object.localMeta = null;
                object.retryRecipient = null;
            }
            if (message.recipients && message.recipients.length) {
                object.recipients = [];
                for (var j = 0; j < message.recipients.length; ++j)
                    object.recipients[j] = message.recipients[j];
            }
            if (message.msg != null && Object.hasOwnProperty.call(message, "msg"))
                object.msg = $root.asmail.OutgoingMessageMsg.toObject(message.msg, options, q + 1);
            if (message.id != null && Object.hasOwnProperty.call(message, "id"))
                object.id = message.id;
            if (message.sendImmediately != null && Object.hasOwnProperty.call(message, "sendImmediately"))
                object.sendImmediately = $root.common.BooleanValue.toObject(message.sendImmediately, options, q + 1);
            if (message.localMeta != null && Object.hasOwnProperty.call(message, "localMeta"))
                object.localMeta = $root.common.AnyValue.toObject(message.localMeta, options, q + 1);
            if (message.retryRecipient != null && Object.hasOwnProperty.call(message, "retryRecipient"))
                object.retryRecipient = $root.asmail.AddMsgRequestBody.RetryOpt.toObject(message.retryRecipient, options, q + 1);
            return object;
        };

        /**
         * Converts this AddMsgRequestBody to JSON.
         * @function toJSON
         * @memberof asmail.AddMsgRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        AddMsgRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for AddMsgRequestBody
         * @function getTypeUrl
         * @memberof asmail.AddMsgRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        AddMsgRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/asmail.AddMsgRequestBody";
        };

        AddMsgRequestBody.RetryOpt = (function() {

            /**
             * Properties of a RetryOpt.
             * @memberof asmail.AddMsgRequestBody
             * @interface IRetryOpt
             * @property {number|null} [numOfAttempts] RetryOpt numOfAttempts
             * @property {number|null} [timeBetweenAttempts] RetryOpt timeBetweenAttempts
             */

            /**
             * Constructs a new RetryOpt.
             * @memberof asmail.AddMsgRequestBody
             * @classdesc Represents a RetryOpt.
             * @implements IRetryOpt
             * @constructor
             * @param {asmail.AddMsgRequestBody.IRetryOpt=} [properties] Properties to set
             */
            function RetryOpt(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * RetryOpt numOfAttempts.
             * @member {number} numOfAttempts
             * @memberof asmail.AddMsgRequestBody.RetryOpt
             * @instance
             */
            RetryOpt.prototype.numOfAttempts = 0;

            /**
             * RetryOpt timeBetweenAttempts.
             * @member {number} timeBetweenAttempts
             * @memberof asmail.AddMsgRequestBody.RetryOpt
             * @instance
             */
            RetryOpt.prototype.timeBetweenAttempts = 0;

            /**
             * Creates a new RetryOpt instance using the specified properties.
             * @function create
             * @memberof asmail.AddMsgRequestBody.RetryOpt
             * @static
             * @param {asmail.AddMsgRequestBody.IRetryOpt=} [properties] Properties to set
             * @returns {asmail.AddMsgRequestBody.RetryOpt} RetryOpt instance
             */
            RetryOpt.create = function create(properties) {
                return new RetryOpt(properties);
            };

            /**
             * Encodes the specified RetryOpt message. Does not implicitly {@link asmail.AddMsgRequestBody.RetryOpt.verify|verify} messages.
             * @function encode
             * @memberof asmail.AddMsgRequestBody.RetryOpt
             * @static
             * @param {asmail.AddMsgRequestBody.IRetryOpt} message RetryOpt message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            RetryOpt.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.numOfAttempts != null && Object.hasOwnProperty.call(message, "numOfAttempts"))
                    writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.numOfAttempts);
                if (message.timeBetweenAttempts != null && Object.hasOwnProperty.call(message, "timeBetweenAttempts"))
                    writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.timeBetweenAttempts);
                return writer;
            };

            /**
             * Encodes the specified RetryOpt message, length delimited. Does not implicitly {@link asmail.AddMsgRequestBody.RetryOpt.verify|verify} messages.
             * @function encodeDelimited
             * @memberof asmail.AddMsgRequestBody.RetryOpt
             * @static
             * @param {asmail.AddMsgRequestBody.IRetryOpt} message RetryOpt message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            RetryOpt.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes a RetryOpt message from the specified reader or buffer.
             * @function decode
             * @memberof asmail.AddMsgRequestBody.RetryOpt
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {asmail.AddMsgRequestBody.RetryOpt} RetryOpt
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            RetryOpt.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.AddMsgRequestBody.RetryOpt();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.numOfAttempts = reader.uint32();
                            break;
                        }
                    case 2: {
                            message.timeBetweenAttempts = reader.uint32();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a RetryOpt message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof asmail.AddMsgRequestBody.RetryOpt
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {asmail.AddMsgRequestBody.RetryOpt} RetryOpt
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            RetryOpt.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a RetryOpt message.
             * @function verify
             * @memberof asmail.AddMsgRequestBody.RetryOpt
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            RetryOpt.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.numOfAttempts != null && Object.hasOwnProperty.call(message, "numOfAttempts"))
                    if (!$util.isInteger(message.numOfAttempts))
                        return "numOfAttempts: integer expected";
                if (message.timeBetweenAttempts != null && Object.hasOwnProperty.call(message, "timeBetweenAttempts"))
                    if (!$util.isInteger(message.timeBetweenAttempts))
                        return "timeBetweenAttempts: integer expected";
                return null;
            };

            /**
             * Creates a RetryOpt message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof asmail.AddMsgRequestBody.RetryOpt
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {asmail.AddMsgRequestBody.RetryOpt} RetryOpt
             */
            RetryOpt.fromObject = function fromObject(object, long) {
                if (object instanceof $root.asmail.AddMsgRequestBody.RetryOpt)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".asmail.AddMsgRequestBody.RetryOpt: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.asmail.AddMsgRequestBody.RetryOpt();
                if (object.numOfAttempts != null)
                    message.numOfAttempts = object.numOfAttempts >>> 0;
                if (object.timeBetweenAttempts != null)
                    message.timeBetweenAttempts = object.timeBetweenAttempts >>> 0;
                return message;
            };

            /**
             * Creates a plain object from a RetryOpt message. Also converts values to other types if specified.
             * @function toObject
             * @memberof asmail.AddMsgRequestBody.RetryOpt
             * @static
             * @param {asmail.AddMsgRequestBody.RetryOpt} message RetryOpt
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            RetryOpt.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults) {
                    object.numOfAttempts = 0;
                    object.timeBetweenAttempts = 0;
                }
                if (message.numOfAttempts != null && Object.hasOwnProperty.call(message, "numOfAttempts"))
                    object.numOfAttempts = message.numOfAttempts;
                if (message.timeBetweenAttempts != null && Object.hasOwnProperty.call(message, "timeBetweenAttempts"))
                    object.timeBetweenAttempts = message.timeBetweenAttempts;
                return object;
            };

            /**
             * Converts this RetryOpt to JSON.
             * @function toJSON
             * @memberof asmail.AddMsgRequestBody.RetryOpt
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            RetryOpt.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for RetryOpt
             * @function getTypeUrl
             * @memberof asmail.AddMsgRequestBody.RetryOpt
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            RetryOpt.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/asmail.AddMsgRequestBody.RetryOpt";
            };

            return RetryOpt;
        })();

        return AddMsgRequestBody;
    })();

    asmail.OutgoingMessageMsg = (function() {

        /**
         * Properties of an OutgoingMessageMsg.
         * @memberof asmail
         * @interface IOutgoingMessageMsg
         * @property {common.IStringValue|null} [msgId] OutgoingMessageMsg msgId
         * @property {string|null} [msgType] OutgoingMessageMsg msgType
         * @property {Array.<string>|null} [recipients] OutgoingMessageMsg recipients
         * @property {common.IStringValue|null} [subject] OutgoingMessageMsg subject
         * @property {common.IStringValue|null} [plainTxtBody] OutgoingMessageMsg plainTxtBody
         * @property {common.IStringValue|null} [htmlTxtBody] OutgoingMessageMsg htmlTxtBody
         * @property {common.IStringValue|null} [jsonBody] OutgoingMessageMsg jsonBody
         * @property {Array.<string>|null} [carbonCopy] OutgoingMessageMsg carbonCopy
         * @property {asmail.OutgoingMessageMsg.IAttachmentsContainer|null} [attachments] OutgoingMessageMsg attachments
         */

        /**
         * Constructs a new OutgoingMessageMsg.
         * @memberof asmail
         * @classdesc Represents an OutgoingMessageMsg.
         * @implements IOutgoingMessageMsg
         * @constructor
         * @param {asmail.IOutgoingMessageMsg=} [properties] Properties to set
         */
        function OutgoingMessageMsg(properties) {
            this.recipients = [];
            this.carbonCopy = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * OutgoingMessageMsg msgId.
         * @member {common.IStringValue|null|undefined} msgId
         * @memberof asmail.OutgoingMessageMsg
         * @instance
         */
        OutgoingMessageMsg.prototype.msgId = null;

        /**
         * OutgoingMessageMsg msgType.
         * @member {string} msgType
         * @memberof asmail.OutgoingMessageMsg
         * @instance
         */
        OutgoingMessageMsg.prototype.msgType = "";

        /**
         * OutgoingMessageMsg recipients.
         * @member {Array.<string>} recipients
         * @memberof asmail.OutgoingMessageMsg
         * @instance
         */
        OutgoingMessageMsg.prototype.recipients = $util.emptyArray;

        /**
         * OutgoingMessageMsg subject.
         * @member {common.IStringValue|null|undefined} subject
         * @memberof asmail.OutgoingMessageMsg
         * @instance
         */
        OutgoingMessageMsg.prototype.subject = null;

        /**
         * OutgoingMessageMsg plainTxtBody.
         * @member {common.IStringValue|null|undefined} plainTxtBody
         * @memberof asmail.OutgoingMessageMsg
         * @instance
         */
        OutgoingMessageMsg.prototype.plainTxtBody = null;

        /**
         * OutgoingMessageMsg htmlTxtBody.
         * @member {common.IStringValue|null|undefined} htmlTxtBody
         * @memberof asmail.OutgoingMessageMsg
         * @instance
         */
        OutgoingMessageMsg.prototype.htmlTxtBody = null;

        /**
         * OutgoingMessageMsg jsonBody.
         * @member {common.IStringValue|null|undefined} jsonBody
         * @memberof asmail.OutgoingMessageMsg
         * @instance
         */
        OutgoingMessageMsg.prototype.jsonBody = null;

        /**
         * OutgoingMessageMsg carbonCopy.
         * @member {Array.<string>} carbonCopy
         * @memberof asmail.OutgoingMessageMsg
         * @instance
         */
        OutgoingMessageMsg.prototype.carbonCopy = $util.emptyArray;

        /**
         * OutgoingMessageMsg attachments.
         * @member {asmail.OutgoingMessageMsg.IAttachmentsContainer|null|undefined} attachments
         * @memberof asmail.OutgoingMessageMsg
         * @instance
         */
        OutgoingMessageMsg.prototype.attachments = null;

        /**
         * Creates a new OutgoingMessageMsg instance using the specified properties.
         * @function create
         * @memberof asmail.OutgoingMessageMsg
         * @static
         * @param {asmail.IOutgoingMessageMsg=} [properties] Properties to set
         * @returns {asmail.OutgoingMessageMsg} OutgoingMessageMsg instance
         */
        OutgoingMessageMsg.create = function create(properties) {
            return new OutgoingMessageMsg(properties);
        };

        /**
         * Encodes the specified OutgoingMessageMsg message. Does not implicitly {@link asmail.OutgoingMessageMsg.verify|verify} messages.
         * @function encode
         * @memberof asmail.OutgoingMessageMsg
         * @static
         * @param {asmail.IOutgoingMessageMsg} message OutgoingMessageMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        OutgoingMessageMsg.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.msgId != null && Object.hasOwnProperty.call(message, "msgId"))
                $root.common.StringValue.encode(message.msgId, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.msgType != null && Object.hasOwnProperty.call(message, "msgType"))
                writer.uint32(/* id 10, wireType 2 =*/82).string(message.msgType);
            if (message.recipients != null && message.recipients.length)
                for (var i = 0; i < message.recipients.length; ++i)
                    writer.uint32(/* id 11, wireType 2 =*/90).string(message.recipients[i]);
            if (message.subject != null && Object.hasOwnProperty.call(message, "subject"))
                $root.common.StringValue.encode(message.subject, writer.uint32(/* id 12, wireType 2 =*/98).fork(), q + 1).ldelim();
            if (message.plainTxtBody != null && Object.hasOwnProperty.call(message, "plainTxtBody"))
                $root.common.StringValue.encode(message.plainTxtBody, writer.uint32(/* id 13, wireType 2 =*/106).fork(), q + 1).ldelim();
            if (message.htmlTxtBody != null && Object.hasOwnProperty.call(message, "htmlTxtBody"))
                $root.common.StringValue.encode(message.htmlTxtBody, writer.uint32(/* id 14, wireType 2 =*/114).fork(), q + 1).ldelim();
            if (message.jsonBody != null && Object.hasOwnProperty.call(message, "jsonBody"))
                $root.common.StringValue.encode(message.jsonBody, writer.uint32(/* id 15, wireType 2 =*/122).fork(), q + 1).ldelim();
            if (message.carbonCopy != null && message.carbonCopy.length)
                for (var i = 0; i < message.carbonCopy.length; ++i)
                    writer.uint32(/* id 16, wireType 2 =*/130).string(message.carbonCopy[i]);
            if (message.attachments != null && Object.hasOwnProperty.call(message, "attachments"))
                $root.asmail.OutgoingMessageMsg.AttachmentsContainer.encode(message.attachments, writer.uint32(/* id 17, wireType 2 =*/138).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified OutgoingMessageMsg message, length delimited. Does not implicitly {@link asmail.OutgoingMessageMsg.verify|verify} messages.
         * @function encodeDelimited
         * @memberof asmail.OutgoingMessageMsg
         * @static
         * @param {asmail.IOutgoingMessageMsg} message OutgoingMessageMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        OutgoingMessageMsg.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an OutgoingMessageMsg message from the specified reader or buffer.
         * @function decode
         * @memberof asmail.OutgoingMessageMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {asmail.OutgoingMessageMsg} OutgoingMessageMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        OutgoingMessageMsg.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.OutgoingMessageMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.msgId = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 10: {
                        message.msgType = reader.string();
                        break;
                    }
                case 11: {
                        if (!(message.recipients && message.recipients.length))
                            message.recipients = [];
                        message.recipients.push(reader.string());
                        break;
                    }
                case 12: {
                        message.subject = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 13: {
                        message.plainTxtBody = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 14: {
                        message.htmlTxtBody = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 15: {
                        message.jsonBody = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 16: {
                        if (!(message.carbonCopy && message.carbonCopy.length))
                            message.carbonCopy = [];
                        message.carbonCopy.push(reader.string());
                        break;
                    }
                case 17: {
                        message.attachments = $root.asmail.OutgoingMessageMsg.AttachmentsContainer.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an OutgoingMessageMsg message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof asmail.OutgoingMessageMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {asmail.OutgoingMessageMsg} OutgoingMessageMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        OutgoingMessageMsg.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an OutgoingMessageMsg message.
         * @function verify
         * @memberof asmail.OutgoingMessageMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        OutgoingMessageMsg.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.msgId != null && Object.hasOwnProperty.call(message, "msgId")) {
                var error = $root.common.StringValue.verify(message.msgId, long + 1);
                if (error)
                    return "msgId." + error;
            }
            if (message.msgType != null && Object.hasOwnProperty.call(message, "msgType"))
                if (!$util.isString(message.msgType))
                    return "msgType: string expected";
            if (message.recipients != null && Object.hasOwnProperty.call(message, "recipients")) {
                if (!Array.isArray(message.recipients))
                    return "recipients: array expected";
                for (var i = 0; i < message.recipients.length; ++i)
                    if (!$util.isString(message.recipients[i]))
                        return "recipients: string[] expected";
            }
            if (message.subject != null && Object.hasOwnProperty.call(message, "subject")) {
                var error = $root.common.StringValue.verify(message.subject, long + 1);
                if (error)
                    return "subject." + error;
            }
            if (message.plainTxtBody != null && Object.hasOwnProperty.call(message, "plainTxtBody")) {
                var error = $root.common.StringValue.verify(message.plainTxtBody, long + 1);
                if (error)
                    return "plainTxtBody." + error;
            }
            if (message.htmlTxtBody != null && Object.hasOwnProperty.call(message, "htmlTxtBody")) {
                var error = $root.common.StringValue.verify(message.htmlTxtBody, long + 1);
                if (error)
                    return "htmlTxtBody." + error;
            }
            if (message.jsonBody != null && Object.hasOwnProperty.call(message, "jsonBody")) {
                var error = $root.common.StringValue.verify(message.jsonBody, long + 1);
                if (error)
                    return "jsonBody." + error;
            }
            if (message.carbonCopy != null && Object.hasOwnProperty.call(message, "carbonCopy")) {
                if (!Array.isArray(message.carbonCopy))
                    return "carbonCopy: array expected";
                for (var i = 0; i < message.carbonCopy.length; ++i)
                    if (!$util.isString(message.carbonCopy[i]))
                        return "carbonCopy: string[] expected";
            }
            if (message.attachments != null && Object.hasOwnProperty.call(message, "attachments")) {
                var error = $root.asmail.OutgoingMessageMsg.AttachmentsContainer.verify(message.attachments, long + 1);
                if (error)
                    return "attachments." + error;
            }
            return null;
        };

        /**
         * Creates an OutgoingMessageMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof asmail.OutgoingMessageMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {asmail.OutgoingMessageMsg} OutgoingMessageMsg
         */
        OutgoingMessageMsg.fromObject = function fromObject(object, long) {
            if (object instanceof $root.asmail.OutgoingMessageMsg)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".asmail.OutgoingMessageMsg: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.asmail.OutgoingMessageMsg();
            if (object.msgId != null) {
                if (!$util.isObject(object.msgId))
                    throw TypeError(".asmail.OutgoingMessageMsg.msgId: object expected");
                message.msgId = $root.common.StringValue.fromObject(object.msgId, long + 1);
            }
            if (object.msgType != null)
                message.msgType = String(object.msgType);
            if (object.recipients) {
                if (!Array.isArray(object.recipients))
                    throw TypeError(".asmail.OutgoingMessageMsg.recipients: array expected");
                message.recipients = [];
                for (var i = 0; i < object.recipients.length; ++i)
                    message.recipients[i] = String(object.recipients[i]);
            }
            if (object.subject != null) {
                if (!$util.isObject(object.subject))
                    throw TypeError(".asmail.OutgoingMessageMsg.subject: object expected");
                message.subject = $root.common.StringValue.fromObject(object.subject, long + 1);
            }
            if (object.plainTxtBody != null) {
                if (!$util.isObject(object.plainTxtBody))
                    throw TypeError(".asmail.OutgoingMessageMsg.plainTxtBody: object expected");
                message.plainTxtBody = $root.common.StringValue.fromObject(object.plainTxtBody, long + 1);
            }
            if (object.htmlTxtBody != null) {
                if (!$util.isObject(object.htmlTxtBody))
                    throw TypeError(".asmail.OutgoingMessageMsg.htmlTxtBody: object expected");
                message.htmlTxtBody = $root.common.StringValue.fromObject(object.htmlTxtBody, long + 1);
            }
            if (object.jsonBody != null) {
                if (!$util.isObject(object.jsonBody))
                    throw TypeError(".asmail.OutgoingMessageMsg.jsonBody: object expected");
                message.jsonBody = $root.common.StringValue.fromObject(object.jsonBody, long + 1);
            }
            if (object.carbonCopy) {
                if (!Array.isArray(object.carbonCopy))
                    throw TypeError(".asmail.OutgoingMessageMsg.carbonCopy: array expected");
                message.carbonCopy = [];
                for (var i = 0; i < object.carbonCopy.length; ++i)
                    message.carbonCopy[i] = String(object.carbonCopy[i]);
            }
            if (object.attachments != null) {
                if (!$util.isObject(object.attachments))
                    throw TypeError(".asmail.OutgoingMessageMsg.attachments: object expected");
                message.attachments = $root.asmail.OutgoingMessageMsg.AttachmentsContainer.fromObject(object.attachments, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an OutgoingMessageMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof asmail.OutgoingMessageMsg
         * @static
         * @param {asmail.OutgoingMessageMsg} message OutgoingMessageMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        OutgoingMessageMsg.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults) {
                object.recipients = [];
                object.carbonCopy = [];
            }
            if (options.defaults) {
                object.msgId = null;
                object.msgType = "";
                object.subject = null;
                object.plainTxtBody = null;
                object.htmlTxtBody = null;
                object.jsonBody = null;
                object.attachments = null;
            }
            if (message.msgId != null && Object.hasOwnProperty.call(message, "msgId"))
                object.msgId = $root.common.StringValue.toObject(message.msgId, options, q + 1);
            if (message.msgType != null && Object.hasOwnProperty.call(message, "msgType"))
                object.msgType = message.msgType;
            if (message.recipients && message.recipients.length) {
                object.recipients = [];
                for (var j = 0; j < message.recipients.length; ++j)
                    object.recipients[j] = message.recipients[j];
            }
            if (message.subject != null && Object.hasOwnProperty.call(message, "subject"))
                object.subject = $root.common.StringValue.toObject(message.subject, options, q + 1);
            if (message.plainTxtBody != null && Object.hasOwnProperty.call(message, "plainTxtBody"))
                object.plainTxtBody = $root.common.StringValue.toObject(message.plainTxtBody, options, q + 1);
            if (message.htmlTxtBody != null && Object.hasOwnProperty.call(message, "htmlTxtBody"))
                object.htmlTxtBody = $root.common.StringValue.toObject(message.htmlTxtBody, options, q + 1);
            if (message.jsonBody != null && Object.hasOwnProperty.call(message, "jsonBody"))
                object.jsonBody = $root.common.StringValue.toObject(message.jsonBody, options, q + 1);
            if (message.carbonCopy && message.carbonCopy.length) {
                object.carbonCopy = [];
                for (var j = 0; j < message.carbonCopy.length; ++j)
                    object.carbonCopy[j] = message.carbonCopy[j];
            }
            if (message.attachments != null && Object.hasOwnProperty.call(message, "attachments"))
                object.attachments = $root.asmail.OutgoingMessageMsg.AttachmentsContainer.toObject(message.attachments, options, q + 1);
            return object;
        };

        /**
         * Converts this OutgoingMessageMsg to JSON.
         * @function toJSON
         * @memberof asmail.OutgoingMessageMsg
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        OutgoingMessageMsg.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for OutgoingMessageMsg
         * @function getTypeUrl
         * @memberof asmail.OutgoingMessageMsg
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        OutgoingMessageMsg.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/asmail.OutgoingMessageMsg";
        };

        OutgoingMessageMsg.AttachmentsContainer = (function() {

            /**
             * Properties of an AttachmentsContainer.
             * @memberof asmail.OutgoingMessageMsg
             * @interface IAttachmentsContainer
             * @property {Array.<asmail.OutgoingMessageMsg.INamedFSItem>|null} [files] AttachmentsContainer files
             * @property {Array.<asmail.OutgoingMessageMsg.INamedFSItem>|null} [folders] AttachmentsContainer folders
             */

            /**
             * Constructs a new AttachmentsContainer.
             * @memberof asmail.OutgoingMessageMsg
             * @classdesc Represents an AttachmentsContainer.
             * @implements IAttachmentsContainer
             * @constructor
             * @param {asmail.OutgoingMessageMsg.IAttachmentsContainer=} [properties] Properties to set
             */
            function AttachmentsContainer(properties) {
                this.files = [];
                this.folders = [];
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * AttachmentsContainer files.
             * @member {Array.<asmail.OutgoingMessageMsg.INamedFSItem>} files
             * @memberof asmail.OutgoingMessageMsg.AttachmentsContainer
             * @instance
             */
            AttachmentsContainer.prototype.files = $util.emptyArray;

            /**
             * AttachmentsContainer folders.
             * @member {Array.<asmail.OutgoingMessageMsg.INamedFSItem>} folders
             * @memberof asmail.OutgoingMessageMsg.AttachmentsContainer
             * @instance
             */
            AttachmentsContainer.prototype.folders = $util.emptyArray;

            /**
             * Creates a new AttachmentsContainer instance using the specified properties.
             * @function create
             * @memberof asmail.OutgoingMessageMsg.AttachmentsContainer
             * @static
             * @param {asmail.OutgoingMessageMsg.IAttachmentsContainer=} [properties] Properties to set
             * @returns {asmail.OutgoingMessageMsg.AttachmentsContainer} AttachmentsContainer instance
             */
            AttachmentsContainer.create = function create(properties) {
                return new AttachmentsContainer(properties);
            };

            /**
             * Encodes the specified AttachmentsContainer message. Does not implicitly {@link asmail.OutgoingMessageMsg.AttachmentsContainer.verify|verify} messages.
             * @function encode
             * @memberof asmail.OutgoingMessageMsg.AttachmentsContainer
             * @static
             * @param {asmail.OutgoingMessageMsg.IAttachmentsContainer} message AttachmentsContainer message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            AttachmentsContainer.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.files != null && message.files.length)
                    for (var i = 0; i < message.files.length; ++i)
                        $root.asmail.OutgoingMessageMsg.NamedFSItem.encode(message.files[i], writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
                if (message.folders != null && message.folders.length)
                    for (var i = 0; i < message.folders.length; ++i)
                        $root.asmail.OutgoingMessageMsg.NamedFSItem.encode(message.folders[i], writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
                return writer;
            };

            /**
             * Encodes the specified AttachmentsContainer message, length delimited. Does not implicitly {@link asmail.OutgoingMessageMsg.AttachmentsContainer.verify|verify} messages.
             * @function encodeDelimited
             * @memberof asmail.OutgoingMessageMsg.AttachmentsContainer
             * @static
             * @param {asmail.OutgoingMessageMsg.IAttachmentsContainer} message AttachmentsContainer message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            AttachmentsContainer.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes an AttachmentsContainer message from the specified reader or buffer.
             * @function decode
             * @memberof asmail.OutgoingMessageMsg.AttachmentsContainer
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {asmail.OutgoingMessageMsg.AttachmentsContainer} AttachmentsContainer
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            AttachmentsContainer.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.OutgoingMessageMsg.AttachmentsContainer();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            if (!(message.files && message.files.length))
                                message.files = [];
                            message.files.push($root.asmail.OutgoingMessageMsg.NamedFSItem.decode(reader, reader.uint32(), undefined, long + 1));
                            break;
                        }
                    case 2: {
                            if (!(message.folders && message.folders.length))
                                message.folders = [];
                            message.folders.push($root.asmail.OutgoingMessageMsg.NamedFSItem.decode(reader, reader.uint32(), undefined, long + 1));
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes an AttachmentsContainer message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof asmail.OutgoingMessageMsg.AttachmentsContainer
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {asmail.OutgoingMessageMsg.AttachmentsContainer} AttachmentsContainer
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            AttachmentsContainer.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies an AttachmentsContainer message.
             * @function verify
             * @memberof asmail.OutgoingMessageMsg.AttachmentsContainer
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            AttachmentsContainer.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.files != null && Object.hasOwnProperty.call(message, "files")) {
                    if (!Array.isArray(message.files))
                        return "files: array expected";
                    for (var i = 0; i < message.files.length; ++i) {
                        var error = $root.asmail.OutgoingMessageMsg.NamedFSItem.verify(message.files[i], long + 1);
                        if (error)
                            return "files." + error;
                    }
                }
                if (message.folders != null && Object.hasOwnProperty.call(message, "folders")) {
                    if (!Array.isArray(message.folders))
                        return "folders: array expected";
                    for (var i = 0; i < message.folders.length; ++i) {
                        var error = $root.asmail.OutgoingMessageMsg.NamedFSItem.verify(message.folders[i], long + 1);
                        if (error)
                            return "folders." + error;
                    }
                }
                return null;
            };

            /**
             * Creates an AttachmentsContainer message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof asmail.OutgoingMessageMsg.AttachmentsContainer
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {asmail.OutgoingMessageMsg.AttachmentsContainer} AttachmentsContainer
             */
            AttachmentsContainer.fromObject = function fromObject(object, long) {
                if (object instanceof $root.asmail.OutgoingMessageMsg.AttachmentsContainer)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".asmail.OutgoingMessageMsg.AttachmentsContainer: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.asmail.OutgoingMessageMsg.AttachmentsContainer();
                if (object.files) {
                    if (!Array.isArray(object.files))
                        throw TypeError(".asmail.OutgoingMessageMsg.AttachmentsContainer.files: array expected");
                    message.files = [];
                    for (var i = 0; i < object.files.length; ++i) {
                        if (!$util.isObject(object.files[i]))
                            throw TypeError(".asmail.OutgoingMessageMsg.AttachmentsContainer.files: object expected");
                        message.files[i] = $root.asmail.OutgoingMessageMsg.NamedFSItem.fromObject(object.files[i], long + 1);
                    }
                }
                if (object.folders) {
                    if (!Array.isArray(object.folders))
                        throw TypeError(".asmail.OutgoingMessageMsg.AttachmentsContainer.folders: array expected");
                    message.folders = [];
                    for (var i = 0; i < object.folders.length; ++i) {
                        if (!$util.isObject(object.folders[i]))
                            throw TypeError(".asmail.OutgoingMessageMsg.AttachmentsContainer.folders: object expected");
                        message.folders[i] = $root.asmail.OutgoingMessageMsg.NamedFSItem.fromObject(object.folders[i], long + 1);
                    }
                }
                return message;
            };

            /**
             * Creates a plain object from an AttachmentsContainer message. Also converts values to other types if specified.
             * @function toObject
             * @memberof asmail.OutgoingMessageMsg.AttachmentsContainer
             * @static
             * @param {asmail.OutgoingMessageMsg.AttachmentsContainer} message AttachmentsContainer
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            AttachmentsContainer.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.arrays || options.defaults) {
                    object.files = [];
                    object.folders = [];
                }
                if (message.files && message.files.length) {
                    object.files = [];
                    for (var j = 0; j < message.files.length; ++j)
                        object.files[j] = $root.asmail.OutgoingMessageMsg.NamedFSItem.toObject(message.files[j], options, q + 1);
                }
                if (message.folders && message.folders.length) {
                    object.folders = [];
                    for (var j = 0; j < message.folders.length; ++j)
                        object.folders[j] = $root.asmail.OutgoingMessageMsg.NamedFSItem.toObject(message.folders[j], options, q + 1);
                }
                return object;
            };

            /**
             * Converts this AttachmentsContainer to JSON.
             * @function toJSON
             * @memberof asmail.OutgoingMessageMsg.AttachmentsContainer
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            AttachmentsContainer.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for AttachmentsContainer
             * @function getTypeUrl
             * @memberof asmail.OutgoingMessageMsg.AttachmentsContainer
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            AttachmentsContainer.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/asmail.OutgoingMessageMsg.AttachmentsContainer";
            };

            return AttachmentsContainer;
        })();

        OutgoingMessageMsg.NamedFSItem = (function() {

            /**
             * Properties of a NamedFSItem.
             * @memberof asmail.OutgoingMessageMsg
             * @interface INamedFSItem
             * @property {string|null} [name] NamedFSItem name
             * @property {common.IObjectReference|null} [item] NamedFSItem item
             */

            /**
             * Constructs a new NamedFSItem.
             * @memberof asmail.OutgoingMessageMsg
             * @classdesc Represents a NamedFSItem.
             * @implements INamedFSItem
             * @constructor
             * @param {asmail.OutgoingMessageMsg.INamedFSItem=} [properties] Properties to set
             */
            function NamedFSItem(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * NamedFSItem name.
             * @member {string} name
             * @memberof asmail.OutgoingMessageMsg.NamedFSItem
             * @instance
             */
            NamedFSItem.prototype.name = "";

            /**
             * NamedFSItem item.
             * @member {common.IObjectReference|null|undefined} item
             * @memberof asmail.OutgoingMessageMsg.NamedFSItem
             * @instance
             */
            NamedFSItem.prototype.item = null;

            /**
             * Creates a new NamedFSItem instance using the specified properties.
             * @function create
             * @memberof asmail.OutgoingMessageMsg.NamedFSItem
             * @static
             * @param {asmail.OutgoingMessageMsg.INamedFSItem=} [properties] Properties to set
             * @returns {asmail.OutgoingMessageMsg.NamedFSItem} NamedFSItem instance
             */
            NamedFSItem.create = function create(properties) {
                return new NamedFSItem(properties);
            };

            /**
             * Encodes the specified NamedFSItem message. Does not implicitly {@link asmail.OutgoingMessageMsg.NamedFSItem.verify|verify} messages.
             * @function encode
             * @memberof asmail.OutgoingMessageMsg.NamedFSItem
             * @static
             * @param {asmail.OutgoingMessageMsg.INamedFSItem} message NamedFSItem message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            NamedFSItem.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
                if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                    $root.common.ObjectReference.encode(message.item, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
                return writer;
            };

            /**
             * Encodes the specified NamedFSItem message, length delimited. Does not implicitly {@link asmail.OutgoingMessageMsg.NamedFSItem.verify|verify} messages.
             * @function encodeDelimited
             * @memberof asmail.OutgoingMessageMsg.NamedFSItem
             * @static
             * @param {asmail.OutgoingMessageMsg.INamedFSItem} message NamedFSItem message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            NamedFSItem.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes a NamedFSItem message from the specified reader or buffer.
             * @function decode
             * @memberof asmail.OutgoingMessageMsg.NamedFSItem
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {asmail.OutgoingMessageMsg.NamedFSItem} NamedFSItem
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            NamedFSItem.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.OutgoingMessageMsg.NamedFSItem();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.name = reader.string();
                            break;
                        }
                    case 2: {
                            message.item = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a NamedFSItem message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof asmail.OutgoingMessageMsg.NamedFSItem
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {asmail.OutgoingMessageMsg.NamedFSItem} NamedFSItem
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            NamedFSItem.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a NamedFSItem message.
             * @function verify
             * @memberof asmail.OutgoingMessageMsg.NamedFSItem
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            NamedFSItem.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                    if (!$util.isString(message.name))
                        return "name: string expected";
                if (message.item != null && Object.hasOwnProperty.call(message, "item")) {
                    var error = $root.common.ObjectReference.verify(message.item, long + 1);
                    if (error)
                        return "item." + error;
                }
                return null;
            };

            /**
             * Creates a NamedFSItem message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof asmail.OutgoingMessageMsg.NamedFSItem
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {asmail.OutgoingMessageMsg.NamedFSItem} NamedFSItem
             */
            NamedFSItem.fromObject = function fromObject(object, long) {
                if (object instanceof $root.asmail.OutgoingMessageMsg.NamedFSItem)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".asmail.OutgoingMessageMsg.NamedFSItem: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.asmail.OutgoingMessageMsg.NamedFSItem();
                if (object.name != null)
                    message.name = String(object.name);
                if (object.item != null) {
                    if (!$util.isObject(object.item))
                        throw TypeError(".asmail.OutgoingMessageMsg.NamedFSItem.item: object expected");
                    message.item = $root.common.ObjectReference.fromObject(object.item, long + 1);
                }
                return message;
            };

            /**
             * Creates a plain object from a NamedFSItem message. Also converts values to other types if specified.
             * @function toObject
             * @memberof asmail.OutgoingMessageMsg.NamedFSItem
             * @static
             * @param {asmail.OutgoingMessageMsg.NamedFSItem} message NamedFSItem
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            NamedFSItem.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults) {
                    object.name = "";
                    object.item = null;
                }
                if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                    object.name = message.name;
                if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                    object.item = $root.common.ObjectReference.toObject(message.item, options, q + 1);
                return object;
            };

            /**
             * Converts this NamedFSItem to JSON.
             * @function toJSON
             * @memberof asmail.OutgoingMessageMsg.NamedFSItem
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            NamedFSItem.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for NamedFSItem
             * @function getTypeUrl
             * @memberof asmail.OutgoingMessageMsg.NamedFSItem
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            NamedFSItem.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/asmail.OutgoingMessageMsg.NamedFSItem";
            };

            return NamedFSItem;
        })();

        return OutgoingMessageMsg;
    })();

    asmail.ListMsgsDeliveryReplyBody = (function() {

        /**
         * Properties of a ListMsgsDeliveryReplyBody.
         * @memberof asmail
         * @interface IListMsgsDeliveryReplyBody
         * @property {Array.<asmail.ListMsgsDeliveryReplyBody.IMsgInfo>|null} [msgs] ListMsgsDeliveryReplyBody msgs
         */

        /**
         * Constructs a new ListMsgsDeliveryReplyBody.
         * @memberof asmail
         * @classdesc Represents a ListMsgsDeliveryReplyBody.
         * @implements IListMsgsDeliveryReplyBody
         * @constructor
         * @param {asmail.IListMsgsDeliveryReplyBody=} [properties] Properties to set
         */
        function ListMsgsDeliveryReplyBody(properties) {
            this.msgs = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ListMsgsDeliveryReplyBody msgs.
         * @member {Array.<asmail.ListMsgsDeliveryReplyBody.IMsgInfo>} msgs
         * @memberof asmail.ListMsgsDeliveryReplyBody
         * @instance
         */
        ListMsgsDeliveryReplyBody.prototype.msgs = $util.emptyArray;

        /**
         * Creates a new ListMsgsDeliveryReplyBody instance using the specified properties.
         * @function create
         * @memberof asmail.ListMsgsDeliveryReplyBody
         * @static
         * @param {asmail.IListMsgsDeliveryReplyBody=} [properties] Properties to set
         * @returns {asmail.ListMsgsDeliveryReplyBody} ListMsgsDeliveryReplyBody instance
         */
        ListMsgsDeliveryReplyBody.create = function create(properties) {
            return new ListMsgsDeliveryReplyBody(properties);
        };

        /**
         * Encodes the specified ListMsgsDeliveryReplyBody message. Does not implicitly {@link asmail.ListMsgsDeliveryReplyBody.verify|verify} messages.
         * @function encode
         * @memberof asmail.ListMsgsDeliveryReplyBody
         * @static
         * @param {asmail.IListMsgsDeliveryReplyBody} message ListMsgsDeliveryReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ListMsgsDeliveryReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.msgs != null && message.msgs.length)
                for (var i = 0; i < message.msgs.length; ++i)
                    $root.asmail.ListMsgsDeliveryReplyBody.MsgInfo.encode(message.msgs[i], writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified ListMsgsDeliveryReplyBody message, length delimited. Does not implicitly {@link asmail.ListMsgsDeliveryReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof asmail.ListMsgsDeliveryReplyBody
         * @static
         * @param {asmail.IListMsgsDeliveryReplyBody} message ListMsgsDeliveryReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ListMsgsDeliveryReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a ListMsgsDeliveryReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof asmail.ListMsgsDeliveryReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {asmail.ListMsgsDeliveryReplyBody} ListMsgsDeliveryReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ListMsgsDeliveryReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.ListMsgsDeliveryReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.msgs && message.msgs.length))
                            message.msgs = [];
                        message.msgs.push($root.asmail.ListMsgsDeliveryReplyBody.MsgInfo.decode(reader, reader.uint32(), undefined, long + 1));
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a ListMsgsDeliveryReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof asmail.ListMsgsDeliveryReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {asmail.ListMsgsDeliveryReplyBody} ListMsgsDeliveryReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ListMsgsDeliveryReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a ListMsgsDeliveryReplyBody message.
         * @function verify
         * @memberof asmail.ListMsgsDeliveryReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ListMsgsDeliveryReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.msgs != null && Object.hasOwnProperty.call(message, "msgs")) {
                if (!Array.isArray(message.msgs))
                    return "msgs: array expected";
                for (var i = 0; i < message.msgs.length; ++i) {
                    var error = $root.asmail.ListMsgsDeliveryReplyBody.MsgInfo.verify(message.msgs[i], long + 1);
                    if (error)
                        return "msgs." + error;
                }
            }
            return null;
        };

        /**
         * Creates a ListMsgsDeliveryReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof asmail.ListMsgsDeliveryReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {asmail.ListMsgsDeliveryReplyBody} ListMsgsDeliveryReplyBody
         */
        ListMsgsDeliveryReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.asmail.ListMsgsDeliveryReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".asmail.ListMsgsDeliveryReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.asmail.ListMsgsDeliveryReplyBody();
            if (object.msgs) {
                if (!Array.isArray(object.msgs))
                    throw TypeError(".asmail.ListMsgsDeliveryReplyBody.msgs: array expected");
                message.msgs = [];
                for (var i = 0; i < object.msgs.length; ++i) {
                    if (!$util.isObject(object.msgs[i]))
                        throw TypeError(".asmail.ListMsgsDeliveryReplyBody.msgs: object expected");
                    message.msgs[i] = $root.asmail.ListMsgsDeliveryReplyBody.MsgInfo.fromObject(object.msgs[i], long + 1);
                }
            }
            return message;
        };

        /**
         * Creates a plain object from a ListMsgsDeliveryReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof asmail.ListMsgsDeliveryReplyBody
         * @static
         * @param {asmail.ListMsgsDeliveryReplyBody} message ListMsgsDeliveryReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ListMsgsDeliveryReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.msgs = [];
            if (message.msgs && message.msgs.length) {
                object.msgs = [];
                for (var j = 0; j < message.msgs.length; ++j)
                    object.msgs[j] = $root.asmail.ListMsgsDeliveryReplyBody.MsgInfo.toObject(message.msgs[j], options, q + 1);
            }
            return object;
        };

        /**
         * Converts this ListMsgsDeliveryReplyBody to JSON.
         * @function toJSON
         * @memberof asmail.ListMsgsDeliveryReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ListMsgsDeliveryReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ListMsgsDeliveryReplyBody
         * @function getTypeUrl
         * @memberof asmail.ListMsgsDeliveryReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ListMsgsDeliveryReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/asmail.ListMsgsDeliveryReplyBody";
        };

        ListMsgsDeliveryReplyBody.MsgInfo = (function() {

            /**
             * Properties of a MsgInfo.
             * @memberof asmail.ListMsgsDeliveryReplyBody
             * @interface IMsgInfo
             * @property {string|null} [id] MsgInfo id
             * @property {asmail.IDeliveryProgressMsg|null} [info] MsgInfo info
             */

            /**
             * Constructs a new MsgInfo.
             * @memberof asmail.ListMsgsDeliveryReplyBody
             * @classdesc Represents a MsgInfo.
             * @implements IMsgInfo
             * @constructor
             * @param {asmail.ListMsgsDeliveryReplyBody.IMsgInfo=} [properties] Properties to set
             */
            function MsgInfo(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * MsgInfo id.
             * @member {string} id
             * @memberof asmail.ListMsgsDeliveryReplyBody.MsgInfo
             * @instance
             */
            MsgInfo.prototype.id = "";

            /**
             * MsgInfo info.
             * @member {asmail.IDeliveryProgressMsg|null|undefined} info
             * @memberof asmail.ListMsgsDeliveryReplyBody.MsgInfo
             * @instance
             */
            MsgInfo.prototype.info = null;

            /**
             * Creates a new MsgInfo instance using the specified properties.
             * @function create
             * @memberof asmail.ListMsgsDeliveryReplyBody.MsgInfo
             * @static
             * @param {asmail.ListMsgsDeliveryReplyBody.IMsgInfo=} [properties] Properties to set
             * @returns {asmail.ListMsgsDeliveryReplyBody.MsgInfo} MsgInfo instance
             */
            MsgInfo.create = function create(properties) {
                return new MsgInfo(properties);
            };

            /**
             * Encodes the specified MsgInfo message. Does not implicitly {@link asmail.ListMsgsDeliveryReplyBody.MsgInfo.verify|verify} messages.
             * @function encode
             * @memberof asmail.ListMsgsDeliveryReplyBody.MsgInfo
             * @static
             * @param {asmail.ListMsgsDeliveryReplyBody.IMsgInfo} message MsgInfo message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            MsgInfo.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.id != null && Object.hasOwnProperty.call(message, "id"))
                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.id);
                if (message.info != null && Object.hasOwnProperty.call(message, "info"))
                    $root.asmail.DeliveryProgressMsg.encode(message.info, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
                return writer;
            };

            /**
             * Encodes the specified MsgInfo message, length delimited. Does not implicitly {@link asmail.ListMsgsDeliveryReplyBody.MsgInfo.verify|verify} messages.
             * @function encodeDelimited
             * @memberof asmail.ListMsgsDeliveryReplyBody.MsgInfo
             * @static
             * @param {asmail.ListMsgsDeliveryReplyBody.IMsgInfo} message MsgInfo message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            MsgInfo.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes a MsgInfo message from the specified reader or buffer.
             * @function decode
             * @memberof asmail.ListMsgsDeliveryReplyBody.MsgInfo
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {asmail.ListMsgsDeliveryReplyBody.MsgInfo} MsgInfo
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            MsgInfo.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.ListMsgsDeliveryReplyBody.MsgInfo();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.id = reader.string();
                            break;
                        }
                    case 2: {
                            message.info = $root.asmail.DeliveryProgressMsg.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a MsgInfo message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof asmail.ListMsgsDeliveryReplyBody.MsgInfo
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {asmail.ListMsgsDeliveryReplyBody.MsgInfo} MsgInfo
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            MsgInfo.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a MsgInfo message.
             * @function verify
             * @memberof asmail.ListMsgsDeliveryReplyBody.MsgInfo
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            MsgInfo.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.id != null && Object.hasOwnProperty.call(message, "id"))
                    if (!$util.isString(message.id))
                        return "id: string expected";
                if (message.info != null && Object.hasOwnProperty.call(message, "info")) {
                    var error = $root.asmail.DeliveryProgressMsg.verify(message.info, long + 1);
                    if (error)
                        return "info." + error;
                }
                return null;
            };

            /**
             * Creates a MsgInfo message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof asmail.ListMsgsDeliveryReplyBody.MsgInfo
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {asmail.ListMsgsDeliveryReplyBody.MsgInfo} MsgInfo
             */
            MsgInfo.fromObject = function fromObject(object, long) {
                if (object instanceof $root.asmail.ListMsgsDeliveryReplyBody.MsgInfo)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".asmail.ListMsgsDeliveryReplyBody.MsgInfo: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.asmail.ListMsgsDeliveryReplyBody.MsgInfo();
                if (object.id != null)
                    message.id = String(object.id);
                if (object.info != null) {
                    if (!$util.isObject(object.info))
                        throw TypeError(".asmail.ListMsgsDeliveryReplyBody.MsgInfo.info: object expected");
                    message.info = $root.asmail.DeliveryProgressMsg.fromObject(object.info, long + 1);
                }
                return message;
            };

            /**
             * Creates a plain object from a MsgInfo message. Also converts values to other types if specified.
             * @function toObject
             * @memberof asmail.ListMsgsDeliveryReplyBody.MsgInfo
             * @static
             * @param {asmail.ListMsgsDeliveryReplyBody.MsgInfo} message MsgInfo
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            MsgInfo.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults) {
                    object.id = "";
                    object.info = null;
                }
                if (message.id != null && Object.hasOwnProperty.call(message, "id"))
                    object.id = message.id;
                if (message.info != null && Object.hasOwnProperty.call(message, "info"))
                    object.info = $root.asmail.DeliveryProgressMsg.toObject(message.info, options, q + 1);
                return object;
            };

            /**
             * Converts this MsgInfo to JSON.
             * @function toJSON
             * @memberof asmail.ListMsgsDeliveryReplyBody.MsgInfo
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            MsgInfo.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for MsgInfo
             * @function getTypeUrl
             * @memberof asmail.ListMsgsDeliveryReplyBody.MsgInfo
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            MsgInfo.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/asmail.ListMsgsDeliveryReplyBody.MsgInfo";
            };

            return MsgInfo;
        })();

        return ListMsgsDeliveryReplyBody;
    })();

    asmail.DeliveryProgressMsg = (function() {

        /**
         * Properties of a DeliveryProgressMsg.
         * @memberof asmail
         * @interface IDeliveryProgressMsg
         * @property {common.IBooleanValue|null} [notConnected] DeliveryProgressMsg notConnected
         * @property {common.IStringValue|null} [allDone] DeliveryProgressMsg allDone
         * @property {number|Long|null} [msgSize] DeliveryProgressMsg msgSize
         * @property {common.IAnyValue|null} [localMeta] DeliveryProgressMsg localMeta
         * @property {Array.<asmail.DeliveryProgressMsg.IAddrAndDeliveryInfo>|null} [recipients] DeliveryProgressMsg recipients
         */

        /**
         * Constructs a new DeliveryProgressMsg.
         * @memberof asmail
         * @classdesc Represents a DeliveryProgressMsg.
         * @implements IDeliveryProgressMsg
         * @constructor
         * @param {asmail.IDeliveryProgressMsg=} [properties] Properties to set
         */
        function DeliveryProgressMsg(properties) {
            this.recipients = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * DeliveryProgressMsg notConnected.
         * @member {common.IBooleanValue|null|undefined} notConnected
         * @memberof asmail.DeliveryProgressMsg
         * @instance
         */
        DeliveryProgressMsg.prototype.notConnected = null;

        /**
         * DeliveryProgressMsg allDone.
         * @member {common.IStringValue|null|undefined} allDone
         * @memberof asmail.DeliveryProgressMsg
         * @instance
         */
        DeliveryProgressMsg.prototype.allDone = null;

        /**
         * DeliveryProgressMsg msgSize.
         * @member {number|Long} msgSize
         * @memberof asmail.DeliveryProgressMsg
         * @instance
         */
        DeliveryProgressMsg.prototype.msgSize = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * DeliveryProgressMsg localMeta.
         * @member {common.IAnyValue|null|undefined} localMeta
         * @memberof asmail.DeliveryProgressMsg
         * @instance
         */
        DeliveryProgressMsg.prototype.localMeta = null;

        /**
         * DeliveryProgressMsg recipients.
         * @member {Array.<asmail.DeliveryProgressMsg.IAddrAndDeliveryInfo>} recipients
         * @memberof asmail.DeliveryProgressMsg
         * @instance
         */
        DeliveryProgressMsg.prototype.recipients = $util.emptyArray;

        /**
         * Creates a new DeliveryProgressMsg instance using the specified properties.
         * @function create
         * @memberof asmail.DeliveryProgressMsg
         * @static
         * @param {asmail.IDeliveryProgressMsg=} [properties] Properties to set
         * @returns {asmail.DeliveryProgressMsg} DeliveryProgressMsg instance
         */
        DeliveryProgressMsg.create = function create(properties) {
            return new DeliveryProgressMsg(properties);
        };

        /**
         * Encodes the specified DeliveryProgressMsg message. Does not implicitly {@link asmail.DeliveryProgressMsg.verify|verify} messages.
         * @function encode
         * @memberof asmail.DeliveryProgressMsg
         * @static
         * @param {asmail.IDeliveryProgressMsg} message DeliveryProgressMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DeliveryProgressMsg.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.notConnected != null && Object.hasOwnProperty.call(message, "notConnected"))
                $root.common.BooleanValue.encode(message.notConnected, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.allDone != null && Object.hasOwnProperty.call(message, "allDone"))
                $root.common.StringValue.encode(message.allDone, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.msgSize != null && Object.hasOwnProperty.call(message, "msgSize"))
                writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.msgSize);
            if (message.localMeta != null && Object.hasOwnProperty.call(message, "localMeta"))
                $root.common.AnyValue.encode(message.localMeta, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            if (message.recipients != null && message.recipients.length)
                for (var i = 0; i < message.recipients.length; ++i)
                    $root.asmail.DeliveryProgressMsg.AddrAndDeliveryInfo.encode(message.recipients[i], writer.uint32(/* id 5, wireType 2 =*/42).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified DeliveryProgressMsg message, length delimited. Does not implicitly {@link asmail.DeliveryProgressMsg.verify|verify} messages.
         * @function encodeDelimited
         * @memberof asmail.DeliveryProgressMsg
         * @static
         * @param {asmail.IDeliveryProgressMsg} message DeliveryProgressMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DeliveryProgressMsg.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a DeliveryProgressMsg message from the specified reader or buffer.
         * @function decode
         * @memberof asmail.DeliveryProgressMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {asmail.DeliveryProgressMsg} DeliveryProgressMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DeliveryProgressMsg.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.DeliveryProgressMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.notConnected = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.allDone = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.msgSize = reader.uint64();
                        break;
                    }
                case 4: {
                        message.localMeta = $root.common.AnyValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 5: {
                        if (!(message.recipients && message.recipients.length))
                            message.recipients = [];
                        message.recipients.push($root.asmail.DeliveryProgressMsg.AddrAndDeliveryInfo.decode(reader, reader.uint32(), undefined, long + 1));
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a DeliveryProgressMsg message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof asmail.DeliveryProgressMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {asmail.DeliveryProgressMsg} DeliveryProgressMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DeliveryProgressMsg.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a DeliveryProgressMsg message.
         * @function verify
         * @memberof asmail.DeliveryProgressMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        DeliveryProgressMsg.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.notConnected != null && Object.hasOwnProperty.call(message, "notConnected")) {
                var error = $root.common.BooleanValue.verify(message.notConnected, long + 1);
                if (error)
                    return "notConnected." + error;
            }
            if (message.allDone != null && Object.hasOwnProperty.call(message, "allDone")) {
                var error = $root.common.StringValue.verify(message.allDone, long + 1);
                if (error)
                    return "allDone." + error;
            }
            if (message.msgSize != null && Object.hasOwnProperty.call(message, "msgSize"))
                if (!$util.isInteger(message.msgSize) && !(message.msgSize && $util.isInteger(message.msgSize.low) && $util.isInteger(message.msgSize.high)))
                    return "msgSize: integer|Long expected";
            if (message.localMeta != null && Object.hasOwnProperty.call(message, "localMeta")) {
                var error = $root.common.AnyValue.verify(message.localMeta, long + 1);
                if (error)
                    return "localMeta." + error;
            }
            if (message.recipients != null && Object.hasOwnProperty.call(message, "recipients")) {
                if (!Array.isArray(message.recipients))
                    return "recipients: array expected";
                for (var i = 0; i < message.recipients.length; ++i) {
                    var error = $root.asmail.DeliveryProgressMsg.AddrAndDeliveryInfo.verify(message.recipients[i], long + 1);
                    if (error)
                        return "recipients." + error;
                }
            }
            return null;
        };

        /**
         * Creates a DeliveryProgressMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof asmail.DeliveryProgressMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {asmail.DeliveryProgressMsg} DeliveryProgressMsg
         */
        DeliveryProgressMsg.fromObject = function fromObject(object, long) {
            if (object instanceof $root.asmail.DeliveryProgressMsg)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".asmail.DeliveryProgressMsg: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.asmail.DeliveryProgressMsg();
            if (object.notConnected != null) {
                if (!$util.isObject(object.notConnected))
                    throw TypeError(".asmail.DeliveryProgressMsg.notConnected: object expected");
                message.notConnected = $root.common.BooleanValue.fromObject(object.notConnected, long + 1);
            }
            if (object.allDone != null) {
                if (!$util.isObject(object.allDone))
                    throw TypeError(".asmail.DeliveryProgressMsg.allDone: object expected");
                message.allDone = $root.common.StringValue.fromObject(object.allDone, long + 1);
            }
            if (object.msgSize != null)
                if ($util.Long)
                    message.msgSize = $util.Long.fromValue(object.msgSize, true);
                else if (typeof object.msgSize === "string")
                    message.msgSize = parseInt(object.msgSize, 10);
                else if (typeof object.msgSize === "number")
                    message.msgSize = object.msgSize;
                else if (typeof object.msgSize === "object")
                    message.msgSize = new $util.LongBits(object.msgSize.low >>> 0, object.msgSize.high >>> 0).toNumber(true);
            if (object.localMeta != null) {
                if (!$util.isObject(object.localMeta))
                    throw TypeError(".asmail.DeliveryProgressMsg.localMeta: object expected");
                message.localMeta = $root.common.AnyValue.fromObject(object.localMeta, long + 1);
            }
            if (object.recipients) {
                if (!Array.isArray(object.recipients))
                    throw TypeError(".asmail.DeliveryProgressMsg.recipients: array expected");
                message.recipients = [];
                for (var i = 0; i < object.recipients.length; ++i) {
                    if (!$util.isObject(object.recipients[i]))
                        throw TypeError(".asmail.DeliveryProgressMsg.recipients: object expected");
                    message.recipients[i] = $root.asmail.DeliveryProgressMsg.AddrAndDeliveryInfo.fromObject(object.recipients[i], long + 1);
                }
            }
            return message;
        };

        /**
         * Creates a plain object from a DeliveryProgressMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof asmail.DeliveryProgressMsg
         * @static
         * @param {asmail.DeliveryProgressMsg} message DeliveryProgressMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        DeliveryProgressMsg.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.recipients = [];
            if (options.defaults) {
                object.notConnected = null;
                object.allDone = null;
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.msgSize = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.msgSize = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.localMeta = null;
            }
            if (message.notConnected != null && Object.hasOwnProperty.call(message, "notConnected"))
                object.notConnected = $root.common.BooleanValue.toObject(message.notConnected, options, q + 1);
            if (message.allDone != null && Object.hasOwnProperty.call(message, "allDone"))
                object.allDone = $root.common.StringValue.toObject(message.allDone, options, q + 1);
            if (message.msgSize != null && Object.hasOwnProperty.call(message, "msgSize"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.msgSize = typeof message.msgSize === "number" ? BigInt(message.msgSize) : $util.Long.fromBits(message.msgSize.low >>> 0, message.msgSize.high >>> 0, true).toBigInt();
                else if (typeof message.msgSize === "number")
                    object.msgSize = options.longs === String ? String(message.msgSize) : message.msgSize;
                else
                    object.msgSize = options.longs === String ? $util.Long.prototype.toString.call(message.msgSize) : options.longs === Number ? new $util.LongBits(message.msgSize.low >>> 0, message.msgSize.high >>> 0).toNumber(true) : message.msgSize;
            if (message.localMeta != null && Object.hasOwnProperty.call(message, "localMeta"))
                object.localMeta = $root.common.AnyValue.toObject(message.localMeta, options, q + 1);
            if (message.recipients && message.recipients.length) {
                object.recipients = [];
                for (var j = 0; j < message.recipients.length; ++j)
                    object.recipients[j] = $root.asmail.DeliveryProgressMsg.AddrAndDeliveryInfo.toObject(message.recipients[j], options, q + 1);
            }
            return object;
        };

        /**
         * Converts this DeliveryProgressMsg to JSON.
         * @function toJSON
         * @memberof asmail.DeliveryProgressMsg
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        DeliveryProgressMsg.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for DeliveryProgressMsg
         * @function getTypeUrl
         * @memberof asmail.DeliveryProgressMsg
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        DeliveryProgressMsg.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/asmail.DeliveryProgressMsg";
        };

        DeliveryProgressMsg.DeliveryInfo = (function() {

            /**
             * Properties of a DeliveryInfo.
             * @memberof asmail.DeliveryProgressMsg
             * @interface IDeliveryInfo
             * @property {boolean|null} [done] DeliveryInfo done
             * @property {common.IStringValue|null} [idOnDelivery] DeliveryInfo idOnDelivery
             * @property {number|Long|null} [bytesSent] DeliveryInfo bytesSent
             * @property {common.IErrorValue|null} [err] DeliveryInfo err
             */

            /**
             * Constructs a new DeliveryInfo.
             * @memberof asmail.DeliveryProgressMsg
             * @classdesc Represents a DeliveryInfo.
             * @implements IDeliveryInfo
             * @constructor
             * @param {asmail.DeliveryProgressMsg.IDeliveryInfo=} [properties] Properties to set
             */
            function DeliveryInfo(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * DeliveryInfo done.
             * @member {boolean} done
             * @memberof asmail.DeliveryProgressMsg.DeliveryInfo
             * @instance
             */
            DeliveryInfo.prototype.done = false;

            /**
             * DeliveryInfo idOnDelivery.
             * @member {common.IStringValue|null|undefined} idOnDelivery
             * @memberof asmail.DeliveryProgressMsg.DeliveryInfo
             * @instance
             */
            DeliveryInfo.prototype.idOnDelivery = null;

            /**
             * DeliveryInfo bytesSent.
             * @member {number|Long} bytesSent
             * @memberof asmail.DeliveryProgressMsg.DeliveryInfo
             * @instance
             */
            DeliveryInfo.prototype.bytesSent = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

            /**
             * DeliveryInfo err.
             * @member {common.IErrorValue|null|undefined} err
             * @memberof asmail.DeliveryProgressMsg.DeliveryInfo
             * @instance
             */
            DeliveryInfo.prototype.err = null;

            /**
             * Creates a new DeliveryInfo instance using the specified properties.
             * @function create
             * @memberof asmail.DeliveryProgressMsg.DeliveryInfo
             * @static
             * @param {asmail.DeliveryProgressMsg.IDeliveryInfo=} [properties] Properties to set
             * @returns {asmail.DeliveryProgressMsg.DeliveryInfo} DeliveryInfo instance
             */
            DeliveryInfo.create = function create(properties) {
                return new DeliveryInfo(properties);
            };

            /**
             * Encodes the specified DeliveryInfo message. Does not implicitly {@link asmail.DeliveryProgressMsg.DeliveryInfo.verify|verify} messages.
             * @function encode
             * @memberof asmail.DeliveryProgressMsg.DeliveryInfo
             * @static
             * @param {asmail.DeliveryProgressMsg.IDeliveryInfo} message DeliveryInfo message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            DeliveryInfo.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.done != null && Object.hasOwnProperty.call(message, "done"))
                    writer.uint32(/* id 1, wireType 0 =*/8).bool(message.done);
                if (message.idOnDelivery != null && Object.hasOwnProperty.call(message, "idOnDelivery"))
                    $root.common.StringValue.encode(message.idOnDelivery, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
                if (message.bytesSent != null && Object.hasOwnProperty.call(message, "bytesSent"))
                    writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.bytesSent);
                if (message.err != null && Object.hasOwnProperty.call(message, "err"))
                    $root.common.ErrorValue.encode(message.err, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
                return writer;
            };

            /**
             * Encodes the specified DeliveryInfo message, length delimited. Does not implicitly {@link asmail.DeliveryProgressMsg.DeliveryInfo.verify|verify} messages.
             * @function encodeDelimited
             * @memberof asmail.DeliveryProgressMsg.DeliveryInfo
             * @static
             * @param {asmail.DeliveryProgressMsg.IDeliveryInfo} message DeliveryInfo message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            DeliveryInfo.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes a DeliveryInfo message from the specified reader or buffer.
             * @function decode
             * @memberof asmail.DeliveryProgressMsg.DeliveryInfo
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {asmail.DeliveryProgressMsg.DeliveryInfo} DeliveryInfo
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            DeliveryInfo.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.DeliveryProgressMsg.DeliveryInfo();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.done = reader.bool();
                            break;
                        }
                    case 2: {
                            message.idOnDelivery = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 3: {
                            message.bytesSent = reader.uint64();
                            break;
                        }
                    case 4: {
                            message.err = $root.common.ErrorValue.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a DeliveryInfo message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof asmail.DeliveryProgressMsg.DeliveryInfo
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {asmail.DeliveryProgressMsg.DeliveryInfo} DeliveryInfo
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            DeliveryInfo.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a DeliveryInfo message.
             * @function verify
             * @memberof asmail.DeliveryProgressMsg.DeliveryInfo
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            DeliveryInfo.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.done != null && Object.hasOwnProperty.call(message, "done"))
                    if (typeof message.done !== "boolean")
                        return "done: boolean expected";
                if (message.idOnDelivery != null && Object.hasOwnProperty.call(message, "idOnDelivery")) {
                    var error = $root.common.StringValue.verify(message.idOnDelivery, long + 1);
                    if (error)
                        return "idOnDelivery." + error;
                }
                if (message.bytesSent != null && Object.hasOwnProperty.call(message, "bytesSent"))
                    if (!$util.isInteger(message.bytesSent) && !(message.bytesSent && $util.isInteger(message.bytesSent.low) && $util.isInteger(message.bytesSent.high)))
                        return "bytesSent: integer|Long expected";
                if (message.err != null && Object.hasOwnProperty.call(message, "err")) {
                    var error = $root.common.ErrorValue.verify(message.err, long + 1);
                    if (error)
                        return "err." + error;
                }
                return null;
            };

            /**
             * Creates a DeliveryInfo message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof asmail.DeliveryProgressMsg.DeliveryInfo
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {asmail.DeliveryProgressMsg.DeliveryInfo} DeliveryInfo
             */
            DeliveryInfo.fromObject = function fromObject(object, long) {
                if (object instanceof $root.asmail.DeliveryProgressMsg.DeliveryInfo)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".asmail.DeliveryProgressMsg.DeliveryInfo: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.asmail.DeliveryProgressMsg.DeliveryInfo();
                if (object.done != null)
                    message.done = Boolean(object.done);
                if (object.idOnDelivery != null) {
                    if (!$util.isObject(object.idOnDelivery))
                        throw TypeError(".asmail.DeliveryProgressMsg.DeliveryInfo.idOnDelivery: object expected");
                    message.idOnDelivery = $root.common.StringValue.fromObject(object.idOnDelivery, long + 1);
                }
                if (object.bytesSent != null)
                    if ($util.Long)
                        message.bytesSent = $util.Long.fromValue(object.bytesSent, true);
                    else if (typeof object.bytesSent === "string")
                        message.bytesSent = parseInt(object.bytesSent, 10);
                    else if (typeof object.bytesSent === "number")
                        message.bytesSent = object.bytesSent;
                    else if (typeof object.bytesSent === "object")
                        message.bytesSent = new $util.LongBits(object.bytesSent.low >>> 0, object.bytesSent.high >>> 0).toNumber(true);
                if (object.err != null) {
                    if (!$util.isObject(object.err))
                        throw TypeError(".asmail.DeliveryProgressMsg.DeliveryInfo.err: object expected");
                    message.err = $root.common.ErrorValue.fromObject(object.err, long + 1);
                }
                return message;
            };

            /**
             * Creates a plain object from a DeliveryInfo message. Also converts values to other types if specified.
             * @function toObject
             * @memberof asmail.DeliveryProgressMsg.DeliveryInfo
             * @static
             * @param {asmail.DeliveryProgressMsg.DeliveryInfo} message DeliveryInfo
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            DeliveryInfo.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults) {
                    object.done = false;
                    object.idOnDelivery = null;
                    if ($util.Long) {
                        var long = new $util.Long(0, 0, true);
                        object.bytesSent = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                    } else
                        object.bytesSent = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                    object.err = null;
                }
                if (message.done != null && Object.hasOwnProperty.call(message, "done"))
                    object.done = message.done;
                if (message.idOnDelivery != null && Object.hasOwnProperty.call(message, "idOnDelivery"))
                    object.idOnDelivery = $root.common.StringValue.toObject(message.idOnDelivery, options, q + 1);
                if (message.bytesSent != null && Object.hasOwnProperty.call(message, "bytesSent"))
                    if (typeof BigInt !== "undefined" && options.longs === BigInt)
                        object.bytesSent = typeof message.bytesSent === "number" ? BigInt(message.bytesSent) : $util.Long.fromBits(message.bytesSent.low >>> 0, message.bytesSent.high >>> 0, true).toBigInt();
                    else if (typeof message.bytesSent === "number")
                        object.bytesSent = options.longs === String ? String(message.bytesSent) : message.bytesSent;
                    else
                        object.bytesSent = options.longs === String ? $util.Long.prototype.toString.call(message.bytesSent) : options.longs === Number ? new $util.LongBits(message.bytesSent.low >>> 0, message.bytesSent.high >>> 0).toNumber(true) : message.bytesSent;
                if (message.err != null && Object.hasOwnProperty.call(message, "err"))
                    object.err = $root.common.ErrorValue.toObject(message.err, options, q + 1);
                return object;
            };

            /**
             * Converts this DeliveryInfo to JSON.
             * @function toJSON
             * @memberof asmail.DeliveryProgressMsg.DeliveryInfo
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            DeliveryInfo.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for DeliveryInfo
             * @function getTypeUrl
             * @memberof asmail.DeliveryProgressMsg.DeliveryInfo
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            DeliveryInfo.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/asmail.DeliveryProgressMsg.DeliveryInfo";
            };

            return DeliveryInfo;
        })();

        DeliveryProgressMsg.AddrAndDeliveryInfo = (function() {

            /**
             * Properties of an AddrAndDeliveryInfo.
             * @memberof asmail.DeliveryProgressMsg
             * @interface IAddrAndDeliveryInfo
             * @property {string|null} [address] AddrAndDeliveryInfo address
             * @property {asmail.DeliveryProgressMsg.IDeliveryInfo|null} [info] AddrAndDeliveryInfo info
             */

            /**
             * Constructs a new AddrAndDeliveryInfo.
             * @memberof asmail.DeliveryProgressMsg
             * @classdesc Represents an AddrAndDeliveryInfo.
             * @implements IAddrAndDeliveryInfo
             * @constructor
             * @param {asmail.DeliveryProgressMsg.IAddrAndDeliveryInfo=} [properties] Properties to set
             */
            function AddrAndDeliveryInfo(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * AddrAndDeliveryInfo address.
             * @member {string} address
             * @memberof asmail.DeliveryProgressMsg.AddrAndDeliveryInfo
             * @instance
             */
            AddrAndDeliveryInfo.prototype.address = "";

            /**
             * AddrAndDeliveryInfo info.
             * @member {asmail.DeliveryProgressMsg.IDeliveryInfo|null|undefined} info
             * @memberof asmail.DeliveryProgressMsg.AddrAndDeliveryInfo
             * @instance
             */
            AddrAndDeliveryInfo.prototype.info = null;

            /**
             * Creates a new AddrAndDeliveryInfo instance using the specified properties.
             * @function create
             * @memberof asmail.DeliveryProgressMsg.AddrAndDeliveryInfo
             * @static
             * @param {asmail.DeliveryProgressMsg.IAddrAndDeliveryInfo=} [properties] Properties to set
             * @returns {asmail.DeliveryProgressMsg.AddrAndDeliveryInfo} AddrAndDeliveryInfo instance
             */
            AddrAndDeliveryInfo.create = function create(properties) {
                return new AddrAndDeliveryInfo(properties);
            };

            /**
             * Encodes the specified AddrAndDeliveryInfo message. Does not implicitly {@link asmail.DeliveryProgressMsg.AddrAndDeliveryInfo.verify|verify} messages.
             * @function encode
             * @memberof asmail.DeliveryProgressMsg.AddrAndDeliveryInfo
             * @static
             * @param {asmail.DeliveryProgressMsg.IAddrAndDeliveryInfo} message AddrAndDeliveryInfo message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            AddrAndDeliveryInfo.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.address != null && Object.hasOwnProperty.call(message, "address"))
                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.address);
                if (message.info != null && Object.hasOwnProperty.call(message, "info"))
                    $root.asmail.DeliveryProgressMsg.DeliveryInfo.encode(message.info, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
                return writer;
            };

            /**
             * Encodes the specified AddrAndDeliveryInfo message, length delimited. Does not implicitly {@link asmail.DeliveryProgressMsg.AddrAndDeliveryInfo.verify|verify} messages.
             * @function encodeDelimited
             * @memberof asmail.DeliveryProgressMsg.AddrAndDeliveryInfo
             * @static
             * @param {asmail.DeliveryProgressMsg.IAddrAndDeliveryInfo} message AddrAndDeliveryInfo message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            AddrAndDeliveryInfo.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes an AddrAndDeliveryInfo message from the specified reader or buffer.
             * @function decode
             * @memberof asmail.DeliveryProgressMsg.AddrAndDeliveryInfo
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {asmail.DeliveryProgressMsg.AddrAndDeliveryInfo} AddrAndDeliveryInfo
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            AddrAndDeliveryInfo.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.DeliveryProgressMsg.AddrAndDeliveryInfo();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.address = reader.string();
                            break;
                        }
                    case 2: {
                            message.info = $root.asmail.DeliveryProgressMsg.DeliveryInfo.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes an AddrAndDeliveryInfo message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof asmail.DeliveryProgressMsg.AddrAndDeliveryInfo
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {asmail.DeliveryProgressMsg.AddrAndDeliveryInfo} AddrAndDeliveryInfo
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            AddrAndDeliveryInfo.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies an AddrAndDeliveryInfo message.
             * @function verify
             * @memberof asmail.DeliveryProgressMsg.AddrAndDeliveryInfo
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            AddrAndDeliveryInfo.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.address != null && Object.hasOwnProperty.call(message, "address"))
                    if (!$util.isString(message.address))
                        return "address: string expected";
                if (message.info != null && Object.hasOwnProperty.call(message, "info")) {
                    var error = $root.asmail.DeliveryProgressMsg.DeliveryInfo.verify(message.info, long + 1);
                    if (error)
                        return "info." + error;
                }
                return null;
            };

            /**
             * Creates an AddrAndDeliveryInfo message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof asmail.DeliveryProgressMsg.AddrAndDeliveryInfo
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {asmail.DeliveryProgressMsg.AddrAndDeliveryInfo} AddrAndDeliveryInfo
             */
            AddrAndDeliveryInfo.fromObject = function fromObject(object, long) {
                if (object instanceof $root.asmail.DeliveryProgressMsg.AddrAndDeliveryInfo)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".asmail.DeliveryProgressMsg.AddrAndDeliveryInfo: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.asmail.DeliveryProgressMsg.AddrAndDeliveryInfo();
                if (object.address != null)
                    message.address = String(object.address);
                if (object.info != null) {
                    if (!$util.isObject(object.info))
                        throw TypeError(".asmail.DeliveryProgressMsg.AddrAndDeliveryInfo.info: object expected");
                    message.info = $root.asmail.DeliveryProgressMsg.DeliveryInfo.fromObject(object.info, long + 1);
                }
                return message;
            };

            /**
             * Creates a plain object from an AddrAndDeliveryInfo message. Also converts values to other types if specified.
             * @function toObject
             * @memberof asmail.DeliveryProgressMsg.AddrAndDeliveryInfo
             * @static
             * @param {asmail.DeliveryProgressMsg.AddrAndDeliveryInfo} message AddrAndDeliveryInfo
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            AddrAndDeliveryInfo.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults) {
                    object.address = "";
                    object.info = null;
                }
                if (message.address != null && Object.hasOwnProperty.call(message, "address"))
                    object.address = message.address;
                if (message.info != null && Object.hasOwnProperty.call(message, "info"))
                    object.info = $root.asmail.DeliveryProgressMsg.DeliveryInfo.toObject(message.info, options, q + 1);
                return object;
            };

            /**
             * Converts this AddrAndDeliveryInfo to JSON.
             * @function toJSON
             * @memberof asmail.DeliveryProgressMsg.AddrAndDeliveryInfo
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            AddrAndDeliveryInfo.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for AddrAndDeliveryInfo
             * @function getTypeUrl
             * @memberof asmail.DeliveryProgressMsg.AddrAndDeliveryInfo
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            AddrAndDeliveryInfo.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/asmail.DeliveryProgressMsg.AddrAndDeliveryInfo";
            };

            return AddrAndDeliveryInfo;
        })();

        return DeliveryProgressMsg;
    })();

    asmail.CurrentStateRequestBody = (function() {

        /**
         * Properties of a CurrentStateRequestBody.
         * @memberof asmail
         * @interface ICurrentStateRequestBody
         * @property {string|null} [id] CurrentStateRequestBody id
         */

        /**
         * Constructs a new CurrentStateRequestBody.
         * @memberof asmail
         * @classdesc Represents a CurrentStateRequestBody.
         * @implements ICurrentStateRequestBody
         * @constructor
         * @param {asmail.ICurrentStateRequestBody=} [properties] Properties to set
         */
        function CurrentStateRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * CurrentStateRequestBody id.
         * @member {string} id
         * @memberof asmail.CurrentStateRequestBody
         * @instance
         */
        CurrentStateRequestBody.prototype.id = "";

        /**
         * Creates a new CurrentStateRequestBody instance using the specified properties.
         * @function create
         * @memberof asmail.CurrentStateRequestBody
         * @static
         * @param {asmail.ICurrentStateRequestBody=} [properties] Properties to set
         * @returns {asmail.CurrentStateRequestBody} CurrentStateRequestBody instance
         */
        CurrentStateRequestBody.create = function create(properties) {
            return new CurrentStateRequestBody(properties);
        };

        /**
         * Encodes the specified CurrentStateRequestBody message. Does not implicitly {@link asmail.CurrentStateRequestBody.verify|verify} messages.
         * @function encode
         * @memberof asmail.CurrentStateRequestBody
         * @static
         * @param {asmail.ICurrentStateRequestBody} message CurrentStateRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CurrentStateRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.id != null && Object.hasOwnProperty.call(message, "id"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.id);
            return writer;
        };

        /**
         * Encodes the specified CurrentStateRequestBody message, length delimited. Does not implicitly {@link asmail.CurrentStateRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof asmail.CurrentStateRequestBody
         * @static
         * @param {asmail.ICurrentStateRequestBody} message CurrentStateRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CurrentStateRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a CurrentStateRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof asmail.CurrentStateRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {asmail.CurrentStateRequestBody} CurrentStateRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CurrentStateRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.CurrentStateRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.id = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a CurrentStateRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof asmail.CurrentStateRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {asmail.CurrentStateRequestBody} CurrentStateRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CurrentStateRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a CurrentStateRequestBody message.
         * @function verify
         * @memberof asmail.CurrentStateRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        CurrentStateRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.id != null && Object.hasOwnProperty.call(message, "id"))
                if (!$util.isString(message.id))
                    return "id: string expected";
            return null;
        };

        /**
         * Creates a CurrentStateRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof asmail.CurrentStateRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {asmail.CurrentStateRequestBody} CurrentStateRequestBody
         */
        CurrentStateRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.asmail.CurrentStateRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".asmail.CurrentStateRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.asmail.CurrentStateRequestBody();
            if (object.id != null)
                message.id = String(object.id);
            return message;
        };

        /**
         * Creates a plain object from a CurrentStateRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof asmail.CurrentStateRequestBody
         * @static
         * @param {asmail.CurrentStateRequestBody} message CurrentStateRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        CurrentStateRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.id = "";
            if (message.id != null && Object.hasOwnProperty.call(message, "id"))
                object.id = message.id;
            return object;
        };

        /**
         * Converts this CurrentStateRequestBody to JSON.
         * @function toJSON
         * @memberof asmail.CurrentStateRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        CurrentStateRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for CurrentStateRequestBody
         * @function getTypeUrl
         * @memberof asmail.CurrentStateRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        CurrentStateRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/asmail.CurrentStateRequestBody";
        };

        return CurrentStateRequestBody;
    })();

    asmail.ObserveDeliveryRequestBody = (function() {

        /**
         * Properties of an ObserveDeliveryRequestBody.
         * @memberof asmail
         * @interface IObserveDeliveryRequestBody
         * @property {string|null} [id] ObserveDeliveryRequestBody id
         */

        /**
         * Constructs a new ObserveDeliveryRequestBody.
         * @memberof asmail
         * @classdesc Represents an ObserveDeliveryRequestBody.
         * @implements IObserveDeliveryRequestBody
         * @constructor
         * @param {asmail.IObserveDeliveryRequestBody=} [properties] Properties to set
         */
        function ObserveDeliveryRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ObserveDeliveryRequestBody id.
         * @member {string} id
         * @memberof asmail.ObserveDeliveryRequestBody
         * @instance
         */
        ObserveDeliveryRequestBody.prototype.id = "";

        /**
         * Creates a new ObserveDeliveryRequestBody instance using the specified properties.
         * @function create
         * @memberof asmail.ObserveDeliveryRequestBody
         * @static
         * @param {asmail.IObserveDeliveryRequestBody=} [properties] Properties to set
         * @returns {asmail.ObserveDeliveryRequestBody} ObserveDeliveryRequestBody instance
         */
        ObserveDeliveryRequestBody.create = function create(properties) {
            return new ObserveDeliveryRequestBody(properties);
        };

        /**
         * Encodes the specified ObserveDeliveryRequestBody message. Does not implicitly {@link asmail.ObserveDeliveryRequestBody.verify|verify} messages.
         * @function encode
         * @memberof asmail.ObserveDeliveryRequestBody
         * @static
         * @param {asmail.IObserveDeliveryRequestBody} message ObserveDeliveryRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ObserveDeliveryRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.id != null && Object.hasOwnProperty.call(message, "id"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.id);
            return writer;
        };

        /**
         * Encodes the specified ObserveDeliveryRequestBody message, length delimited. Does not implicitly {@link asmail.ObserveDeliveryRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof asmail.ObserveDeliveryRequestBody
         * @static
         * @param {asmail.IObserveDeliveryRequestBody} message ObserveDeliveryRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ObserveDeliveryRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an ObserveDeliveryRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof asmail.ObserveDeliveryRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {asmail.ObserveDeliveryRequestBody} ObserveDeliveryRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ObserveDeliveryRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.ObserveDeliveryRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.id = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an ObserveDeliveryRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof asmail.ObserveDeliveryRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {asmail.ObserveDeliveryRequestBody} ObserveDeliveryRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ObserveDeliveryRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an ObserveDeliveryRequestBody message.
         * @function verify
         * @memberof asmail.ObserveDeliveryRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ObserveDeliveryRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.id != null && Object.hasOwnProperty.call(message, "id"))
                if (!$util.isString(message.id))
                    return "id: string expected";
            return null;
        };

        /**
         * Creates an ObserveDeliveryRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof asmail.ObserveDeliveryRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {asmail.ObserveDeliveryRequestBody} ObserveDeliveryRequestBody
         */
        ObserveDeliveryRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.asmail.ObserveDeliveryRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".asmail.ObserveDeliveryRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.asmail.ObserveDeliveryRequestBody();
            if (object.id != null)
                message.id = String(object.id);
            return message;
        };

        /**
         * Creates a plain object from an ObserveDeliveryRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof asmail.ObserveDeliveryRequestBody
         * @static
         * @param {asmail.ObserveDeliveryRequestBody} message ObserveDeliveryRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ObserveDeliveryRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.id = "";
            if (message.id != null && Object.hasOwnProperty.call(message, "id"))
                object.id = message.id;
            return object;
        };

        /**
         * Converts this ObserveDeliveryRequestBody to JSON.
         * @function toJSON
         * @memberof asmail.ObserveDeliveryRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ObserveDeliveryRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ObserveDeliveryRequestBody
         * @function getTypeUrl
         * @memberof asmail.ObserveDeliveryRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ObserveDeliveryRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/asmail.ObserveDeliveryRequestBody";
        };

        return ObserveDeliveryRequestBody;
    })();

    asmail.RmMsgRequestBody = (function() {

        /**
         * Properties of a RmMsgRequestBody.
         * @memberof asmail
         * @interface IRmMsgRequestBody
         * @property {string|null} [id] RmMsgRequestBody id
         * @property {common.IBooleanValue|null} [cancelSending] RmMsgRequestBody cancelSending
         */

        /**
         * Constructs a new RmMsgRequestBody.
         * @memberof asmail
         * @classdesc Represents a RmMsgRequestBody.
         * @implements IRmMsgRequestBody
         * @constructor
         * @param {asmail.IRmMsgRequestBody=} [properties] Properties to set
         */
        function RmMsgRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * RmMsgRequestBody id.
         * @member {string} id
         * @memberof asmail.RmMsgRequestBody
         * @instance
         */
        RmMsgRequestBody.prototype.id = "";

        /**
         * RmMsgRequestBody cancelSending.
         * @member {common.IBooleanValue|null|undefined} cancelSending
         * @memberof asmail.RmMsgRequestBody
         * @instance
         */
        RmMsgRequestBody.prototype.cancelSending = null;

        /**
         * Creates a new RmMsgRequestBody instance using the specified properties.
         * @function create
         * @memberof asmail.RmMsgRequestBody
         * @static
         * @param {asmail.IRmMsgRequestBody=} [properties] Properties to set
         * @returns {asmail.RmMsgRequestBody} RmMsgRequestBody instance
         */
        RmMsgRequestBody.create = function create(properties) {
            return new RmMsgRequestBody(properties);
        };

        /**
         * Encodes the specified RmMsgRequestBody message. Does not implicitly {@link asmail.RmMsgRequestBody.verify|verify} messages.
         * @function encode
         * @memberof asmail.RmMsgRequestBody
         * @static
         * @param {asmail.IRmMsgRequestBody} message RmMsgRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        RmMsgRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.id != null && Object.hasOwnProperty.call(message, "id"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.id);
            if (message.cancelSending != null && Object.hasOwnProperty.call(message, "cancelSending"))
                $root.common.BooleanValue.encode(message.cancelSending, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified RmMsgRequestBody message, length delimited. Does not implicitly {@link asmail.RmMsgRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof asmail.RmMsgRequestBody
         * @static
         * @param {asmail.IRmMsgRequestBody} message RmMsgRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        RmMsgRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a RmMsgRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof asmail.RmMsgRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {asmail.RmMsgRequestBody} RmMsgRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        RmMsgRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.RmMsgRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.id = reader.string();
                        break;
                    }
                case 2: {
                        message.cancelSending = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a RmMsgRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof asmail.RmMsgRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {asmail.RmMsgRequestBody} RmMsgRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        RmMsgRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a RmMsgRequestBody message.
         * @function verify
         * @memberof asmail.RmMsgRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        RmMsgRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.id != null && Object.hasOwnProperty.call(message, "id"))
                if (!$util.isString(message.id))
                    return "id: string expected";
            if (message.cancelSending != null && Object.hasOwnProperty.call(message, "cancelSending")) {
                var error = $root.common.BooleanValue.verify(message.cancelSending, long + 1);
                if (error)
                    return "cancelSending." + error;
            }
            return null;
        };

        /**
         * Creates a RmMsgRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof asmail.RmMsgRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {asmail.RmMsgRequestBody} RmMsgRequestBody
         */
        RmMsgRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.asmail.RmMsgRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".asmail.RmMsgRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.asmail.RmMsgRequestBody();
            if (object.id != null)
                message.id = String(object.id);
            if (object.cancelSending != null) {
                if (!$util.isObject(object.cancelSending))
                    throw TypeError(".asmail.RmMsgRequestBody.cancelSending: object expected");
                message.cancelSending = $root.common.BooleanValue.fromObject(object.cancelSending, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a RmMsgRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof asmail.RmMsgRequestBody
         * @static
         * @param {asmail.RmMsgRequestBody} message RmMsgRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        RmMsgRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.id = "";
                object.cancelSending = null;
            }
            if (message.id != null && Object.hasOwnProperty.call(message, "id"))
                object.id = message.id;
            if (message.cancelSending != null && Object.hasOwnProperty.call(message, "cancelSending"))
                object.cancelSending = $root.common.BooleanValue.toObject(message.cancelSending, options, q + 1);
            return object;
        };

        /**
         * Converts this RmMsgRequestBody to JSON.
         * @function toJSON
         * @memberof asmail.RmMsgRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        RmMsgRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for RmMsgRequestBody
         * @function getTypeUrl
         * @memberof asmail.RmMsgRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        RmMsgRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/asmail.RmMsgRequestBody";
        };

        return RmMsgRequestBody;
    })();

    asmail.DeliveryNotificationWithId = (function() {

        /**
         * Properties of a DeliveryNotificationWithId.
         * @memberof asmail
         * @interface IDeliveryNotificationWithId
         * @property {string|null} [id] DeliveryNotificationWithId id
         * @property {asmail.IDeliveryProgressMsg|null} [progress] DeliveryNotificationWithId progress
         */

        /**
         * Constructs a new DeliveryNotificationWithId.
         * @memberof asmail
         * @classdesc Represents a DeliveryNotificationWithId.
         * @implements IDeliveryNotificationWithId
         * @constructor
         * @param {asmail.IDeliveryNotificationWithId=} [properties] Properties to set
         */
        function DeliveryNotificationWithId(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * DeliveryNotificationWithId id.
         * @member {string} id
         * @memberof asmail.DeliveryNotificationWithId
         * @instance
         */
        DeliveryNotificationWithId.prototype.id = "";

        /**
         * DeliveryNotificationWithId progress.
         * @member {asmail.IDeliveryProgressMsg|null|undefined} progress
         * @memberof asmail.DeliveryNotificationWithId
         * @instance
         */
        DeliveryNotificationWithId.prototype.progress = null;

        /**
         * Creates a new DeliveryNotificationWithId instance using the specified properties.
         * @function create
         * @memberof asmail.DeliveryNotificationWithId
         * @static
         * @param {asmail.IDeliveryNotificationWithId=} [properties] Properties to set
         * @returns {asmail.DeliveryNotificationWithId} DeliveryNotificationWithId instance
         */
        DeliveryNotificationWithId.create = function create(properties) {
            return new DeliveryNotificationWithId(properties);
        };

        /**
         * Encodes the specified DeliveryNotificationWithId message. Does not implicitly {@link asmail.DeliveryNotificationWithId.verify|verify} messages.
         * @function encode
         * @memberof asmail.DeliveryNotificationWithId
         * @static
         * @param {asmail.IDeliveryNotificationWithId} message DeliveryNotificationWithId message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DeliveryNotificationWithId.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.id != null && Object.hasOwnProperty.call(message, "id"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.id);
            if (message.progress != null && Object.hasOwnProperty.call(message, "progress"))
                $root.asmail.DeliveryProgressMsg.encode(message.progress, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified DeliveryNotificationWithId message, length delimited. Does not implicitly {@link asmail.DeliveryNotificationWithId.verify|verify} messages.
         * @function encodeDelimited
         * @memberof asmail.DeliveryNotificationWithId
         * @static
         * @param {asmail.IDeliveryNotificationWithId} message DeliveryNotificationWithId message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DeliveryNotificationWithId.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a DeliveryNotificationWithId message from the specified reader or buffer.
         * @function decode
         * @memberof asmail.DeliveryNotificationWithId
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {asmail.DeliveryNotificationWithId} DeliveryNotificationWithId
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DeliveryNotificationWithId.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.asmail.DeliveryNotificationWithId();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.id = reader.string();
                        break;
                    }
                case 2: {
                        message.progress = $root.asmail.DeliveryProgressMsg.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a DeliveryNotificationWithId message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof asmail.DeliveryNotificationWithId
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {asmail.DeliveryNotificationWithId} DeliveryNotificationWithId
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DeliveryNotificationWithId.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a DeliveryNotificationWithId message.
         * @function verify
         * @memberof asmail.DeliveryNotificationWithId
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        DeliveryNotificationWithId.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.id != null && Object.hasOwnProperty.call(message, "id"))
                if (!$util.isString(message.id))
                    return "id: string expected";
            if (message.progress != null && Object.hasOwnProperty.call(message, "progress")) {
                var error = $root.asmail.DeliveryProgressMsg.verify(message.progress, long + 1);
                if (error)
                    return "progress." + error;
            }
            return null;
        };

        /**
         * Creates a DeliveryNotificationWithId message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof asmail.DeliveryNotificationWithId
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {asmail.DeliveryNotificationWithId} DeliveryNotificationWithId
         */
        DeliveryNotificationWithId.fromObject = function fromObject(object, long) {
            if (object instanceof $root.asmail.DeliveryNotificationWithId)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".asmail.DeliveryNotificationWithId: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.asmail.DeliveryNotificationWithId();
            if (object.id != null)
                message.id = String(object.id);
            if (object.progress != null) {
                if (!$util.isObject(object.progress))
                    throw TypeError(".asmail.DeliveryNotificationWithId.progress: object expected");
                message.progress = $root.asmail.DeliveryProgressMsg.fromObject(object.progress, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a DeliveryNotificationWithId message. Also converts values to other types if specified.
         * @function toObject
         * @memberof asmail.DeliveryNotificationWithId
         * @static
         * @param {asmail.DeliveryNotificationWithId} message DeliveryNotificationWithId
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        DeliveryNotificationWithId.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.id = "";
                object.progress = null;
            }
            if (message.id != null && Object.hasOwnProperty.call(message, "id"))
                object.id = message.id;
            if (message.progress != null && Object.hasOwnProperty.call(message, "progress"))
                object.progress = $root.asmail.DeliveryProgressMsg.toObject(message.progress, options, q + 1);
            return object;
        };

        /**
         * Converts this DeliveryNotificationWithId to JSON.
         * @function toJSON
         * @memberof asmail.DeliveryNotificationWithId
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        DeliveryNotificationWithId.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for DeliveryNotificationWithId
         * @function getTypeUrl
         * @memberof asmail.DeliveryNotificationWithId
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        DeliveryNotificationWithId.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/asmail.DeliveryNotificationWithId";
        };

        return DeliveryNotificationWithId;
    })();

    return asmail;
})();

$root.common = (function() {

    /**
     * Namespace common.
     * @exports common
     * @namespace
     */
    var common = {};

    common.ObjectReference = (function() {

        /**
         * Properties of an ObjectReference.
         * @memberof common
         * @interface IObjectReference
         * @property {string|null} [objType] ObjectReference objType
         * @property {Array.<string>|null} [path] ObjectReference path
         */

        /**
         * Constructs a new ObjectReference.
         * @memberof common
         * @classdesc Represents an ObjectReference.
         * @implements IObjectReference
         * @constructor
         * @param {common.IObjectReference=} [properties] Properties to set
         */
        function ObjectReference(properties) {
            this.path = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ObjectReference objType.
         * @member {string} objType
         * @memberof common.ObjectReference
         * @instance
         */
        ObjectReference.prototype.objType = "";

        /**
         * ObjectReference path.
         * @member {Array.<string>} path
         * @memberof common.ObjectReference
         * @instance
         */
        ObjectReference.prototype.path = $util.emptyArray;

        /**
         * Creates a new ObjectReference instance using the specified properties.
         * @function create
         * @memberof common.ObjectReference
         * @static
         * @param {common.IObjectReference=} [properties] Properties to set
         * @returns {common.ObjectReference} ObjectReference instance
         */
        ObjectReference.create = function create(properties) {
            return new ObjectReference(properties);
        };

        /**
         * Encodes the specified ObjectReference message. Does not implicitly {@link common.ObjectReference.verify|verify} messages.
         * @function encode
         * @memberof common.ObjectReference
         * @static
         * @param {common.IObjectReference} message ObjectReference message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ObjectReference.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.objType != null && Object.hasOwnProperty.call(message, "objType"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.objType);
            if (message.path != null && message.path.length)
                for (var i = 0; i < message.path.length; ++i)
                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.path[i]);
            return writer;
        };

        /**
         * Encodes the specified ObjectReference message, length delimited. Does not implicitly {@link common.ObjectReference.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.ObjectReference
         * @static
         * @param {common.IObjectReference} message ObjectReference message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ObjectReference.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an ObjectReference message from the specified reader or buffer.
         * @function decode
         * @memberof common.ObjectReference
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.ObjectReference} ObjectReference
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ObjectReference.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ObjectReference();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.objType = reader.string();
                        break;
                    }
                case 2: {
                        if (!(message.path && message.path.length))
                            message.path = [];
                        message.path.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an ObjectReference message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.ObjectReference
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.ObjectReference} ObjectReference
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ObjectReference.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an ObjectReference message.
         * @function verify
         * @memberof common.ObjectReference
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ObjectReference.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.objType != null && Object.hasOwnProperty.call(message, "objType"))
                if (!$util.isString(message.objType))
                    return "objType: string expected";
            if (message.path != null && Object.hasOwnProperty.call(message, "path")) {
                if (!Array.isArray(message.path))
                    return "path: array expected";
                for (var i = 0; i < message.path.length; ++i)
                    if (!$util.isString(message.path[i]))
                        return "path: string[] expected";
            }
            return null;
        };

        /**
         * Creates an ObjectReference message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.ObjectReference
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.ObjectReference} ObjectReference
         */
        ObjectReference.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.ObjectReference)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.ObjectReference: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.ObjectReference();
            if (object.objType != null)
                message.objType = String(object.objType);
            if (object.path) {
                if (!Array.isArray(object.path))
                    throw TypeError(".common.ObjectReference.path: array expected");
                message.path = [];
                for (var i = 0; i < object.path.length; ++i)
                    message.path[i] = String(object.path[i]);
            }
            return message;
        };

        /**
         * Creates a plain object from an ObjectReference message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.ObjectReference
         * @static
         * @param {common.ObjectReference} message ObjectReference
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ObjectReference.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.path = [];
            if (options.defaults)
                object.objType = "";
            if (message.objType != null && Object.hasOwnProperty.call(message, "objType"))
                object.objType = message.objType;
            if (message.path && message.path.length) {
                object.path = [];
                for (var j = 0; j < message.path.length; ++j)
                    object.path[j] = message.path[j];
            }
            return object;
        };

        /**
         * Converts this ObjectReference to JSON.
         * @function toJSON
         * @memberof common.ObjectReference
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ObjectReference.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ObjectReference
         * @function getTypeUrl
         * @memberof common.ObjectReference
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ObjectReference.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.ObjectReference";
        };

        return ObjectReference;
    })();

    common.BooleanValue = (function() {

        /**
         * Properties of a BooleanValue.
         * @memberof common
         * @interface IBooleanValue
         * @property {boolean|null} [value] BooleanValue value
         */

        /**
         * Constructs a new BooleanValue.
         * @memberof common
         * @classdesc Represents a BooleanValue.
         * @implements IBooleanValue
         * @constructor
         * @param {common.IBooleanValue=} [properties] Properties to set
         */
        function BooleanValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * BooleanValue value.
         * @member {boolean} value
         * @memberof common.BooleanValue
         * @instance
         */
        BooleanValue.prototype.value = false;

        /**
         * Creates a new BooleanValue instance using the specified properties.
         * @function create
         * @memberof common.BooleanValue
         * @static
         * @param {common.IBooleanValue=} [properties] Properties to set
         * @returns {common.BooleanValue} BooleanValue instance
         */
        BooleanValue.create = function create(properties) {
            return new BooleanValue(properties);
        };

        /**
         * Encodes the specified BooleanValue message. Does not implicitly {@link common.BooleanValue.verify|verify} messages.
         * @function encode
         * @memberof common.BooleanValue
         * @static
         * @param {common.IBooleanValue} message BooleanValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BooleanValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 0 =*/8).bool(message.value);
            return writer;
        };

        /**
         * Encodes the specified BooleanValue message, length delimited. Does not implicitly {@link common.BooleanValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.BooleanValue
         * @static
         * @param {common.IBooleanValue} message BooleanValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BooleanValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a BooleanValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.BooleanValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.BooleanValue} BooleanValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BooleanValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BooleanValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.bool();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a BooleanValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.BooleanValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.BooleanValue} BooleanValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BooleanValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a BooleanValue message.
         * @function verify
         * @memberof common.BooleanValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        BooleanValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (typeof message.value !== "boolean")
                    return "value: boolean expected";
            return null;
        };

        /**
         * Creates a BooleanValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.BooleanValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.BooleanValue} BooleanValue
         */
        BooleanValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.BooleanValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.BooleanValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.BooleanValue();
            if (object.value != null)
                message.value = Boolean(object.value);
            return message;
        };

        /**
         * Creates a plain object from a BooleanValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.BooleanValue
         * @static
         * @param {common.BooleanValue} message BooleanValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        BooleanValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.value = false;
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = message.value;
            return object;
        };

        /**
         * Converts this BooleanValue to JSON.
         * @function toJSON
         * @memberof common.BooleanValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        BooleanValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for BooleanValue
         * @function getTypeUrl
         * @memberof common.BooleanValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        BooleanValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.BooleanValue";
        };

        return BooleanValue;
    })();

    common.StringArrayValue = (function() {

        /**
         * Properties of a StringArrayValue.
         * @memberof common
         * @interface IStringArrayValue
         * @property {Array.<string>|null} [values] StringArrayValue values
         */

        /**
         * Constructs a new StringArrayValue.
         * @memberof common
         * @classdesc Represents a StringArrayValue.
         * @implements IStringArrayValue
         * @constructor
         * @param {common.IStringArrayValue=} [properties] Properties to set
         */
        function StringArrayValue(properties) {
            this.values = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * StringArrayValue values.
         * @member {Array.<string>} values
         * @memberof common.StringArrayValue
         * @instance
         */
        StringArrayValue.prototype.values = $util.emptyArray;

        /**
         * Creates a new StringArrayValue instance using the specified properties.
         * @function create
         * @memberof common.StringArrayValue
         * @static
         * @param {common.IStringArrayValue=} [properties] Properties to set
         * @returns {common.StringArrayValue} StringArrayValue instance
         */
        StringArrayValue.create = function create(properties) {
            return new StringArrayValue(properties);
        };

        /**
         * Encodes the specified StringArrayValue message. Does not implicitly {@link common.StringArrayValue.verify|verify} messages.
         * @function encode
         * @memberof common.StringArrayValue
         * @static
         * @param {common.IStringArrayValue} message StringArrayValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringArrayValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.values != null && message.values.length)
                for (var i = 0; i < message.values.length; ++i)
                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.values[i]);
            return writer;
        };

        /**
         * Encodes the specified StringArrayValue message, length delimited. Does not implicitly {@link common.StringArrayValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.StringArrayValue
         * @static
         * @param {common.IStringArrayValue} message StringArrayValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringArrayValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a StringArrayValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.StringArrayValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.StringArrayValue} StringArrayValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringArrayValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringArrayValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.values && message.values.length))
                            message.values = [];
                        message.values.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a StringArrayValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.StringArrayValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.StringArrayValue} StringArrayValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringArrayValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a StringArrayValue message.
         * @function verify
         * @memberof common.StringArrayValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        StringArrayValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.values != null && Object.hasOwnProperty.call(message, "values")) {
                if (!Array.isArray(message.values))
                    return "values: array expected";
                for (var i = 0; i < message.values.length; ++i)
                    if (!$util.isString(message.values[i]))
                        return "values: string[] expected";
            }
            return null;
        };

        /**
         * Creates a StringArrayValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.StringArrayValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.StringArrayValue} StringArrayValue
         */
        StringArrayValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.StringArrayValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.StringArrayValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.StringArrayValue();
            if (object.values) {
                if (!Array.isArray(object.values))
                    throw TypeError(".common.StringArrayValue.values: array expected");
                message.values = [];
                for (var i = 0; i < object.values.length; ++i)
                    message.values[i] = String(object.values[i]);
            }
            return message;
        };

        /**
         * Creates a plain object from a StringArrayValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.StringArrayValue
         * @static
         * @param {common.StringArrayValue} message StringArrayValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        StringArrayValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.values = [];
            if (message.values && message.values.length) {
                object.values = [];
                for (var j = 0; j < message.values.length; ++j)
                    object.values[j] = message.values[j];
            }
            return object;
        };

        /**
         * Converts this StringArrayValue to JSON.
         * @function toJSON
         * @memberof common.StringArrayValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        StringArrayValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for StringArrayValue
         * @function getTypeUrl
         * @memberof common.StringArrayValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        StringArrayValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.StringArrayValue";
        };

        return StringArrayValue;
    })();

    common.UInt64Value = (function() {

        /**
         * Properties of a UInt64Value.
         * @memberof common
         * @interface IUInt64Value
         * @property {number|Long|null} [value] UInt64Value value
         */

        /**
         * Constructs a new UInt64Value.
         * @memberof common
         * @classdesc Represents a UInt64Value.
         * @implements IUInt64Value
         * @constructor
         * @param {common.IUInt64Value=} [properties] Properties to set
         */
        function UInt64Value(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * UInt64Value value.
         * @member {number|Long} value
         * @memberof common.UInt64Value
         * @instance
         */
        UInt64Value.prototype.value = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new UInt64Value instance using the specified properties.
         * @function create
         * @memberof common.UInt64Value
         * @static
         * @param {common.IUInt64Value=} [properties] Properties to set
         * @returns {common.UInt64Value} UInt64Value instance
         */
        UInt64Value.create = function create(properties) {
            return new UInt64Value(properties);
        };

        /**
         * Encodes the specified UInt64Value message. Does not implicitly {@link common.UInt64Value.verify|verify} messages.
         * @function encode
         * @memberof common.UInt64Value
         * @static
         * @param {common.IUInt64Value} message UInt64Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt64Value.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.value);
            return writer;
        };

        /**
         * Encodes the specified UInt64Value message, length delimited. Does not implicitly {@link common.UInt64Value.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.UInt64Value
         * @static
         * @param {common.IUInt64Value} message UInt64Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt64Value.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a UInt64Value message from the specified reader or buffer.
         * @function decode
         * @memberof common.UInt64Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.UInt64Value} UInt64Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt64Value.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt64Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a UInt64Value message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.UInt64Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.UInt64Value} UInt64Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt64Value.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a UInt64Value message.
         * @function verify
         * @memberof common.UInt64Value
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        UInt64Value.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!$util.isInteger(message.value) && !(message.value && $util.isInteger(message.value.low) && $util.isInteger(message.value.high)))
                    return "value: integer|Long expected";
            return null;
        };

        /**
         * Creates a UInt64Value message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.UInt64Value
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.UInt64Value} UInt64Value
         */
        UInt64Value.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.UInt64Value)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.UInt64Value: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.UInt64Value();
            if (object.value != null)
                if ($util.Long)
                    message.value = $util.Long.fromValue(object.value, true);
                else if (typeof object.value === "string")
                    message.value = parseInt(object.value, 10);
                else if (typeof object.value === "number")
                    message.value = object.value;
                else if (typeof object.value === "object")
                    message.value = new $util.LongBits(object.value.low >>> 0, object.value.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from a UInt64Value message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.UInt64Value
         * @static
         * @param {common.UInt64Value} message UInt64Value
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        UInt64Value.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.value = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.value = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.value = typeof message.value === "number" ? BigInt(message.value) : $util.Long.fromBits(message.value.low >>> 0, message.value.high >>> 0, true).toBigInt();
                else if (typeof message.value === "number")
                    object.value = options.longs === String ? String(message.value) : message.value;
                else
                    object.value = options.longs === String ? $util.Long.prototype.toString.call(message.value) : options.longs === Number ? new $util.LongBits(message.value.low >>> 0, message.value.high >>> 0).toNumber(true) : message.value;
            return object;
        };

        /**
         * Converts this UInt64Value to JSON.
         * @function toJSON
         * @memberof common.UInt64Value
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        UInt64Value.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for UInt64Value
         * @function getTypeUrl
         * @memberof common.UInt64Value
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        UInt64Value.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.UInt64Value";
        };

        return UInt64Value;
    })();

    common.UInt32Value = (function() {

        /**
         * Properties of a UInt32Value.
         * @memberof common
         * @interface IUInt32Value
         * @property {number|null} [value] UInt32Value value
         */

        /**
         * Constructs a new UInt32Value.
         * @memberof common
         * @classdesc Represents a UInt32Value.
         * @implements IUInt32Value
         * @constructor
         * @param {common.IUInt32Value=} [properties] Properties to set
         */
        function UInt32Value(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * UInt32Value value.
         * @member {number} value
         * @memberof common.UInt32Value
         * @instance
         */
        UInt32Value.prototype.value = 0;

        /**
         * Creates a new UInt32Value instance using the specified properties.
         * @function create
         * @memberof common.UInt32Value
         * @static
         * @param {common.IUInt32Value=} [properties] Properties to set
         * @returns {common.UInt32Value} UInt32Value instance
         */
        UInt32Value.create = function create(properties) {
            return new UInt32Value(properties);
        };

        /**
         * Encodes the specified UInt32Value message. Does not implicitly {@link common.UInt32Value.verify|verify} messages.
         * @function encode
         * @memberof common.UInt32Value
         * @static
         * @param {common.IUInt32Value} message UInt32Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt32Value.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.value);
            return writer;
        };

        /**
         * Encodes the specified UInt32Value message, length delimited. Does not implicitly {@link common.UInt32Value.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.UInt32Value
         * @static
         * @param {common.IUInt32Value} message UInt32Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt32Value.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a UInt32Value message from the specified reader or buffer.
         * @function decode
         * @memberof common.UInt32Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.UInt32Value} UInt32Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt32Value.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt32Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.uint32();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a UInt32Value message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.UInt32Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.UInt32Value} UInt32Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt32Value.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a UInt32Value message.
         * @function verify
         * @memberof common.UInt32Value
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        UInt32Value.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!$util.isInteger(message.value))
                    return "value: integer expected";
            return null;
        };

        /**
         * Creates a UInt32Value message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.UInt32Value
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.UInt32Value} UInt32Value
         */
        UInt32Value.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.UInt32Value)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.UInt32Value: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.UInt32Value();
            if (object.value != null)
                message.value = object.value >>> 0;
            return message;
        };

        /**
         * Creates a plain object from a UInt32Value message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.UInt32Value
         * @static
         * @param {common.UInt32Value} message UInt32Value
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        UInt32Value.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.value = 0;
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = message.value;
            return object;
        };

        /**
         * Converts this UInt32Value to JSON.
         * @function toJSON
         * @memberof common.UInt32Value
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        UInt32Value.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for UInt32Value
         * @function getTypeUrl
         * @memberof common.UInt32Value
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        UInt32Value.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.UInt32Value";
        };

        return UInt32Value;
    })();

    common.StringValue = (function() {

        /**
         * Properties of a StringValue.
         * @memberof common
         * @interface IStringValue
         * @property {string|null} [value] StringValue value
         */

        /**
         * Constructs a new StringValue.
         * @memberof common
         * @classdesc Represents a StringValue.
         * @implements IStringValue
         * @constructor
         * @param {common.IStringValue=} [properties] Properties to set
         */
        function StringValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * StringValue value.
         * @member {string} value
         * @memberof common.StringValue
         * @instance
         */
        StringValue.prototype.value = "";

        /**
         * Creates a new StringValue instance using the specified properties.
         * @function create
         * @memberof common.StringValue
         * @static
         * @param {common.IStringValue=} [properties] Properties to set
         * @returns {common.StringValue} StringValue instance
         */
        StringValue.create = function create(properties) {
            return new StringValue(properties);
        };

        /**
         * Encodes the specified StringValue message. Does not implicitly {@link common.StringValue.verify|verify} messages.
         * @function encode
         * @memberof common.StringValue
         * @static
         * @param {common.IStringValue} message StringValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.value);
            return writer;
        };

        /**
         * Encodes the specified StringValue message, length delimited. Does not implicitly {@link common.StringValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.StringValue
         * @static
         * @param {common.IStringValue} message StringValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a StringValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.StringValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.StringValue} StringValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a StringValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.StringValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.StringValue} StringValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a StringValue message.
         * @function verify
         * @memberof common.StringValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        StringValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!$util.isString(message.value))
                    return "value: string expected";
            return null;
        };

        /**
         * Creates a StringValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.StringValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.StringValue} StringValue
         */
        StringValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.StringValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.StringValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.StringValue();
            if (object.value != null)
                message.value = String(object.value);
            return message;
        };

        /**
         * Creates a plain object from a StringValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.StringValue
         * @static
         * @param {common.StringValue} message StringValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        StringValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.value = "";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = message.value;
            return object;
        };

        /**
         * Converts this StringValue to JSON.
         * @function toJSON
         * @memberof common.StringValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        StringValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for StringValue
         * @function getTypeUrl
         * @memberof common.StringValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        StringValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.StringValue";
        };

        return StringValue;
    })();

    common.BytesValue = (function() {

        /**
         * Properties of a BytesValue.
         * @memberof common
         * @interface IBytesValue
         * @property {Uint8Array|null} [value] BytesValue value
         */

        /**
         * Constructs a new BytesValue.
         * @memberof common
         * @classdesc Represents a BytesValue.
         * @implements IBytesValue
         * @constructor
         * @param {common.IBytesValue=} [properties] Properties to set
         */
        function BytesValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * BytesValue value.
         * @member {Uint8Array} value
         * @memberof common.BytesValue
         * @instance
         */
        BytesValue.prototype.value = $util.newBuffer([]);

        /**
         * Creates a new BytesValue instance using the specified properties.
         * @function create
         * @memberof common.BytesValue
         * @static
         * @param {common.IBytesValue=} [properties] Properties to set
         * @returns {common.BytesValue} BytesValue instance
         */
        BytesValue.create = function create(properties) {
            return new BytesValue(properties);
        };

        /**
         * Encodes the specified BytesValue message. Does not implicitly {@link common.BytesValue.verify|verify} messages.
         * @function encode
         * @memberof common.BytesValue
         * @static
         * @param {common.IBytesValue} message BytesValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BytesValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.value);
            return writer;
        };

        /**
         * Encodes the specified BytesValue message, length delimited. Does not implicitly {@link common.BytesValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.BytesValue
         * @static
         * @param {common.IBytesValue} message BytesValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BytesValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a BytesValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.BytesValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.BytesValue} BytesValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BytesValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BytesValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.bytes();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a BytesValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.BytesValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.BytesValue} BytesValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BytesValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a BytesValue message.
         * @function verify
         * @memberof common.BytesValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        BytesValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!(message.value && typeof message.value.length === "number" || $util.isString(message.value)))
                    return "value: buffer expected";
            return null;
        };

        /**
         * Creates a BytesValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.BytesValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.BytesValue} BytesValue
         */
        BytesValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.BytesValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.BytesValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.BytesValue();
            if (object.value != null)
                if (typeof object.value === "string")
                    $util.base64.decode(object.value, message.value = $util.newBuffer($util.base64.length(object.value)), 0);
                else if (object.value.length >= 0)
                    message.value = object.value;
            return message;
        };

        /**
         * Creates a plain object from a BytesValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.BytesValue
         * @static
         * @param {common.BytesValue} message BytesValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        BytesValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if (options.bytes === String)
                    object.value = "";
                else {
                    object.value = [];
                    if (options.bytes !== Array)
                        object.value = $util.newBuffer(object.value);
                }
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = options.bytes === String ? $util.base64.encode(message.value, 0, message.value.length) : options.bytes === Array ? Array.prototype.slice.call(message.value) : message.value;
            return object;
        };

        /**
         * Converts this BytesValue to JSON.
         * @function toJSON
         * @memberof common.BytesValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        BytesValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for BytesValue
         * @function getTypeUrl
         * @memberof common.BytesValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        BytesValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.BytesValue";
        };

        return BytesValue;
    })();

    common.ErrorValue = (function() {

        /**
         * Properties of an ErrorValue.
         * @memberof common
         * @interface IErrorValue
         * @property {string|null} [runtimeExcJson] ErrorValue runtimeExcJson
         * @property {string|null} [err] ErrorValue err
         */

        /**
         * Constructs a new ErrorValue.
         * @memberof common
         * @classdesc Represents an ErrorValue.
         * @implements IErrorValue
         * @constructor
         * @param {common.IErrorValue=} [properties] Properties to set
         */
        function ErrorValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ErrorValue runtimeExcJson.
         * @member {string} runtimeExcJson
         * @memberof common.ErrorValue
         * @instance
         */
        ErrorValue.prototype.runtimeExcJson = "";

        /**
         * ErrorValue err.
         * @member {string} err
         * @memberof common.ErrorValue
         * @instance
         */
        ErrorValue.prototype.err = "";

        /**
         * Creates a new ErrorValue instance using the specified properties.
         * @function create
         * @memberof common.ErrorValue
         * @static
         * @param {common.IErrorValue=} [properties] Properties to set
         * @returns {common.ErrorValue} ErrorValue instance
         */
        ErrorValue.create = function create(properties) {
            return new ErrorValue(properties);
        };

        /**
         * Encodes the specified ErrorValue message. Does not implicitly {@link common.ErrorValue.verify|verify} messages.
         * @function encode
         * @memberof common.ErrorValue
         * @static
         * @param {common.IErrorValue} message ErrorValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ErrorValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.runtimeExcJson != null && Object.hasOwnProperty.call(message, "runtimeExcJson"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.runtimeExcJson);
            if (message.err != null && Object.hasOwnProperty.call(message, "err"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.err);
            return writer;
        };

        /**
         * Encodes the specified ErrorValue message, length delimited. Does not implicitly {@link common.ErrorValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.ErrorValue
         * @static
         * @param {common.IErrorValue} message ErrorValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ErrorValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an ErrorValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.ErrorValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.ErrorValue} ErrorValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ErrorValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ErrorValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.runtimeExcJson = reader.string();
                        break;
                    }
                case 2: {
                        message.err = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an ErrorValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.ErrorValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.ErrorValue} ErrorValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ErrorValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an ErrorValue message.
         * @function verify
         * @memberof common.ErrorValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ErrorValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.runtimeExcJson != null && Object.hasOwnProperty.call(message, "runtimeExcJson"))
                if (!$util.isString(message.runtimeExcJson))
                    return "runtimeExcJson: string expected";
            if (message.err != null && Object.hasOwnProperty.call(message, "err"))
                if (!$util.isString(message.err))
                    return "err: string expected";
            return null;
        };

        /**
         * Creates an ErrorValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.ErrorValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.ErrorValue} ErrorValue
         */
        ErrorValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.ErrorValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.ErrorValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.ErrorValue();
            if (object.runtimeExcJson != null)
                message.runtimeExcJson = String(object.runtimeExcJson);
            if (object.err != null)
                message.err = String(object.err);
            return message;
        };

        /**
         * Creates a plain object from an ErrorValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.ErrorValue
         * @static
         * @param {common.ErrorValue} message ErrorValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ErrorValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.runtimeExcJson = "";
                object.err = "";
            }
            if (message.runtimeExcJson != null && Object.hasOwnProperty.call(message, "runtimeExcJson"))
                object.runtimeExcJson = message.runtimeExcJson;
            if (message.err != null && Object.hasOwnProperty.call(message, "err"))
                object.err = message.err;
            return object;
        };

        /**
         * Converts this ErrorValue to JSON.
         * @function toJSON
         * @memberof common.ErrorValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ErrorValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ErrorValue
         * @function getTypeUrl
         * @memberof common.ErrorValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ErrorValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.ErrorValue";
        };

        return ErrorValue;
    })();

    common.AnyValue = (function() {

        /**
         * Properties of an AnyValue.
         * @memberof common
         * @interface IAnyValue
         * @property {string|null} [type] AnyValue type
         * @property {common.IStringValue|null} [json] AnyValue json
         * @property {common.IBytesValue|null} [bytes] AnyValue bytes
         */

        /**
         * Constructs a new AnyValue.
         * @memberof common
         * @classdesc Represents an AnyValue.
         * @implements IAnyValue
         * @constructor
         * @param {common.IAnyValue=} [properties] Properties to set
         */
        function AnyValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * AnyValue type.
         * @member {string} type
         * @memberof common.AnyValue
         * @instance
         */
        AnyValue.prototype.type = "";

        /**
         * AnyValue json.
         * @member {common.IStringValue|null|undefined} json
         * @memberof common.AnyValue
         * @instance
         */
        AnyValue.prototype.json = null;

        /**
         * AnyValue bytes.
         * @member {common.IBytesValue|null|undefined} bytes
         * @memberof common.AnyValue
         * @instance
         */
        AnyValue.prototype.bytes = null;

        /**
         * Creates a new AnyValue instance using the specified properties.
         * @function create
         * @memberof common.AnyValue
         * @static
         * @param {common.IAnyValue=} [properties] Properties to set
         * @returns {common.AnyValue} AnyValue instance
         */
        AnyValue.create = function create(properties) {
            return new AnyValue(properties);
        };

        /**
         * Encodes the specified AnyValue message. Does not implicitly {@link common.AnyValue.verify|verify} messages.
         * @function encode
         * @memberof common.AnyValue
         * @static
         * @param {common.IAnyValue} message AnyValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AnyValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.type);
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified AnyValue message, length delimited. Does not implicitly {@link common.AnyValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.AnyValue
         * @static
         * @param {common.IAnyValue} message AnyValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AnyValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an AnyValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.AnyValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.AnyValue} AnyValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AnyValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.AnyValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.type = reader.string();
                        break;
                    }
                case 2: {
                        message.json = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an AnyValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.AnyValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.AnyValue} AnyValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AnyValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an AnyValue message.
         * @function verify
         * @memberof common.AnyValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        AnyValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.json != null && Object.hasOwnProperty.call(message, "json")) {
                var error = $root.common.StringValue.verify(message.json, long + 1);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes, long + 1);
                if (error)
                    return "bytes." + error;
            }
            return null;
        };

        /**
         * Creates an AnyValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.AnyValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.AnyValue} AnyValue
         */
        AnyValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.AnyValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.AnyValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.AnyValue();
            if (object.type != null)
                message.type = String(object.type);
            if (object.json != null) {
                if (!$util.isObject(object.json))
                    throw TypeError(".common.AnyValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json, long + 1);
            }
            if (object.bytes != null) {
                if (!$util.isObject(object.bytes))
                    throw TypeError(".common.AnyValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an AnyValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.AnyValue
         * @static
         * @param {common.AnyValue} message AnyValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        AnyValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.json = null;
                object.bytes = null;
            }
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                object.type = message.type;
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = $root.common.StringValue.toObject(message.json, options, q + 1);
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options, q + 1);
            return object;
        };

        /**
         * Converts this AnyValue to JSON.
         * @function toJSON
         * @memberof common.AnyValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        AnyValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for AnyValue
         * @function getTypeUrl
         * @memberof common.AnyValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        AnyValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.AnyValue";
        };

        return AnyValue;
    })();

    return common;
})();

$root.file = (function() {

    /**
     * Namespace file.
     * @exports file
     * @namespace
     */
    var file = {};

    file.File = (function() {

        /**
         * Properties of a File.
         * @memberof file
         * @interface IFile
         * @property {boolean|null} [writable] File writable
         * @property {boolean|null} [isVersioned] File isVersioned
         * @property {string|null} [name] File name
         * @property {boolean|null} [isNew] File isNew
         * @property {common.IObjectReference|null} [impl] File impl
         * @property {boolean|null} [isSynced] File isSynced
         */

        /**
         * Constructs a new File.
         * @memberof file
         * @classdesc Represents a File.
         * @implements IFile
         * @constructor
         * @param {file.IFile=} [properties] Properties to set
         */
        function File(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * File writable.
         * @member {boolean} writable
         * @memberof file.File
         * @instance
         */
        File.prototype.writable = false;

        /**
         * File isVersioned.
         * @member {boolean} isVersioned
         * @memberof file.File
         * @instance
         */
        File.prototype.isVersioned = false;

        /**
         * File name.
         * @member {string} name
         * @memberof file.File
         * @instance
         */
        File.prototype.name = "";

        /**
         * File isNew.
         * @member {boolean} isNew
         * @memberof file.File
         * @instance
         */
        File.prototype.isNew = false;

        /**
         * File impl.
         * @member {common.IObjectReference|null|undefined} impl
         * @memberof file.File
         * @instance
         */
        File.prototype.impl = null;

        /**
         * File isSynced.
         * @member {boolean} isSynced
         * @memberof file.File
         * @instance
         */
        File.prototype.isSynced = false;

        /**
         * Creates a new File instance using the specified properties.
         * @function create
         * @memberof file.File
         * @static
         * @param {file.IFile=} [properties] Properties to set
         * @returns {file.File} File instance
         */
        File.create = function create(properties) {
            return new File(properties);
        };

        /**
         * Encodes the specified File message. Does not implicitly {@link file.File.verify|verify} messages.
         * @function encode
         * @memberof file.File
         * @static
         * @param {file.IFile} message File message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        File.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.writable != null && Object.hasOwnProperty.call(message, "writable"))
                writer.uint32(/* id 1, wireType 0 =*/8).bool(message.writable);
            if (message.isVersioned != null && Object.hasOwnProperty.call(message, "isVersioned"))
                writer.uint32(/* id 2, wireType 0 =*/16).bool(message.isVersioned);
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                writer.uint32(/* id 3, wireType 2 =*/26).string(message.name);
            if (message.isNew != null && Object.hasOwnProperty.call(message, "isNew"))
                writer.uint32(/* id 4, wireType 0 =*/32).bool(message.isNew);
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl"))
                $root.common.ObjectReference.encode(message.impl, writer.uint32(/* id 5, wireType 2 =*/42).fork(), q + 1).ldelim();
            if (message.isSynced != null && Object.hasOwnProperty.call(message, "isSynced"))
                writer.uint32(/* id 6, wireType 0 =*/48).bool(message.isSynced);
            return writer;
        };

        /**
         * Encodes the specified File message, length delimited. Does not implicitly {@link file.File.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.File
         * @static
         * @param {file.IFile} message File message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        File.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a File message from the specified reader or buffer.
         * @function decode
         * @memberof file.File
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.File} File
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        File.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.File();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.writable = reader.bool();
                        break;
                    }
                case 2: {
                        message.isVersioned = reader.bool();
                        break;
                    }
                case 3: {
                        message.name = reader.string();
                        break;
                    }
                case 4: {
                        message.isNew = reader.bool();
                        break;
                    }
                case 5: {
                        message.impl = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 6: {
                        message.isSynced = reader.bool();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a File message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.File
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.File} File
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        File.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a File message.
         * @function verify
         * @memberof file.File
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        File.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.writable != null && Object.hasOwnProperty.call(message, "writable"))
                if (typeof message.writable !== "boolean")
                    return "writable: boolean expected";
            if (message.isVersioned != null && Object.hasOwnProperty.call(message, "isVersioned"))
                if (typeof message.isVersioned !== "boolean")
                    return "isVersioned: boolean expected";
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.isNew != null && Object.hasOwnProperty.call(message, "isNew"))
                if (typeof message.isNew !== "boolean")
                    return "isNew: boolean expected";
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl")) {
                var error = $root.common.ObjectReference.verify(message.impl, long + 1);
                if (error)
                    return "impl." + error;
            }
            if (message.isSynced != null && Object.hasOwnProperty.call(message, "isSynced"))
                if (typeof message.isSynced !== "boolean")
                    return "isSynced: boolean expected";
            return null;
        };

        /**
         * Creates a File message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.File
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.File} File
         */
        File.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.File)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.File: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.File();
            if (object.writable != null)
                message.writable = Boolean(object.writable);
            if (object.isVersioned != null)
                message.isVersioned = Boolean(object.isVersioned);
            if (object.name != null)
                message.name = String(object.name);
            if (object.isNew != null)
                message.isNew = Boolean(object.isNew);
            if (object.impl != null) {
                if (!$util.isObject(object.impl))
                    throw TypeError(".file.File.impl: object expected");
                message.impl = $root.common.ObjectReference.fromObject(object.impl, long + 1);
            }
            if (object.isSynced != null)
                message.isSynced = Boolean(object.isSynced);
            return message;
        };

        /**
         * Creates a plain object from a File message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.File
         * @static
         * @param {file.File} message File
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        File.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.writable = false;
                object.isVersioned = false;
                object.name = "";
                object.isNew = false;
                object.impl = null;
                object.isSynced = false;
            }
            if (message.writable != null && Object.hasOwnProperty.call(message, "writable"))
                object.writable = message.writable;
            if (message.isVersioned != null && Object.hasOwnProperty.call(message, "isVersioned"))
                object.isVersioned = message.isVersioned;
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                object.name = message.name;
            if (message.isNew != null && Object.hasOwnProperty.call(message, "isNew"))
                object.isNew = message.isNew;
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl"))
                object.impl = $root.common.ObjectReference.toObject(message.impl, options, q + 1);
            if (message.isSynced != null && Object.hasOwnProperty.call(message, "isSynced"))
                object.isSynced = message.isSynced;
            return object;
        };

        /**
         * Converts this File to JSON.
         * @function toJSON
         * @memberof file.File
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        File.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for File
         * @function getTypeUrl
         * @memberof file.File
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        File.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.File";
        };

        return File;
    })();

    file.SyncStatusMsg = (function() {

        /**
         * Properties of a SyncStatusMsg.
         * @memberof file
         * @interface ISyncStatusMsg
         * @property {string|null} [state] SyncStatusMsg state
         * @property {file.ISyncVersionsBranchMsg|null} [local] SyncStatusMsg local
         * @property {file.ISyncVersionsBranchMsg|null} [synced] SyncStatusMsg synced
         * @property {file.ISyncVersionsBranchMsg|null} [remote] SyncStatusMsg remote
         * @property {common.IBooleanValue|null} [existsInSyncedParent] SyncStatusMsg existsInSyncedParent
         * @property {file.IUploadingStateMsg|null} [uploading] SyncStatusMsg uploading
         */

        /**
         * Constructs a new SyncStatusMsg.
         * @memberof file
         * @classdesc Represents a SyncStatusMsg.
         * @implements ISyncStatusMsg
         * @constructor
         * @param {file.ISyncStatusMsg=} [properties] Properties to set
         */
        function SyncStatusMsg(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * SyncStatusMsg state.
         * @member {string} state
         * @memberof file.SyncStatusMsg
         * @instance
         */
        SyncStatusMsg.prototype.state = "";

        /**
         * SyncStatusMsg local.
         * @member {file.ISyncVersionsBranchMsg|null|undefined} local
         * @memberof file.SyncStatusMsg
         * @instance
         */
        SyncStatusMsg.prototype.local = null;

        /**
         * SyncStatusMsg synced.
         * @member {file.ISyncVersionsBranchMsg|null|undefined} synced
         * @memberof file.SyncStatusMsg
         * @instance
         */
        SyncStatusMsg.prototype.synced = null;

        /**
         * SyncStatusMsg remote.
         * @member {file.ISyncVersionsBranchMsg|null|undefined} remote
         * @memberof file.SyncStatusMsg
         * @instance
         */
        SyncStatusMsg.prototype.remote = null;

        /**
         * SyncStatusMsg existsInSyncedParent.
         * @member {common.IBooleanValue|null|undefined} existsInSyncedParent
         * @memberof file.SyncStatusMsg
         * @instance
         */
        SyncStatusMsg.prototype.existsInSyncedParent = null;

        /**
         * SyncStatusMsg uploading.
         * @member {file.IUploadingStateMsg|null|undefined} uploading
         * @memberof file.SyncStatusMsg
         * @instance
         */
        SyncStatusMsg.prototype.uploading = null;

        /**
         * Creates a new SyncStatusMsg instance using the specified properties.
         * @function create
         * @memberof file.SyncStatusMsg
         * @static
         * @param {file.ISyncStatusMsg=} [properties] Properties to set
         * @returns {file.SyncStatusMsg} SyncStatusMsg instance
         */
        SyncStatusMsg.create = function create(properties) {
            return new SyncStatusMsg(properties);
        };

        /**
         * Encodes the specified SyncStatusMsg message. Does not implicitly {@link file.SyncStatusMsg.verify|verify} messages.
         * @function encode
         * @memberof file.SyncStatusMsg
         * @static
         * @param {file.ISyncStatusMsg} message SyncStatusMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SyncStatusMsg.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.state != null && Object.hasOwnProperty.call(message, "state"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.state);
            if (message.local != null && Object.hasOwnProperty.call(message, "local"))
                $root.file.SyncVersionsBranchMsg.encode(message.local, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.synced != null && Object.hasOwnProperty.call(message, "synced"))
                $root.file.SyncVersionsBranchMsg.encode(message.synced, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                $root.file.SyncVersionsBranchMsg.encode(message.remote, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            if (message.existsInSyncedParent != null && Object.hasOwnProperty.call(message, "existsInSyncedParent"))
                $root.common.BooleanValue.encode(message.existsInSyncedParent, writer.uint32(/* id 5, wireType 2 =*/42).fork(), q + 1).ldelim();
            if (message.uploading != null && Object.hasOwnProperty.call(message, "uploading"))
                $root.file.UploadingStateMsg.encode(message.uploading, writer.uint32(/* id 6, wireType 2 =*/50).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified SyncStatusMsg message, length delimited. Does not implicitly {@link file.SyncStatusMsg.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.SyncStatusMsg
         * @static
         * @param {file.ISyncStatusMsg} message SyncStatusMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SyncStatusMsg.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a SyncStatusMsg message from the specified reader or buffer.
         * @function decode
         * @memberof file.SyncStatusMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.SyncStatusMsg} SyncStatusMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SyncStatusMsg.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.SyncStatusMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.state = reader.string();
                        break;
                    }
                case 2: {
                        message.local = $root.file.SyncVersionsBranchMsg.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.synced = $root.file.SyncVersionsBranchMsg.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.remote = $root.file.SyncVersionsBranchMsg.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 5: {
                        message.existsInSyncedParent = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 6: {
                        message.uploading = $root.file.UploadingStateMsg.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a SyncStatusMsg message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.SyncStatusMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.SyncStatusMsg} SyncStatusMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SyncStatusMsg.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a SyncStatusMsg message.
         * @function verify
         * @memberof file.SyncStatusMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        SyncStatusMsg.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.state != null && Object.hasOwnProperty.call(message, "state"))
                if (!$util.isString(message.state))
                    return "state: string expected";
            if (message.local != null && Object.hasOwnProperty.call(message, "local")) {
                var error = $root.file.SyncVersionsBranchMsg.verify(message.local, long + 1);
                if (error)
                    return "local." + error;
            }
            if (message.synced != null && Object.hasOwnProperty.call(message, "synced")) {
                var error = $root.file.SyncVersionsBranchMsg.verify(message.synced, long + 1);
                if (error)
                    return "synced." + error;
            }
            if (message.remote != null && Object.hasOwnProperty.call(message, "remote")) {
                var error = $root.file.SyncVersionsBranchMsg.verify(message.remote, long + 1);
                if (error)
                    return "remote." + error;
            }
            if (message.existsInSyncedParent != null && Object.hasOwnProperty.call(message, "existsInSyncedParent")) {
                var error = $root.common.BooleanValue.verify(message.existsInSyncedParent, long + 1);
                if (error)
                    return "existsInSyncedParent." + error;
            }
            if (message.uploading != null && Object.hasOwnProperty.call(message, "uploading")) {
                var error = $root.file.UploadingStateMsg.verify(message.uploading, long + 1);
                if (error)
                    return "uploading." + error;
            }
            return null;
        };

        /**
         * Creates a SyncStatusMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.SyncStatusMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.SyncStatusMsg} SyncStatusMsg
         */
        SyncStatusMsg.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.SyncStatusMsg)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.SyncStatusMsg: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.SyncStatusMsg();
            if (object.state != null)
                message.state = String(object.state);
            if (object.local != null) {
                if (!$util.isObject(object.local))
                    throw TypeError(".file.SyncStatusMsg.local: object expected");
                message.local = $root.file.SyncVersionsBranchMsg.fromObject(object.local, long + 1);
            }
            if (object.synced != null) {
                if (!$util.isObject(object.synced))
                    throw TypeError(".file.SyncStatusMsg.synced: object expected");
                message.synced = $root.file.SyncVersionsBranchMsg.fromObject(object.synced, long + 1);
            }
            if (object.remote != null) {
                if (!$util.isObject(object.remote))
                    throw TypeError(".file.SyncStatusMsg.remote: object expected");
                message.remote = $root.file.SyncVersionsBranchMsg.fromObject(object.remote, long + 1);
            }
            if (object.existsInSyncedParent != null) {
                if (!$util.isObject(object.existsInSyncedParent))
                    throw TypeError(".file.SyncStatusMsg.existsInSyncedParent: object expected");
                message.existsInSyncedParent = $root.common.BooleanValue.fromObject(object.existsInSyncedParent, long + 1);
            }
            if (object.uploading != null) {
                if (!$util.isObject(object.uploading))
                    throw TypeError(".file.SyncStatusMsg.uploading: object expected");
                message.uploading = $root.file.UploadingStateMsg.fromObject(object.uploading, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a SyncStatusMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.SyncStatusMsg
         * @static
         * @param {file.SyncStatusMsg} message SyncStatusMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        SyncStatusMsg.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.state = "";
                object.local = null;
                object.synced = null;
                object.remote = null;
                object.existsInSyncedParent = null;
                object.uploading = null;
            }
            if (message.state != null && Object.hasOwnProperty.call(message, "state"))
                object.state = message.state;
            if (message.local != null && Object.hasOwnProperty.call(message, "local"))
                object.local = $root.file.SyncVersionsBranchMsg.toObject(message.local, options, q + 1);
            if (message.synced != null && Object.hasOwnProperty.call(message, "synced"))
                object.synced = $root.file.SyncVersionsBranchMsg.toObject(message.synced, options, q + 1);
            if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                object.remote = $root.file.SyncVersionsBranchMsg.toObject(message.remote, options, q + 1);
            if (message.existsInSyncedParent != null && Object.hasOwnProperty.call(message, "existsInSyncedParent"))
                object.existsInSyncedParent = $root.common.BooleanValue.toObject(message.existsInSyncedParent, options, q + 1);
            if (message.uploading != null && Object.hasOwnProperty.call(message, "uploading"))
                object.uploading = $root.file.UploadingStateMsg.toObject(message.uploading, options, q + 1);
            return object;
        };

        /**
         * Converts this SyncStatusMsg to JSON.
         * @function toJSON
         * @memberof file.SyncStatusMsg
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        SyncStatusMsg.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for SyncStatusMsg
         * @function getTypeUrl
         * @memberof file.SyncStatusMsg
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        SyncStatusMsg.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.SyncStatusMsg";
        };

        return SyncStatusMsg;
    })();

    file.SyncVersionsBranchMsg = (function() {

        /**
         * Properties of a SyncVersionsBranchMsg.
         * @memberof file
         * @interface ISyncVersionsBranchMsg
         * @property {common.IUInt64Value|null} [latest] SyncVersionsBranchMsg latest
         * @property {Array.<number|Long>|null} [archived] SyncVersionsBranchMsg archived
         * @property {common.IBooleanValue|null} [isArchived] SyncVersionsBranchMsg isArchived
         */

        /**
         * Constructs a new SyncVersionsBranchMsg.
         * @memberof file
         * @classdesc Represents a SyncVersionsBranchMsg.
         * @implements ISyncVersionsBranchMsg
         * @constructor
         * @param {file.ISyncVersionsBranchMsg=} [properties] Properties to set
         */
        function SyncVersionsBranchMsg(properties) {
            this.archived = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * SyncVersionsBranchMsg latest.
         * @member {common.IUInt64Value|null|undefined} latest
         * @memberof file.SyncVersionsBranchMsg
         * @instance
         */
        SyncVersionsBranchMsg.prototype.latest = null;

        /**
         * SyncVersionsBranchMsg archived.
         * @member {Array.<number|Long>} archived
         * @memberof file.SyncVersionsBranchMsg
         * @instance
         */
        SyncVersionsBranchMsg.prototype.archived = $util.emptyArray;

        /**
         * SyncVersionsBranchMsg isArchived.
         * @member {common.IBooleanValue|null|undefined} isArchived
         * @memberof file.SyncVersionsBranchMsg
         * @instance
         */
        SyncVersionsBranchMsg.prototype.isArchived = null;

        /**
         * Creates a new SyncVersionsBranchMsg instance using the specified properties.
         * @function create
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {file.ISyncVersionsBranchMsg=} [properties] Properties to set
         * @returns {file.SyncVersionsBranchMsg} SyncVersionsBranchMsg instance
         */
        SyncVersionsBranchMsg.create = function create(properties) {
            return new SyncVersionsBranchMsg(properties);
        };

        /**
         * Encodes the specified SyncVersionsBranchMsg message. Does not implicitly {@link file.SyncVersionsBranchMsg.verify|verify} messages.
         * @function encode
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {file.ISyncVersionsBranchMsg} message SyncVersionsBranchMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SyncVersionsBranchMsg.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.latest != null && Object.hasOwnProperty.call(message, "latest"))
                $root.common.UInt64Value.encode(message.latest, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.archived != null && message.archived.length) {
                writer.uint32(/* id 2, wireType 2 =*/18).fork();
                for (var i = 0; i < message.archived.length; ++i)
                    writer.uint64(message.archived[i]);
                writer.ldelim();
            }
            if (message.isArchived != null && Object.hasOwnProperty.call(message, "isArchived"))
                $root.common.BooleanValue.encode(message.isArchived, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified SyncVersionsBranchMsg message, length delimited. Does not implicitly {@link file.SyncVersionsBranchMsg.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {file.ISyncVersionsBranchMsg} message SyncVersionsBranchMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SyncVersionsBranchMsg.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a SyncVersionsBranchMsg message from the specified reader or buffer.
         * @function decode
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.SyncVersionsBranchMsg} SyncVersionsBranchMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SyncVersionsBranchMsg.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.SyncVersionsBranchMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.latest = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        if (!(message.archived && message.archived.length))
                            message.archived = [];
                        if ((tag & 7) === 2) {
                            var end2 = reader.uint32() + reader.pos;
                            while (reader.pos < end2)
                                message.archived.push(reader.uint64());
                        } else
                            message.archived.push(reader.uint64());
                        break;
                    }
                case 3: {
                        message.isArchived = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a SyncVersionsBranchMsg message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.SyncVersionsBranchMsg} SyncVersionsBranchMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SyncVersionsBranchMsg.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a SyncVersionsBranchMsg message.
         * @function verify
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        SyncVersionsBranchMsg.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.latest != null && Object.hasOwnProperty.call(message, "latest")) {
                var error = $root.common.UInt64Value.verify(message.latest, long + 1);
                if (error)
                    return "latest." + error;
            }
            if (message.archived != null && Object.hasOwnProperty.call(message, "archived")) {
                if (!Array.isArray(message.archived))
                    return "archived: array expected";
                for (var i = 0; i < message.archived.length; ++i)
                    if (!$util.isInteger(message.archived[i]) && !(message.archived[i] && $util.isInteger(message.archived[i].low) && $util.isInteger(message.archived[i].high)))
                        return "archived: integer|Long[] expected";
            }
            if (message.isArchived != null && Object.hasOwnProperty.call(message, "isArchived")) {
                var error = $root.common.BooleanValue.verify(message.isArchived, long + 1);
                if (error)
                    return "isArchived." + error;
            }
            return null;
        };

        /**
         * Creates a SyncVersionsBranchMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.SyncVersionsBranchMsg} SyncVersionsBranchMsg
         */
        SyncVersionsBranchMsg.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.SyncVersionsBranchMsg)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.SyncVersionsBranchMsg: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.SyncVersionsBranchMsg();
            if (object.latest != null) {
                if (!$util.isObject(object.latest))
                    throw TypeError(".file.SyncVersionsBranchMsg.latest: object expected");
                message.latest = $root.common.UInt64Value.fromObject(object.latest, long + 1);
            }
            if (object.archived) {
                if (!Array.isArray(object.archived))
                    throw TypeError(".file.SyncVersionsBranchMsg.archived: array expected");
                message.archived = [];
                for (var i = 0; i < object.archived.length; ++i)
                    if ($util.Long)
                        message.archived[i] = $util.Long.fromValue(object.archived[i], true);
                    else if (typeof object.archived[i] === "string")
                        message.archived[i] = parseInt(object.archived[i], 10);
                    else if (typeof object.archived[i] === "number")
                        message.archived[i] = object.archived[i];
                    else if (typeof object.archived[i] === "object")
                        message.archived[i] = new $util.LongBits(object.archived[i].low >>> 0, object.archived[i].high >>> 0).toNumber(true);
            }
            if (object.isArchived != null) {
                if (!$util.isObject(object.isArchived))
                    throw TypeError(".file.SyncVersionsBranchMsg.isArchived: object expected");
                message.isArchived = $root.common.BooleanValue.fromObject(object.isArchived, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a SyncVersionsBranchMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {file.SyncVersionsBranchMsg} message SyncVersionsBranchMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        SyncVersionsBranchMsg.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.archived = [];
            if (options.defaults) {
                object.latest = null;
                object.isArchived = null;
            }
            if (message.latest != null && Object.hasOwnProperty.call(message, "latest"))
                object.latest = $root.common.UInt64Value.toObject(message.latest, options, q + 1);
            if (message.archived && message.archived.length) {
                object.archived = [];
                for (var j = 0; j < message.archived.length; ++j)
                    if (typeof BigInt !== "undefined" && options.longs === BigInt)
                        object.archived[j] = typeof message.archived[j] === "number" ? BigInt(message.archived[j]) : $util.Long.fromBits(message.archived[j].low >>> 0, message.archived[j].high >>> 0, true).toBigInt();
                    else if (typeof message.archived[j] === "number")
                        object.archived[j] = options.longs === String ? String(message.archived[j]) : message.archived[j];
                    else
                        object.archived[j] = options.longs === String ? $util.Long.prototype.toString.call(message.archived[j]) : options.longs === Number ? new $util.LongBits(message.archived[j].low >>> 0, message.archived[j].high >>> 0).toNumber(true) : message.archived[j];
            }
            if (message.isArchived != null && Object.hasOwnProperty.call(message, "isArchived"))
                object.isArchived = $root.common.BooleanValue.toObject(message.isArchived, options, q + 1);
            return object;
        };

        /**
         * Converts this SyncVersionsBranchMsg to JSON.
         * @function toJSON
         * @memberof file.SyncVersionsBranchMsg
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        SyncVersionsBranchMsg.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for SyncVersionsBranchMsg
         * @function getTypeUrl
         * @memberof file.SyncVersionsBranchMsg
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        SyncVersionsBranchMsg.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.SyncVersionsBranchMsg";
        };

        return SyncVersionsBranchMsg;
    })();

    file.UploadingStateMsg = (function() {

        /**
         * Properties of an UploadingStateMsg.
         * @memberof file
         * @interface IUploadingStateMsg
         * @property {number|Long|null} [localVersion] UploadingStateMsg localVersion
         * @property {number|Long|null} [remoteVersion] UploadingStateMsg remoteVersion
         * @property {number|Long|null} [bytesLeftToUpload] UploadingStateMsg bytesLeftToUpload
         * @property {boolean|null} [uploadStarted] UploadingStateMsg uploadStarted
         */

        /**
         * Constructs a new UploadingStateMsg.
         * @memberof file
         * @classdesc Represents an UploadingStateMsg.
         * @implements IUploadingStateMsg
         * @constructor
         * @param {file.IUploadingStateMsg=} [properties] Properties to set
         */
        function UploadingStateMsg(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * UploadingStateMsg localVersion.
         * @member {number|Long} localVersion
         * @memberof file.UploadingStateMsg
         * @instance
         */
        UploadingStateMsg.prototype.localVersion = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * UploadingStateMsg remoteVersion.
         * @member {number|Long} remoteVersion
         * @memberof file.UploadingStateMsg
         * @instance
         */
        UploadingStateMsg.prototype.remoteVersion = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * UploadingStateMsg bytesLeftToUpload.
         * @member {number|Long} bytesLeftToUpload
         * @memberof file.UploadingStateMsg
         * @instance
         */
        UploadingStateMsg.prototype.bytesLeftToUpload = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * UploadingStateMsg uploadStarted.
         * @member {boolean} uploadStarted
         * @memberof file.UploadingStateMsg
         * @instance
         */
        UploadingStateMsg.prototype.uploadStarted = false;

        /**
         * Creates a new UploadingStateMsg instance using the specified properties.
         * @function create
         * @memberof file.UploadingStateMsg
         * @static
         * @param {file.IUploadingStateMsg=} [properties] Properties to set
         * @returns {file.UploadingStateMsg} UploadingStateMsg instance
         */
        UploadingStateMsg.create = function create(properties) {
            return new UploadingStateMsg(properties);
        };

        /**
         * Encodes the specified UploadingStateMsg message. Does not implicitly {@link file.UploadingStateMsg.verify|verify} messages.
         * @function encode
         * @memberof file.UploadingStateMsg
         * @static
         * @param {file.IUploadingStateMsg} message UploadingStateMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UploadingStateMsg.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.localVersion);
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.remoteVersion);
            if (message.bytesLeftToUpload != null && Object.hasOwnProperty.call(message, "bytesLeftToUpload"))
                writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.bytesLeftToUpload);
            if (message.uploadStarted != null && Object.hasOwnProperty.call(message, "uploadStarted"))
                writer.uint32(/* id 4, wireType 0 =*/32).bool(message.uploadStarted);
            return writer;
        };

        /**
         * Encodes the specified UploadingStateMsg message, length delimited. Does not implicitly {@link file.UploadingStateMsg.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.UploadingStateMsg
         * @static
         * @param {file.IUploadingStateMsg} message UploadingStateMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UploadingStateMsg.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an UploadingStateMsg message from the specified reader or buffer.
         * @function decode
         * @memberof file.UploadingStateMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.UploadingStateMsg} UploadingStateMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UploadingStateMsg.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.UploadingStateMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.localVersion = reader.uint64();
                        break;
                    }
                case 2: {
                        message.remoteVersion = reader.uint64();
                        break;
                    }
                case 3: {
                        message.bytesLeftToUpload = reader.uint64();
                        break;
                    }
                case 4: {
                        message.uploadStarted = reader.bool();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an UploadingStateMsg message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.UploadingStateMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.UploadingStateMsg} UploadingStateMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UploadingStateMsg.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an UploadingStateMsg message.
         * @function verify
         * @memberof file.UploadingStateMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        UploadingStateMsg.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                if (!$util.isInteger(message.localVersion) && !(message.localVersion && $util.isInteger(message.localVersion.low) && $util.isInteger(message.localVersion.high)))
                    return "localVersion: integer|Long expected";
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                if (!$util.isInteger(message.remoteVersion) && !(message.remoteVersion && $util.isInteger(message.remoteVersion.low) && $util.isInteger(message.remoteVersion.high)))
                    return "remoteVersion: integer|Long expected";
            if (message.bytesLeftToUpload != null && Object.hasOwnProperty.call(message, "bytesLeftToUpload"))
                if (!$util.isInteger(message.bytesLeftToUpload) && !(message.bytesLeftToUpload && $util.isInteger(message.bytesLeftToUpload.low) && $util.isInteger(message.bytesLeftToUpload.high)))
                    return "bytesLeftToUpload: integer|Long expected";
            if (message.uploadStarted != null && Object.hasOwnProperty.call(message, "uploadStarted"))
                if (typeof message.uploadStarted !== "boolean")
                    return "uploadStarted: boolean expected";
            return null;
        };

        /**
         * Creates an UploadingStateMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.UploadingStateMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.UploadingStateMsg} UploadingStateMsg
         */
        UploadingStateMsg.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.UploadingStateMsg)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.UploadingStateMsg: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.UploadingStateMsg();
            if (object.localVersion != null)
                if ($util.Long)
                    message.localVersion = $util.Long.fromValue(object.localVersion, true);
                else if (typeof object.localVersion === "string")
                    message.localVersion = parseInt(object.localVersion, 10);
                else if (typeof object.localVersion === "number")
                    message.localVersion = object.localVersion;
                else if (typeof object.localVersion === "object")
                    message.localVersion = new $util.LongBits(object.localVersion.low >>> 0, object.localVersion.high >>> 0).toNumber(true);
            if (object.remoteVersion != null)
                if ($util.Long)
                    message.remoteVersion = $util.Long.fromValue(object.remoteVersion, true);
                else if (typeof object.remoteVersion === "string")
                    message.remoteVersion = parseInt(object.remoteVersion, 10);
                else if (typeof object.remoteVersion === "number")
                    message.remoteVersion = object.remoteVersion;
                else if (typeof object.remoteVersion === "object")
                    message.remoteVersion = new $util.LongBits(object.remoteVersion.low >>> 0, object.remoteVersion.high >>> 0).toNumber(true);
            if (object.bytesLeftToUpload != null)
                if ($util.Long)
                    message.bytesLeftToUpload = $util.Long.fromValue(object.bytesLeftToUpload, true);
                else if (typeof object.bytesLeftToUpload === "string")
                    message.bytesLeftToUpload = parseInt(object.bytesLeftToUpload, 10);
                else if (typeof object.bytesLeftToUpload === "number")
                    message.bytesLeftToUpload = object.bytesLeftToUpload;
                else if (typeof object.bytesLeftToUpload === "object")
                    message.bytesLeftToUpload = new $util.LongBits(object.bytesLeftToUpload.low >>> 0, object.bytesLeftToUpload.high >>> 0).toNumber(true);
            if (object.uploadStarted != null)
                message.uploadStarted = Boolean(object.uploadStarted);
            return message;
        };

        /**
         * Creates a plain object from an UploadingStateMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.UploadingStateMsg
         * @static
         * @param {file.UploadingStateMsg} message UploadingStateMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        UploadingStateMsg.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.localVersion = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.localVersion = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.remoteVersion = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.remoteVersion = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.bytesLeftToUpload = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.bytesLeftToUpload = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.uploadStarted = false;
            }
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.localVersion = typeof message.localVersion === "number" ? BigInt(message.localVersion) : $util.Long.fromBits(message.localVersion.low >>> 0, message.localVersion.high >>> 0, true).toBigInt();
                else if (typeof message.localVersion === "number")
                    object.localVersion = options.longs === String ? String(message.localVersion) : message.localVersion;
                else
                    object.localVersion = options.longs === String ? $util.Long.prototype.toString.call(message.localVersion) : options.longs === Number ? new $util.LongBits(message.localVersion.low >>> 0, message.localVersion.high >>> 0).toNumber(true) : message.localVersion;
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.remoteVersion = typeof message.remoteVersion === "number" ? BigInt(message.remoteVersion) : $util.Long.fromBits(message.remoteVersion.low >>> 0, message.remoteVersion.high >>> 0, true).toBigInt();
                else if (typeof message.remoteVersion === "number")
                    object.remoteVersion = options.longs === String ? String(message.remoteVersion) : message.remoteVersion;
                else
                    object.remoteVersion = options.longs === String ? $util.Long.prototype.toString.call(message.remoteVersion) : options.longs === Number ? new $util.LongBits(message.remoteVersion.low >>> 0, message.remoteVersion.high >>> 0).toNumber(true) : message.remoteVersion;
            if (message.bytesLeftToUpload != null && Object.hasOwnProperty.call(message, "bytesLeftToUpload"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.bytesLeftToUpload = typeof message.bytesLeftToUpload === "number" ? BigInt(message.bytesLeftToUpload) : $util.Long.fromBits(message.bytesLeftToUpload.low >>> 0, message.bytesLeftToUpload.high >>> 0, true).toBigInt();
                else if (typeof message.bytesLeftToUpload === "number")
                    object.bytesLeftToUpload = options.longs === String ? String(message.bytesLeftToUpload) : message.bytesLeftToUpload;
                else
                    object.bytesLeftToUpload = options.longs === String ? $util.Long.prototype.toString.call(message.bytesLeftToUpload) : options.longs === Number ? new $util.LongBits(message.bytesLeftToUpload.low >>> 0, message.bytesLeftToUpload.high >>> 0).toNumber(true) : message.bytesLeftToUpload;
            if (message.uploadStarted != null && Object.hasOwnProperty.call(message, "uploadStarted"))
                object.uploadStarted = message.uploadStarted;
            return object;
        };

        /**
         * Converts this UploadingStateMsg to JSON.
         * @function toJSON
         * @memberof file.UploadingStateMsg
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        UploadingStateMsg.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for UploadingStateMsg
         * @function getTypeUrl
         * @memberof file.UploadingStateMsg
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        UploadingStateMsg.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.UploadingStateMsg";
        };

        return UploadingStateMsg;
    })();

    file.StatsMsg = (function() {

        /**
         * Properties of a StatsMsg.
         * @memberof file
         * @interface IStatsMsg
         * @property {common.IBooleanValue|null} [isFile] StatsMsg isFile
         * @property {common.IBooleanValue|null} [isFolder] StatsMsg isFolder
         * @property {common.IBooleanValue|null} [isLink] StatsMsg isLink
         * @property {boolean|null} [writable] StatsMsg writable
         * @property {common.IUInt64Value|null} [size] StatsMsg size
         * @property {common.IUInt64Value|null} [mtime] StatsMsg mtime
         * @property {common.IUInt64Value|null} [ctime] StatsMsg ctime
         * @property {common.IUInt64Value|null} [version] StatsMsg version
         * @property {common.IUInt64Value|null} [bytesNeedDownload] StatsMsg bytesNeedDownload
         * @property {common.IStringValue|null} [versionSyncBranch] StatsMsg versionSyncBranch
         */

        /**
         * Constructs a new StatsMsg.
         * @memberof file
         * @classdesc Represents a StatsMsg.
         * @implements IStatsMsg
         * @constructor
         * @param {file.IStatsMsg=} [properties] Properties to set
         */
        function StatsMsg(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * StatsMsg isFile.
         * @member {common.IBooleanValue|null|undefined} isFile
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.isFile = null;

        /**
         * StatsMsg isFolder.
         * @member {common.IBooleanValue|null|undefined} isFolder
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.isFolder = null;

        /**
         * StatsMsg isLink.
         * @member {common.IBooleanValue|null|undefined} isLink
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.isLink = null;

        /**
         * StatsMsg writable.
         * @member {boolean} writable
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.writable = false;

        /**
         * StatsMsg size.
         * @member {common.IUInt64Value|null|undefined} size
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.size = null;

        /**
         * StatsMsg mtime.
         * @member {common.IUInt64Value|null|undefined} mtime
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.mtime = null;

        /**
         * StatsMsg ctime.
         * @member {common.IUInt64Value|null|undefined} ctime
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.ctime = null;

        /**
         * StatsMsg version.
         * @member {common.IUInt64Value|null|undefined} version
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.version = null;

        /**
         * StatsMsg bytesNeedDownload.
         * @member {common.IUInt64Value|null|undefined} bytesNeedDownload
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.bytesNeedDownload = null;

        /**
         * StatsMsg versionSyncBranch.
         * @member {common.IStringValue|null|undefined} versionSyncBranch
         * @memberof file.StatsMsg
         * @instance
         */
        StatsMsg.prototype.versionSyncBranch = null;

        /**
         * Creates a new StatsMsg instance using the specified properties.
         * @function create
         * @memberof file.StatsMsg
         * @static
         * @param {file.IStatsMsg=} [properties] Properties to set
         * @returns {file.StatsMsg} StatsMsg instance
         */
        StatsMsg.create = function create(properties) {
            return new StatsMsg(properties);
        };

        /**
         * Encodes the specified StatsMsg message. Does not implicitly {@link file.StatsMsg.verify|verify} messages.
         * @function encode
         * @memberof file.StatsMsg
         * @static
         * @param {file.IStatsMsg} message StatsMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StatsMsg.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                $root.common.BooleanValue.encode(message.isFile, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                $root.common.BooleanValue.encode(message.isFolder, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink"))
                $root.common.BooleanValue.encode(message.isLink, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.writable != null && Object.hasOwnProperty.call(message, "writable"))
                writer.uint32(/* id 4, wireType 0 =*/32).bool(message.writable);
            if (message.size != null && Object.hasOwnProperty.call(message, "size"))
                $root.common.UInt64Value.encode(message.size, writer.uint32(/* id 5, wireType 2 =*/42).fork(), q + 1).ldelim();
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime"))
                $root.common.UInt64Value.encode(message.mtime, writer.uint32(/* id 6, wireType 2 =*/50).fork(), q + 1).ldelim();
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime"))
                $root.common.UInt64Value.encode(message.ctime, writer.uint32(/* id 7, wireType 2 =*/58).fork(), q + 1).ldelim();
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                $root.common.UInt64Value.encode(message.version, writer.uint32(/* id 8, wireType 2 =*/66).fork(), q + 1).ldelim();
            if (message.bytesNeedDownload != null && Object.hasOwnProperty.call(message, "bytesNeedDownload"))
                $root.common.UInt64Value.encode(message.bytesNeedDownload, writer.uint32(/* id 9, wireType 2 =*/74).fork(), q + 1).ldelim();
            if (message.versionSyncBranch != null && Object.hasOwnProperty.call(message, "versionSyncBranch"))
                $root.common.StringValue.encode(message.versionSyncBranch, writer.uint32(/* id 10, wireType 2 =*/82).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified StatsMsg message, length delimited. Does not implicitly {@link file.StatsMsg.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.StatsMsg
         * @static
         * @param {file.IStatsMsg} message StatsMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StatsMsg.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a StatsMsg message from the specified reader or buffer.
         * @function decode
         * @memberof file.StatsMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.StatsMsg} StatsMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StatsMsg.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.StatsMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.isFile = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.isFolder = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.isLink = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.writable = reader.bool();
                        break;
                    }
                case 5: {
                        message.size = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 6: {
                        message.mtime = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 7: {
                        message.ctime = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 8: {
                        message.version = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 9: {
                        message.bytesNeedDownload = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 10: {
                        message.versionSyncBranch = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a StatsMsg message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.StatsMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.StatsMsg} StatsMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StatsMsg.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a StatsMsg message.
         * @function verify
         * @memberof file.StatsMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        StatsMsg.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile")) {
                var error = $root.common.BooleanValue.verify(message.isFile, long + 1);
                if (error)
                    return "isFile." + error;
            }
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder")) {
                var error = $root.common.BooleanValue.verify(message.isFolder, long + 1);
                if (error)
                    return "isFolder." + error;
            }
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink")) {
                var error = $root.common.BooleanValue.verify(message.isLink, long + 1);
                if (error)
                    return "isLink." + error;
            }
            if (message.writable != null && Object.hasOwnProperty.call(message, "writable"))
                if (typeof message.writable !== "boolean")
                    return "writable: boolean expected";
            if (message.size != null && Object.hasOwnProperty.call(message, "size")) {
                var error = $root.common.UInt64Value.verify(message.size, long + 1);
                if (error)
                    return "size." + error;
            }
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime")) {
                var error = $root.common.UInt64Value.verify(message.mtime, long + 1);
                if (error)
                    return "mtime." + error;
            }
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime")) {
                var error = $root.common.UInt64Value.verify(message.ctime, long + 1);
                if (error)
                    return "ctime." + error;
            }
            if (message.version != null && Object.hasOwnProperty.call(message, "version")) {
                var error = $root.common.UInt64Value.verify(message.version, long + 1);
                if (error)
                    return "version." + error;
            }
            if (message.bytesNeedDownload != null && Object.hasOwnProperty.call(message, "bytesNeedDownload")) {
                var error = $root.common.UInt64Value.verify(message.bytesNeedDownload, long + 1);
                if (error)
                    return "bytesNeedDownload." + error;
            }
            if (message.versionSyncBranch != null && Object.hasOwnProperty.call(message, "versionSyncBranch")) {
                var error = $root.common.StringValue.verify(message.versionSyncBranch, long + 1);
                if (error)
                    return "versionSyncBranch." + error;
            }
            return null;
        };

        /**
         * Creates a StatsMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.StatsMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.StatsMsg} StatsMsg
         */
        StatsMsg.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.StatsMsg)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.StatsMsg: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.StatsMsg();
            if (object.isFile != null) {
                if (!$util.isObject(object.isFile))
                    throw TypeError(".file.StatsMsg.isFile: object expected");
                message.isFile = $root.common.BooleanValue.fromObject(object.isFile, long + 1);
            }
            if (object.isFolder != null) {
                if (!$util.isObject(object.isFolder))
                    throw TypeError(".file.StatsMsg.isFolder: object expected");
                message.isFolder = $root.common.BooleanValue.fromObject(object.isFolder, long + 1);
            }
            if (object.isLink != null) {
                if (!$util.isObject(object.isLink))
                    throw TypeError(".file.StatsMsg.isLink: object expected");
                message.isLink = $root.common.BooleanValue.fromObject(object.isLink, long + 1);
            }
            if (object.writable != null)
                message.writable = Boolean(object.writable);
            if (object.size != null) {
                if (!$util.isObject(object.size))
                    throw TypeError(".file.StatsMsg.size: object expected");
                message.size = $root.common.UInt64Value.fromObject(object.size, long + 1);
            }
            if (object.mtime != null) {
                if (!$util.isObject(object.mtime))
                    throw TypeError(".file.StatsMsg.mtime: object expected");
                message.mtime = $root.common.UInt64Value.fromObject(object.mtime, long + 1);
            }
            if (object.ctime != null) {
                if (!$util.isObject(object.ctime))
                    throw TypeError(".file.StatsMsg.ctime: object expected");
                message.ctime = $root.common.UInt64Value.fromObject(object.ctime, long + 1);
            }
            if (object.version != null) {
                if (!$util.isObject(object.version))
                    throw TypeError(".file.StatsMsg.version: object expected");
                message.version = $root.common.UInt64Value.fromObject(object.version, long + 1);
            }
            if (object.bytesNeedDownload != null) {
                if (!$util.isObject(object.bytesNeedDownload))
                    throw TypeError(".file.StatsMsg.bytesNeedDownload: object expected");
                message.bytesNeedDownload = $root.common.UInt64Value.fromObject(object.bytesNeedDownload, long + 1);
            }
            if (object.versionSyncBranch != null) {
                if (!$util.isObject(object.versionSyncBranch))
                    throw TypeError(".file.StatsMsg.versionSyncBranch: object expected");
                message.versionSyncBranch = $root.common.StringValue.fromObject(object.versionSyncBranch, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a StatsMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.StatsMsg
         * @static
         * @param {file.StatsMsg} message StatsMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        StatsMsg.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.isFile = null;
                object.isFolder = null;
                object.isLink = null;
                object.writable = false;
                object.size = null;
                object.mtime = null;
                object.ctime = null;
                object.version = null;
                object.bytesNeedDownload = null;
                object.versionSyncBranch = null;
            }
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                object.isFile = $root.common.BooleanValue.toObject(message.isFile, options, q + 1);
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                object.isFolder = $root.common.BooleanValue.toObject(message.isFolder, options, q + 1);
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink"))
                object.isLink = $root.common.BooleanValue.toObject(message.isLink, options, q + 1);
            if (message.writable != null && Object.hasOwnProperty.call(message, "writable"))
                object.writable = message.writable;
            if (message.size != null && Object.hasOwnProperty.call(message, "size"))
                object.size = $root.common.UInt64Value.toObject(message.size, options, q + 1);
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime"))
                object.mtime = $root.common.UInt64Value.toObject(message.mtime, options, q + 1);
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime"))
                object.ctime = $root.common.UInt64Value.toObject(message.ctime, options, q + 1);
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                object.version = $root.common.UInt64Value.toObject(message.version, options, q + 1);
            if (message.bytesNeedDownload != null && Object.hasOwnProperty.call(message, "bytesNeedDownload"))
                object.bytesNeedDownload = $root.common.UInt64Value.toObject(message.bytesNeedDownload, options, q + 1);
            if (message.versionSyncBranch != null && Object.hasOwnProperty.call(message, "versionSyncBranch"))
                object.versionSyncBranch = $root.common.StringValue.toObject(message.versionSyncBranch, options, q + 1);
            return object;
        };

        /**
         * Converts this StatsMsg to JSON.
         * @function toJSON
         * @memberof file.StatsMsg
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        StatsMsg.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for StatsMsg
         * @function getTypeUrl
         * @memberof file.StatsMsg
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        StatsMsg.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.StatsMsg";
        };

        return StatsMsg;
    })();

    file.GetXAttrRequestBody = (function() {

        /**
         * Properties of a GetXAttrRequestBody.
         * @memberof file
         * @interface IGetXAttrRequestBody
         * @property {string|null} [xaName] GetXAttrRequestBody xaName
         */

        /**
         * Constructs a new GetXAttrRequestBody.
         * @memberof file
         * @classdesc Represents a GetXAttrRequestBody.
         * @implements IGetXAttrRequestBody
         * @constructor
         * @param {file.IGetXAttrRequestBody=} [properties] Properties to set
         */
        function GetXAttrRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * GetXAttrRequestBody xaName.
         * @member {string} xaName
         * @memberof file.GetXAttrRequestBody
         * @instance
         */
        GetXAttrRequestBody.prototype.xaName = "";

        /**
         * Creates a new GetXAttrRequestBody instance using the specified properties.
         * @function create
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {file.IGetXAttrRequestBody=} [properties] Properties to set
         * @returns {file.GetXAttrRequestBody} GetXAttrRequestBody instance
         */
        GetXAttrRequestBody.create = function create(properties) {
            return new GetXAttrRequestBody(properties);
        };

        /**
         * Encodes the specified GetXAttrRequestBody message. Does not implicitly {@link file.GetXAttrRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {file.IGetXAttrRequestBody} message GetXAttrRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        GetXAttrRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.xaName);
            return writer;
        };

        /**
         * Encodes the specified GetXAttrRequestBody message, length delimited. Does not implicitly {@link file.GetXAttrRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {file.IGetXAttrRequestBody} message GetXAttrRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        GetXAttrRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a GetXAttrRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.GetXAttrRequestBody} GetXAttrRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        GetXAttrRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.GetXAttrRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.xaName = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a GetXAttrRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.GetXAttrRequestBody} GetXAttrRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        GetXAttrRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a GetXAttrRequestBody message.
         * @function verify
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        GetXAttrRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                if (!$util.isString(message.xaName))
                    return "xaName: string expected";
            return null;
        };

        /**
         * Creates a GetXAttrRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.GetXAttrRequestBody} GetXAttrRequestBody
         */
        GetXAttrRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.GetXAttrRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.GetXAttrRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.GetXAttrRequestBody();
            if (object.xaName != null)
                message.xaName = String(object.xaName);
            return message;
        };

        /**
         * Creates a plain object from a GetXAttrRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {file.GetXAttrRequestBody} message GetXAttrRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        GetXAttrRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.xaName = "";
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                object.xaName = message.xaName;
            return object;
        };

        /**
         * Converts this GetXAttrRequestBody to JSON.
         * @function toJSON
         * @memberof file.GetXAttrRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        GetXAttrRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for GetXAttrRequestBody
         * @function getTypeUrl
         * @memberof file.GetXAttrRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        GetXAttrRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.GetXAttrRequestBody";
        };

        return GetXAttrRequestBody;
    })();

    file.XAttrValue = (function() {

        /**
         * Properties of a XAttrValue.
         * @memberof file
         * @interface IXAttrValue
         * @property {common.IStringValue|null} [str] XAttrValue str
         * @property {common.IStringValue|null} [json] XAttrValue json
         * @property {common.IBytesValue|null} [bytes] XAttrValue bytes
         */

        /**
         * Constructs a new XAttrValue.
         * @memberof file
         * @classdesc Represents a XAttrValue.
         * @implements IXAttrValue
         * @constructor
         * @param {file.IXAttrValue=} [properties] Properties to set
         */
        function XAttrValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * XAttrValue str.
         * @member {common.IStringValue|null|undefined} str
         * @memberof file.XAttrValue
         * @instance
         */
        XAttrValue.prototype.str = null;

        /**
         * XAttrValue json.
         * @member {common.IStringValue|null|undefined} json
         * @memberof file.XAttrValue
         * @instance
         */
        XAttrValue.prototype.json = null;

        /**
         * XAttrValue bytes.
         * @member {common.IBytesValue|null|undefined} bytes
         * @memberof file.XAttrValue
         * @instance
         */
        XAttrValue.prototype.bytes = null;

        /**
         * Creates a new XAttrValue instance using the specified properties.
         * @function create
         * @memberof file.XAttrValue
         * @static
         * @param {file.IXAttrValue=} [properties] Properties to set
         * @returns {file.XAttrValue} XAttrValue instance
         */
        XAttrValue.create = function create(properties) {
            return new XAttrValue(properties);
        };

        /**
         * Encodes the specified XAttrValue message. Does not implicitly {@link file.XAttrValue.verify|verify} messages.
         * @function encode
         * @memberof file.XAttrValue
         * @static
         * @param {file.IXAttrValue} message XAttrValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        XAttrValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.str != null && Object.hasOwnProperty.call(message, "str"))
                $root.common.StringValue.encode(message.str, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified XAttrValue message, length delimited. Does not implicitly {@link file.XAttrValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.XAttrValue
         * @static
         * @param {file.IXAttrValue} message XAttrValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        XAttrValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a XAttrValue message from the specified reader or buffer.
         * @function decode
         * @memberof file.XAttrValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.XAttrValue} XAttrValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        XAttrValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.XAttrValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.str = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.json = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a XAttrValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.XAttrValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.XAttrValue} XAttrValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        XAttrValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a XAttrValue message.
         * @function verify
         * @memberof file.XAttrValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        XAttrValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.str != null && Object.hasOwnProperty.call(message, "str")) {
                var error = $root.common.StringValue.verify(message.str, long + 1);
                if (error)
                    return "str." + error;
            }
            if (message.json != null && Object.hasOwnProperty.call(message, "json")) {
                var error = $root.common.StringValue.verify(message.json, long + 1);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes, long + 1);
                if (error)
                    return "bytes." + error;
            }
            return null;
        };

        /**
         * Creates a XAttrValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.XAttrValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.XAttrValue} XAttrValue
         */
        XAttrValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.XAttrValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.XAttrValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.XAttrValue();
            if (object.str != null) {
                if (!$util.isObject(object.str))
                    throw TypeError(".file.XAttrValue.str: object expected");
                message.str = $root.common.StringValue.fromObject(object.str, long + 1);
            }
            if (object.json != null) {
                if (!$util.isObject(object.json))
                    throw TypeError(".file.XAttrValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json, long + 1);
            }
            if (object.bytes != null) {
                if (!$util.isObject(object.bytes))
                    throw TypeError(".file.XAttrValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a XAttrValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.XAttrValue
         * @static
         * @param {file.XAttrValue} message XAttrValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        XAttrValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.str = null;
                object.json = null;
                object.bytes = null;
            }
            if (message.str != null && Object.hasOwnProperty.call(message, "str"))
                object.str = $root.common.StringValue.toObject(message.str, options, q + 1);
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = $root.common.StringValue.toObject(message.json, options, q + 1);
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options, q + 1);
            return object;
        };

        /**
         * Converts this XAttrValue to JSON.
         * @function toJSON
         * @memberof file.XAttrValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        XAttrValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for XAttrValue
         * @function getTypeUrl
         * @memberof file.XAttrValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        XAttrValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.XAttrValue";
        };

        return XAttrValue;
    })();

    file.ReadBytesRequestBody = (function() {

        /**
         * Properties of a ReadBytesRequestBody.
         * @memberof file
         * @interface IReadBytesRequestBody
         * @property {common.IUInt64Value|null} [start] ReadBytesRequestBody start
         * @property {common.IUInt64Value|null} [end] ReadBytesRequestBody end
         */

        /**
         * Constructs a new ReadBytesRequestBody.
         * @memberof file
         * @classdesc Represents a ReadBytesRequestBody.
         * @implements IReadBytesRequestBody
         * @constructor
         * @param {file.IReadBytesRequestBody=} [properties] Properties to set
         */
        function ReadBytesRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ReadBytesRequestBody start.
         * @member {common.IUInt64Value|null|undefined} start
         * @memberof file.ReadBytesRequestBody
         * @instance
         */
        ReadBytesRequestBody.prototype.start = null;

        /**
         * ReadBytesRequestBody end.
         * @member {common.IUInt64Value|null|undefined} end
         * @memberof file.ReadBytesRequestBody
         * @instance
         */
        ReadBytesRequestBody.prototype.end = null;

        /**
         * Creates a new ReadBytesRequestBody instance using the specified properties.
         * @function create
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {file.IReadBytesRequestBody=} [properties] Properties to set
         * @returns {file.ReadBytesRequestBody} ReadBytesRequestBody instance
         */
        ReadBytesRequestBody.create = function create(properties) {
            return new ReadBytesRequestBody(properties);
        };

        /**
         * Encodes the specified ReadBytesRequestBody message. Does not implicitly {@link file.ReadBytesRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {file.IReadBytesRequestBody} message ReadBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ReadBytesRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                $root.common.UInt64Value.encode(message.start, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                $root.common.UInt64Value.encode(message.end, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified ReadBytesRequestBody message, length delimited. Does not implicitly {@link file.ReadBytesRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {file.IReadBytesRequestBody} message ReadBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ReadBytesRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a ReadBytesRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.ReadBytesRequestBody} ReadBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ReadBytesRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ReadBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.start = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.end = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a ReadBytesRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.ReadBytesRequestBody} ReadBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ReadBytesRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a ReadBytesRequestBody message.
         * @function verify
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ReadBytesRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.start != null && Object.hasOwnProperty.call(message, "start")) {
                var error = $root.common.UInt64Value.verify(message.start, long + 1);
                if (error)
                    return "start." + error;
            }
            if (message.end != null && Object.hasOwnProperty.call(message, "end")) {
                var error = $root.common.UInt64Value.verify(message.end, long + 1);
                if (error)
                    return "end." + error;
            }
            return null;
        };

        /**
         * Creates a ReadBytesRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.ReadBytesRequestBody} ReadBytesRequestBody
         */
        ReadBytesRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.ReadBytesRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.ReadBytesRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.ReadBytesRequestBody();
            if (object.start != null) {
                if (!$util.isObject(object.start))
                    throw TypeError(".file.ReadBytesRequestBody.start: object expected");
                message.start = $root.common.UInt64Value.fromObject(object.start, long + 1);
            }
            if (object.end != null) {
                if (!$util.isObject(object.end))
                    throw TypeError(".file.ReadBytesRequestBody.end: object expected");
                message.end = $root.common.UInt64Value.fromObject(object.end, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a ReadBytesRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {file.ReadBytesRequestBody} message ReadBytesRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ReadBytesRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.start = null;
                object.end = null;
            }
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                object.start = $root.common.UInt64Value.toObject(message.start, options, q + 1);
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                object.end = $root.common.UInt64Value.toObject(message.end, options, q + 1);
            return object;
        };

        /**
         * Converts this ReadBytesRequestBody to JSON.
         * @function toJSON
         * @memberof file.ReadBytesRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ReadBytesRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ReadBytesRequestBody
         * @function getTypeUrl
         * @memberof file.ReadBytesRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ReadBytesRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.ReadBytesRequestBody";
        };

        return ReadBytesRequestBody;
    })();

    file.ReadBytesReplyBody = (function() {

        /**
         * Properties of a ReadBytesReplyBody.
         * @memberof file
         * @interface IReadBytesReplyBody
         * @property {common.IBytesValue|null} [bytes] ReadBytesReplyBody bytes
         */

        /**
         * Constructs a new ReadBytesReplyBody.
         * @memberof file
         * @classdesc Represents a ReadBytesReplyBody.
         * @implements IReadBytesReplyBody
         * @constructor
         * @param {file.IReadBytesReplyBody=} [properties] Properties to set
         */
        function ReadBytesReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ReadBytesReplyBody bytes.
         * @member {common.IBytesValue|null|undefined} bytes
         * @memberof file.ReadBytesReplyBody
         * @instance
         */
        ReadBytesReplyBody.prototype.bytes = null;

        /**
         * Creates a new ReadBytesReplyBody instance using the specified properties.
         * @function create
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {file.IReadBytesReplyBody=} [properties] Properties to set
         * @returns {file.ReadBytesReplyBody} ReadBytesReplyBody instance
         */
        ReadBytesReplyBody.create = function create(properties) {
            return new ReadBytesReplyBody(properties);
        };

        /**
         * Encodes the specified ReadBytesReplyBody message. Does not implicitly {@link file.ReadBytesReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {file.IReadBytesReplyBody} message ReadBytesReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ReadBytesReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified ReadBytesReplyBody message, length delimited. Does not implicitly {@link file.ReadBytesReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {file.IReadBytesReplyBody} message ReadBytesReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ReadBytesReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a ReadBytesReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.ReadBytesReplyBody} ReadBytesReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ReadBytesReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ReadBytesReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a ReadBytesReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.ReadBytesReplyBody} ReadBytesReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ReadBytesReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a ReadBytesReplyBody message.
         * @function verify
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ReadBytesReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes, long + 1);
                if (error)
                    return "bytes." + error;
            }
            return null;
        };

        /**
         * Creates a ReadBytesReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.ReadBytesReplyBody} ReadBytesReplyBody
         */
        ReadBytesReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.ReadBytesReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.ReadBytesReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.ReadBytesReplyBody();
            if (object.bytes != null) {
                if (!$util.isObject(object.bytes))
                    throw TypeError(".file.ReadBytesReplyBody.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a ReadBytesReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {file.ReadBytesReplyBody} message ReadBytesReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ReadBytesReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.bytes = null;
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options, q + 1);
            return object;
        };

        /**
         * Converts this ReadBytesReplyBody to JSON.
         * @function toJSON
         * @memberof file.ReadBytesReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ReadBytesReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ReadBytesReplyBody
         * @function getTypeUrl
         * @memberof file.ReadBytesReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ReadBytesReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.ReadBytesReplyBody";
        };

        return ReadBytesReplyBody;
    })();

    file.VersionedReadFlags = (function() {

        /**
         * Properties of a VersionedReadFlags.
         * @memberof file
         * @interface IVersionedReadFlags
         * @property {common.IUInt64Value|null} [archivedVersion] VersionedReadFlags archivedVersion
         * @property {common.IUInt64Value|null} [remoteVersion] VersionedReadFlags remoteVersion
         */

        /**
         * Constructs a new VersionedReadFlags.
         * @memberof file
         * @classdesc Represents a VersionedReadFlags.
         * @implements IVersionedReadFlags
         * @constructor
         * @param {file.IVersionedReadFlags=} [properties] Properties to set
         */
        function VersionedReadFlags(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedReadFlags archivedVersion.
         * @member {common.IUInt64Value|null|undefined} archivedVersion
         * @memberof file.VersionedReadFlags
         * @instance
         */
        VersionedReadFlags.prototype.archivedVersion = null;

        /**
         * VersionedReadFlags remoteVersion.
         * @member {common.IUInt64Value|null|undefined} remoteVersion
         * @memberof file.VersionedReadFlags
         * @instance
         */
        VersionedReadFlags.prototype.remoteVersion = null;

        /**
         * Creates a new VersionedReadFlags instance using the specified properties.
         * @function create
         * @memberof file.VersionedReadFlags
         * @static
         * @param {file.IVersionedReadFlags=} [properties] Properties to set
         * @returns {file.VersionedReadFlags} VersionedReadFlags instance
         */
        VersionedReadFlags.create = function create(properties) {
            return new VersionedReadFlags(properties);
        };

        /**
         * Encodes the specified VersionedReadFlags message. Does not implicitly {@link file.VersionedReadFlags.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedReadFlags
         * @static
         * @param {file.IVersionedReadFlags} message VersionedReadFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadFlags.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.archivedVersion != null && Object.hasOwnProperty.call(message, "archivedVersion"))
                $root.common.UInt64Value.encode(message.archivedVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedReadFlags message, length delimited. Does not implicitly {@link file.VersionedReadFlags.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedReadFlags
         * @static
         * @param {file.IVersionedReadFlags} message VersionedReadFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadFlags.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedReadFlags message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedReadFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedReadFlags} VersionedReadFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadFlags.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.archivedVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedReadFlags message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedReadFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedReadFlags} VersionedReadFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadFlags.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedReadFlags message.
         * @function verify
         * @memberof file.VersionedReadFlags
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedReadFlags.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.archivedVersion != null && Object.hasOwnProperty.call(message, "archivedVersion")) {
                var error = $root.common.UInt64Value.verify(message.archivedVersion, long + 1);
                if (error)
                    return "archivedVersion." + error;
            }
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion, long + 1);
                if (error)
                    return "remoteVersion." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedReadFlags message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedReadFlags
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedReadFlags} VersionedReadFlags
         */
        VersionedReadFlags.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedReadFlags)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedReadFlags: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedReadFlags();
            if (object.archivedVersion != null) {
                if (!$util.isObject(object.archivedVersion))
                    throw TypeError(".file.VersionedReadFlags.archivedVersion: object expected");
                message.archivedVersion = $root.common.UInt64Value.fromObject(object.archivedVersion, long + 1);
            }
            if (object.remoteVersion != null) {
                if (!$util.isObject(object.remoteVersion))
                    throw TypeError(".file.VersionedReadFlags.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedReadFlags message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedReadFlags
         * @static
         * @param {file.VersionedReadFlags} message VersionedReadFlags
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedReadFlags.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.archivedVersion = null;
                object.remoteVersion = null;
            }
            if (message.archivedVersion != null && Object.hasOwnProperty.call(message, "archivedVersion"))
                object.archivedVersion = $root.common.UInt64Value.toObject(message.archivedVersion, options, q + 1);
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedReadFlags to JSON.
         * @function toJSON
         * @memberof file.VersionedReadFlags
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedReadFlags.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedReadFlags
         * @function getTypeUrl
         * @memberof file.VersionedReadFlags
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedReadFlags.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedReadFlags";
        };

        return VersionedReadFlags;
    })();

    file.RequestWithVersionedReadFlags = (function() {

        /**
         * Properties of a RequestWithVersionedReadFlags.
         * @memberof file
         * @interface IRequestWithVersionedReadFlags
         * @property {file.IVersionedReadFlags|null} [flags] RequestWithVersionedReadFlags flags
         */

        /**
         * Constructs a new RequestWithVersionedReadFlags.
         * @memberof file
         * @classdesc Represents a RequestWithVersionedReadFlags.
         * @implements IRequestWithVersionedReadFlags
         * @constructor
         * @param {file.IRequestWithVersionedReadFlags=} [properties] Properties to set
         */
        function RequestWithVersionedReadFlags(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * RequestWithVersionedReadFlags flags.
         * @member {file.IVersionedReadFlags|null|undefined} flags
         * @memberof file.RequestWithVersionedReadFlags
         * @instance
         */
        RequestWithVersionedReadFlags.prototype.flags = null;

        /**
         * Creates a new RequestWithVersionedReadFlags instance using the specified properties.
         * @function create
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {file.IRequestWithVersionedReadFlags=} [properties] Properties to set
         * @returns {file.RequestWithVersionedReadFlags} RequestWithVersionedReadFlags instance
         */
        RequestWithVersionedReadFlags.create = function create(properties) {
            return new RequestWithVersionedReadFlags(properties);
        };

        /**
         * Encodes the specified RequestWithVersionedReadFlags message. Does not implicitly {@link file.RequestWithVersionedReadFlags.verify|verify} messages.
         * @function encode
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {file.IRequestWithVersionedReadFlags} message RequestWithVersionedReadFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        RequestWithVersionedReadFlags.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified RequestWithVersionedReadFlags message, length delimited. Does not implicitly {@link file.RequestWithVersionedReadFlags.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {file.IRequestWithVersionedReadFlags} message RequestWithVersionedReadFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        RequestWithVersionedReadFlags.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a RequestWithVersionedReadFlags message from the specified reader or buffer.
         * @function decode
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.RequestWithVersionedReadFlags} RequestWithVersionedReadFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        RequestWithVersionedReadFlags.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.RequestWithVersionedReadFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a RequestWithVersionedReadFlags message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.RequestWithVersionedReadFlags} RequestWithVersionedReadFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        RequestWithVersionedReadFlags.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a RequestWithVersionedReadFlags message.
         * @function verify
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        RequestWithVersionedReadFlags.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a RequestWithVersionedReadFlags message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.RequestWithVersionedReadFlags} RequestWithVersionedReadFlags
         */
        RequestWithVersionedReadFlags.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.RequestWithVersionedReadFlags)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.RequestWithVersionedReadFlags: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.RequestWithVersionedReadFlags();
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".file.RequestWithVersionedReadFlags.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a RequestWithVersionedReadFlags message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {file.RequestWithVersionedReadFlags} message RequestWithVersionedReadFlags
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        RequestWithVersionedReadFlags.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.flags = null;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this RequestWithVersionedReadFlags to JSON.
         * @function toJSON
         * @memberof file.RequestWithVersionedReadFlags
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        RequestWithVersionedReadFlags.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for RequestWithVersionedReadFlags
         * @function getTypeUrl
         * @memberof file.RequestWithVersionedReadFlags
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        RequestWithVersionedReadFlags.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.RequestWithVersionedReadFlags";
        };

        return RequestWithVersionedReadFlags;
    })();

    file.VersionedGetXAttrRequestBody = (function() {

        /**
         * Properties of a VersionedGetXAttrRequestBody.
         * @memberof file
         * @interface IVersionedGetXAttrRequestBody
         * @property {string|null} [xaName] VersionedGetXAttrRequestBody xaName
         * @property {file.IVersionedReadFlags|null} [flags] VersionedGetXAttrRequestBody flags
         */

        /**
         * Constructs a new VersionedGetXAttrRequestBody.
         * @memberof file
         * @classdesc Represents a VersionedGetXAttrRequestBody.
         * @implements IVersionedGetXAttrRequestBody
         * @constructor
         * @param {file.IVersionedGetXAttrRequestBody=} [properties] Properties to set
         */
        function VersionedGetXAttrRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedGetXAttrRequestBody xaName.
         * @member {string} xaName
         * @memberof file.VersionedGetXAttrRequestBody
         * @instance
         */
        VersionedGetXAttrRequestBody.prototype.xaName = "";

        /**
         * VersionedGetXAttrRequestBody flags.
         * @member {file.IVersionedReadFlags|null|undefined} flags
         * @memberof file.VersionedGetXAttrRequestBody
         * @instance
         */
        VersionedGetXAttrRequestBody.prototype.flags = null;

        /**
         * Creates a new VersionedGetXAttrRequestBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {file.IVersionedGetXAttrRequestBody=} [properties] Properties to set
         * @returns {file.VersionedGetXAttrRequestBody} VersionedGetXAttrRequestBody instance
         */
        VersionedGetXAttrRequestBody.create = function create(properties) {
            return new VersionedGetXAttrRequestBody(properties);
        };

        /**
         * Encodes the specified VersionedGetXAttrRequestBody message. Does not implicitly {@link file.VersionedGetXAttrRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {file.IVersionedGetXAttrRequestBody} message VersionedGetXAttrRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetXAttrRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.xaName);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedGetXAttrRequestBody message, length delimited. Does not implicitly {@link file.VersionedGetXAttrRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {file.IVersionedGetXAttrRequestBody} message VersionedGetXAttrRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetXAttrRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedGetXAttrRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedGetXAttrRequestBody} VersionedGetXAttrRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetXAttrRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetXAttrRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.xaName = reader.string();
                        break;
                    }
                case 2: {
                        message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedGetXAttrRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedGetXAttrRequestBody} VersionedGetXAttrRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetXAttrRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedGetXAttrRequestBody message.
         * @function verify
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedGetXAttrRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                if (!$util.isString(message.xaName))
                    return "xaName: string expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedGetXAttrRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedGetXAttrRequestBody} VersionedGetXAttrRequestBody
         */
        VersionedGetXAttrRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedGetXAttrRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedGetXAttrRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedGetXAttrRequestBody();
            if (object.xaName != null)
                message.xaName = String(object.xaName);
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".file.VersionedGetXAttrRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedGetXAttrRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {file.VersionedGetXAttrRequestBody} message VersionedGetXAttrRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedGetXAttrRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.xaName = "";
                object.flags = null;
            }
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                object.xaName = message.xaName;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedGetXAttrRequestBody to JSON.
         * @function toJSON
         * @memberof file.VersionedGetXAttrRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedGetXAttrRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedGetXAttrRequestBody
         * @function getTypeUrl
         * @memberof file.VersionedGetXAttrRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedGetXAttrRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedGetXAttrRequestBody";
        };

        return VersionedGetXAttrRequestBody;
    })();

    file.VersionedGetXAttrReplyBody = (function() {

        /**
         * Properties of a VersionedGetXAttrReplyBody.
         * @memberof file
         * @interface IVersionedGetXAttrReplyBody
         * @property {number|Long|null} [version] VersionedGetXAttrReplyBody version
         * @property {common.IStringValue|null} [str] VersionedGetXAttrReplyBody str
         * @property {common.IStringValue|null} [json] VersionedGetXAttrReplyBody json
         * @property {common.IBytesValue|null} [bytes] VersionedGetXAttrReplyBody bytes
         */

        /**
         * Constructs a new VersionedGetXAttrReplyBody.
         * @memberof file
         * @classdesc Represents a VersionedGetXAttrReplyBody.
         * @implements IVersionedGetXAttrReplyBody
         * @constructor
         * @param {file.IVersionedGetXAttrReplyBody=} [properties] Properties to set
         */
        function VersionedGetXAttrReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedGetXAttrReplyBody version.
         * @member {number|Long} version
         * @memberof file.VersionedGetXAttrReplyBody
         * @instance
         */
        VersionedGetXAttrReplyBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * VersionedGetXAttrReplyBody str.
         * @member {common.IStringValue|null|undefined} str
         * @memberof file.VersionedGetXAttrReplyBody
         * @instance
         */
        VersionedGetXAttrReplyBody.prototype.str = null;

        /**
         * VersionedGetXAttrReplyBody json.
         * @member {common.IStringValue|null|undefined} json
         * @memberof file.VersionedGetXAttrReplyBody
         * @instance
         */
        VersionedGetXAttrReplyBody.prototype.json = null;

        /**
         * VersionedGetXAttrReplyBody bytes.
         * @member {common.IBytesValue|null|undefined} bytes
         * @memberof file.VersionedGetXAttrReplyBody
         * @instance
         */
        VersionedGetXAttrReplyBody.prototype.bytes = null;

        /**
         * Creates a new VersionedGetXAttrReplyBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {file.IVersionedGetXAttrReplyBody=} [properties] Properties to set
         * @returns {file.VersionedGetXAttrReplyBody} VersionedGetXAttrReplyBody instance
         */
        VersionedGetXAttrReplyBody.create = function create(properties) {
            return new VersionedGetXAttrReplyBody(properties);
        };

        /**
         * Encodes the specified VersionedGetXAttrReplyBody message. Does not implicitly {@link file.VersionedGetXAttrReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {file.IVersionedGetXAttrReplyBody} message VersionedGetXAttrReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetXAttrReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            if (message.str != null && Object.hasOwnProperty.call(message, "str"))
                $root.common.StringValue.encode(message.str, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedGetXAttrReplyBody message, length delimited. Does not implicitly {@link file.VersionedGetXAttrReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {file.IVersionedGetXAttrReplyBody} message VersionedGetXAttrReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetXAttrReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedGetXAttrReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedGetXAttrReplyBody} VersionedGetXAttrReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetXAttrReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetXAttrReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.str = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.json = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedGetXAttrReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedGetXAttrReplyBody} VersionedGetXAttrReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetXAttrReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedGetXAttrReplyBody message.
         * @function verify
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedGetXAttrReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            if (message.str != null && Object.hasOwnProperty.call(message, "str")) {
                var error = $root.common.StringValue.verify(message.str, long + 1);
                if (error)
                    return "str." + error;
            }
            if (message.json != null && Object.hasOwnProperty.call(message, "json")) {
                var error = $root.common.StringValue.verify(message.json, long + 1);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes, long + 1);
                if (error)
                    return "bytes." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedGetXAttrReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedGetXAttrReplyBody} VersionedGetXAttrReplyBody
         */
        VersionedGetXAttrReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedGetXAttrReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedGetXAttrReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedGetXAttrReplyBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            if (object.str != null) {
                if (!$util.isObject(object.str))
                    throw TypeError(".file.VersionedGetXAttrReplyBody.str: object expected");
                message.str = $root.common.StringValue.fromObject(object.str, long + 1);
            }
            if (object.json != null) {
                if (!$util.isObject(object.json))
                    throw TypeError(".file.VersionedGetXAttrReplyBody.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json, long + 1);
            }
            if (object.bytes != null) {
                if (!$util.isObject(object.bytes))
                    throw TypeError(".file.VersionedGetXAttrReplyBody.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedGetXAttrReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {file.VersionedGetXAttrReplyBody} message VersionedGetXAttrReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedGetXAttrReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.str = null;
                object.json = null;
                object.bytes = null;
            }
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            if (message.str != null && Object.hasOwnProperty.call(message, "str"))
                object.str = $root.common.StringValue.toObject(message.str, options, q + 1);
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = $root.common.StringValue.toObject(message.json, options, q + 1);
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedGetXAttrReplyBody to JSON.
         * @function toJSON
         * @memberof file.VersionedGetXAttrReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedGetXAttrReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedGetXAttrReplyBody
         * @function getTypeUrl
         * @memberof file.VersionedGetXAttrReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedGetXAttrReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedGetXAttrReplyBody";
        };

        return VersionedGetXAttrReplyBody;
    })();

    file.VersionedListXAttrsReplyBody = (function() {

        /**
         * Properties of a VersionedListXAttrsReplyBody.
         * @memberof file
         * @interface IVersionedListXAttrsReplyBody
         * @property {number|Long|null} [version] VersionedListXAttrsReplyBody version
         * @property {Array.<string>|null} [xaNames] VersionedListXAttrsReplyBody xaNames
         */

        /**
         * Constructs a new VersionedListXAttrsReplyBody.
         * @memberof file
         * @classdesc Represents a VersionedListXAttrsReplyBody.
         * @implements IVersionedListXAttrsReplyBody
         * @constructor
         * @param {file.IVersionedListXAttrsReplyBody=} [properties] Properties to set
         */
        function VersionedListXAttrsReplyBody(properties) {
            this.xaNames = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedListXAttrsReplyBody version.
         * @member {number|Long} version
         * @memberof file.VersionedListXAttrsReplyBody
         * @instance
         */
        VersionedListXAttrsReplyBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * VersionedListXAttrsReplyBody xaNames.
         * @member {Array.<string>} xaNames
         * @memberof file.VersionedListXAttrsReplyBody
         * @instance
         */
        VersionedListXAttrsReplyBody.prototype.xaNames = $util.emptyArray;

        /**
         * Creates a new VersionedListXAttrsReplyBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {file.IVersionedListXAttrsReplyBody=} [properties] Properties to set
         * @returns {file.VersionedListXAttrsReplyBody} VersionedListXAttrsReplyBody instance
         */
        VersionedListXAttrsReplyBody.create = function create(properties) {
            return new VersionedListXAttrsReplyBody(properties);
        };

        /**
         * Encodes the specified VersionedListXAttrsReplyBody message. Does not implicitly {@link file.VersionedListXAttrsReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {file.IVersionedListXAttrsReplyBody} message VersionedListXAttrsReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedListXAttrsReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            if (message.xaNames != null && message.xaNames.length)
                for (var i = 0; i < message.xaNames.length; ++i)
                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.xaNames[i]);
            return writer;
        };

        /**
         * Encodes the specified VersionedListXAttrsReplyBody message, length delimited. Does not implicitly {@link file.VersionedListXAttrsReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {file.IVersionedListXAttrsReplyBody} message VersionedListXAttrsReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedListXAttrsReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedListXAttrsReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedListXAttrsReplyBody} VersionedListXAttrsReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedListXAttrsReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedListXAttrsReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        if (!(message.xaNames && message.xaNames.length))
                            message.xaNames = [];
                        message.xaNames.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedListXAttrsReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedListXAttrsReplyBody} VersionedListXAttrsReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedListXAttrsReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedListXAttrsReplyBody message.
         * @function verify
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedListXAttrsReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            if (message.xaNames != null && Object.hasOwnProperty.call(message, "xaNames")) {
                if (!Array.isArray(message.xaNames))
                    return "xaNames: array expected";
                for (var i = 0; i < message.xaNames.length; ++i)
                    if (!$util.isString(message.xaNames[i]))
                        return "xaNames: string[] expected";
            }
            return null;
        };

        /**
         * Creates a VersionedListXAttrsReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedListXAttrsReplyBody} VersionedListXAttrsReplyBody
         */
        VersionedListXAttrsReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedListXAttrsReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedListXAttrsReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedListXAttrsReplyBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            if (object.xaNames) {
                if (!Array.isArray(object.xaNames))
                    throw TypeError(".file.VersionedListXAttrsReplyBody.xaNames: array expected");
                message.xaNames = [];
                for (var i = 0; i < object.xaNames.length; ++i)
                    message.xaNames[i] = String(object.xaNames[i]);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedListXAttrsReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {file.VersionedListXAttrsReplyBody} message VersionedListXAttrsReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedListXAttrsReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.xaNames = [];
            if (options.defaults)
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            if (message.xaNames && message.xaNames.length) {
                object.xaNames = [];
                for (var j = 0; j < message.xaNames.length; ++j)
                    object.xaNames[j] = message.xaNames[j];
            }
            return object;
        };

        /**
         * Converts this VersionedListXAttrsReplyBody to JSON.
         * @function toJSON
         * @memberof file.VersionedListXAttrsReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedListXAttrsReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedListXAttrsReplyBody
         * @function getTypeUrl
         * @memberof file.VersionedListXAttrsReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedListXAttrsReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedListXAttrsReplyBody";
        };

        return VersionedListXAttrsReplyBody;
    })();

    file.VersionedReadBytesRequestBody = (function() {

        /**
         * Properties of a VersionedReadBytesRequestBody.
         * @memberof file
         * @interface IVersionedReadBytesRequestBody
         * @property {common.IUInt64Value|null} [start] VersionedReadBytesRequestBody start
         * @property {common.IUInt64Value|null} [end] VersionedReadBytesRequestBody end
         * @property {file.IVersionedReadFlags|null} [flags] VersionedReadBytesRequestBody flags
         */

        /**
         * Constructs a new VersionedReadBytesRequestBody.
         * @memberof file
         * @classdesc Represents a VersionedReadBytesRequestBody.
         * @implements IVersionedReadBytesRequestBody
         * @constructor
         * @param {file.IVersionedReadBytesRequestBody=} [properties] Properties to set
         */
        function VersionedReadBytesRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedReadBytesRequestBody start.
         * @member {common.IUInt64Value|null|undefined} start
         * @memberof file.VersionedReadBytesRequestBody
         * @instance
         */
        VersionedReadBytesRequestBody.prototype.start = null;

        /**
         * VersionedReadBytesRequestBody end.
         * @member {common.IUInt64Value|null|undefined} end
         * @memberof file.VersionedReadBytesRequestBody
         * @instance
         */
        VersionedReadBytesRequestBody.prototype.end = null;

        /**
         * VersionedReadBytesRequestBody flags.
         * @member {file.IVersionedReadFlags|null|undefined} flags
         * @memberof file.VersionedReadBytesRequestBody
         * @instance
         */
        VersionedReadBytesRequestBody.prototype.flags = null;

        /**
         * Creates a new VersionedReadBytesRequestBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {file.IVersionedReadBytesRequestBody=} [properties] Properties to set
         * @returns {file.VersionedReadBytesRequestBody} VersionedReadBytesRequestBody instance
         */
        VersionedReadBytesRequestBody.create = function create(properties) {
            return new VersionedReadBytesRequestBody(properties);
        };

        /**
         * Encodes the specified VersionedReadBytesRequestBody message. Does not implicitly {@link file.VersionedReadBytesRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {file.IVersionedReadBytesRequestBody} message VersionedReadBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadBytesRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                $root.common.UInt64Value.encode(message.start, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                $root.common.UInt64Value.encode(message.end, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 10, wireType 2 =*/82).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedReadBytesRequestBody message, length delimited. Does not implicitly {@link file.VersionedReadBytesRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {file.IVersionedReadBytesRequestBody} message VersionedReadBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadBytesRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedReadBytesRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedReadBytesRequestBody} VersionedReadBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadBytesRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.start = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.end = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 10: {
                        message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedReadBytesRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedReadBytesRequestBody} VersionedReadBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadBytesRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedReadBytesRequestBody message.
         * @function verify
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedReadBytesRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.start != null && Object.hasOwnProperty.call(message, "start")) {
                var error = $root.common.UInt64Value.verify(message.start, long + 1);
                if (error)
                    return "start." + error;
            }
            if (message.end != null && Object.hasOwnProperty.call(message, "end")) {
                var error = $root.common.UInt64Value.verify(message.end, long + 1);
                if (error)
                    return "end." + error;
            }
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedReadBytesRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedReadBytesRequestBody} VersionedReadBytesRequestBody
         */
        VersionedReadBytesRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedReadBytesRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedReadBytesRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedReadBytesRequestBody();
            if (object.start != null) {
                if (!$util.isObject(object.start))
                    throw TypeError(".file.VersionedReadBytesRequestBody.start: object expected");
                message.start = $root.common.UInt64Value.fromObject(object.start, long + 1);
            }
            if (object.end != null) {
                if (!$util.isObject(object.end))
                    throw TypeError(".file.VersionedReadBytesRequestBody.end: object expected");
                message.end = $root.common.UInt64Value.fromObject(object.end, long + 1);
            }
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".file.VersionedReadBytesRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedReadBytesRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {file.VersionedReadBytesRequestBody} message VersionedReadBytesRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedReadBytesRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.start = null;
                object.end = null;
                object.flags = null;
            }
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                object.start = $root.common.UInt64Value.toObject(message.start, options, q + 1);
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                object.end = $root.common.UInt64Value.toObject(message.end, options, q + 1);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedReadBytesRequestBody to JSON.
         * @function toJSON
         * @memberof file.VersionedReadBytesRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedReadBytesRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedReadBytesRequestBody
         * @function getTypeUrl
         * @memberof file.VersionedReadBytesRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedReadBytesRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedReadBytesRequestBody";
        };

        return VersionedReadBytesRequestBody;
    })();

    file.VersionedReadBytesReplyBody = (function() {

        /**
         * Properties of a VersionedReadBytesReplyBody.
         * @memberof file
         * @interface IVersionedReadBytesReplyBody
         * @property {number|Long|null} [version] VersionedReadBytesReplyBody version
         * @property {common.IBytesValue|null} [bytes] VersionedReadBytesReplyBody bytes
         */

        /**
         * Constructs a new VersionedReadBytesReplyBody.
         * @memberof file
         * @classdesc Represents a VersionedReadBytesReplyBody.
         * @implements IVersionedReadBytesReplyBody
         * @constructor
         * @param {file.IVersionedReadBytesReplyBody=} [properties] Properties to set
         */
        function VersionedReadBytesReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedReadBytesReplyBody version.
         * @member {number|Long} version
         * @memberof file.VersionedReadBytesReplyBody
         * @instance
         */
        VersionedReadBytesReplyBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * VersionedReadBytesReplyBody bytes.
         * @member {common.IBytesValue|null|undefined} bytes
         * @memberof file.VersionedReadBytesReplyBody
         * @instance
         */
        VersionedReadBytesReplyBody.prototype.bytes = null;

        /**
         * Creates a new VersionedReadBytesReplyBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {file.IVersionedReadBytesReplyBody=} [properties] Properties to set
         * @returns {file.VersionedReadBytesReplyBody} VersionedReadBytesReplyBody instance
         */
        VersionedReadBytesReplyBody.create = function create(properties) {
            return new VersionedReadBytesReplyBody(properties);
        };

        /**
         * Encodes the specified VersionedReadBytesReplyBody message. Does not implicitly {@link file.VersionedReadBytesReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {file.IVersionedReadBytesReplyBody} message VersionedReadBytesReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadBytesReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedReadBytesReplyBody message, length delimited. Does not implicitly {@link file.VersionedReadBytesReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {file.IVersionedReadBytesReplyBody} message VersionedReadBytesReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadBytesReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedReadBytesReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedReadBytesReplyBody} VersionedReadBytesReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadBytesReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadBytesReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedReadBytesReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedReadBytesReplyBody} VersionedReadBytesReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadBytesReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedReadBytesReplyBody message.
         * @function verify
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedReadBytesReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes, long + 1);
                if (error)
                    return "bytes." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedReadBytesReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedReadBytesReplyBody} VersionedReadBytesReplyBody
         */
        VersionedReadBytesReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedReadBytesReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedReadBytesReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedReadBytesReplyBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            if (object.bytes != null) {
                if (!$util.isObject(object.bytes))
                    throw TypeError(".file.VersionedReadBytesReplyBody.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedReadBytesReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {file.VersionedReadBytesReplyBody} message VersionedReadBytesReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedReadBytesReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.bytes = null;
            }
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedReadBytesReplyBody to JSON.
         * @function toJSON
         * @memberof file.VersionedReadBytesReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedReadBytesReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedReadBytesReplyBody
         * @function getTypeUrl
         * @memberof file.VersionedReadBytesReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedReadBytesReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedReadBytesReplyBody";
        };

        return VersionedReadBytesReplyBody;
    })();

    file.VersionedReadTxtReplyBody = (function() {

        /**
         * Properties of a VersionedReadTxtReplyBody.
         * @memberof file
         * @interface IVersionedReadTxtReplyBody
         * @property {number|Long|null} [version] VersionedReadTxtReplyBody version
         * @property {string|null} [txt] VersionedReadTxtReplyBody txt
         */

        /**
         * Constructs a new VersionedReadTxtReplyBody.
         * @memberof file
         * @classdesc Represents a VersionedReadTxtReplyBody.
         * @implements IVersionedReadTxtReplyBody
         * @constructor
         * @param {file.IVersionedReadTxtReplyBody=} [properties] Properties to set
         */
        function VersionedReadTxtReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedReadTxtReplyBody version.
         * @member {number|Long} version
         * @memberof file.VersionedReadTxtReplyBody
         * @instance
         */
        VersionedReadTxtReplyBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * VersionedReadTxtReplyBody txt.
         * @member {string} txt
         * @memberof file.VersionedReadTxtReplyBody
         * @instance
         */
        VersionedReadTxtReplyBody.prototype.txt = "";

        /**
         * Creates a new VersionedReadTxtReplyBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {file.IVersionedReadTxtReplyBody=} [properties] Properties to set
         * @returns {file.VersionedReadTxtReplyBody} VersionedReadTxtReplyBody instance
         */
        VersionedReadTxtReplyBody.create = function create(properties) {
            return new VersionedReadTxtReplyBody(properties);
        };

        /**
         * Encodes the specified VersionedReadTxtReplyBody message. Does not implicitly {@link file.VersionedReadTxtReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {file.IVersionedReadTxtReplyBody} message VersionedReadTxtReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadTxtReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.txt);
            return writer;
        };

        /**
         * Encodes the specified VersionedReadTxtReplyBody message, length delimited. Does not implicitly {@link file.VersionedReadTxtReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {file.IVersionedReadTxtReplyBody} message VersionedReadTxtReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadTxtReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedReadTxtReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedReadTxtReplyBody} VersionedReadTxtReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadTxtReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadTxtReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.txt = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedReadTxtReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedReadTxtReplyBody} VersionedReadTxtReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadTxtReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedReadTxtReplyBody message.
         * @function verify
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedReadTxtReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                if (!$util.isString(message.txt))
                    return "txt: string expected";
            return null;
        };

        /**
         * Creates a VersionedReadTxtReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedReadTxtReplyBody} VersionedReadTxtReplyBody
         */
        VersionedReadTxtReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedReadTxtReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedReadTxtReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedReadTxtReplyBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            if (object.txt != null)
                message.txt = String(object.txt);
            return message;
        };

        /**
         * Creates a plain object from a VersionedReadTxtReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {file.VersionedReadTxtReplyBody} message VersionedReadTxtReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedReadTxtReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.txt = "";
            }
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                object.txt = message.txt;
            return object;
        };

        /**
         * Converts this VersionedReadTxtReplyBody to JSON.
         * @function toJSON
         * @memberof file.VersionedReadTxtReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedReadTxtReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedReadTxtReplyBody
         * @function getTypeUrl
         * @memberof file.VersionedReadTxtReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedReadTxtReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedReadTxtReplyBody";
        };

        return VersionedReadTxtReplyBody;
    })();

    file.VersionedReadJsonReplyBody = (function() {

        /**
         * Properties of a VersionedReadJsonReplyBody.
         * @memberof file
         * @interface IVersionedReadJsonReplyBody
         * @property {number|Long|null} [version] VersionedReadJsonReplyBody version
         * @property {string|null} [json] VersionedReadJsonReplyBody json
         */

        /**
         * Constructs a new VersionedReadJsonReplyBody.
         * @memberof file
         * @classdesc Represents a VersionedReadJsonReplyBody.
         * @implements IVersionedReadJsonReplyBody
         * @constructor
         * @param {file.IVersionedReadJsonReplyBody=} [properties] Properties to set
         */
        function VersionedReadJsonReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedReadJsonReplyBody version.
         * @member {number|Long} version
         * @memberof file.VersionedReadJsonReplyBody
         * @instance
         */
        VersionedReadJsonReplyBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * VersionedReadJsonReplyBody json.
         * @member {string} json
         * @memberof file.VersionedReadJsonReplyBody
         * @instance
         */
        VersionedReadJsonReplyBody.prototype.json = "";

        /**
         * Creates a new VersionedReadJsonReplyBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {file.IVersionedReadJsonReplyBody=} [properties] Properties to set
         * @returns {file.VersionedReadJsonReplyBody} VersionedReadJsonReplyBody instance
         */
        VersionedReadJsonReplyBody.create = function create(properties) {
            return new VersionedReadJsonReplyBody(properties);
        };

        /**
         * Encodes the specified VersionedReadJsonReplyBody message. Does not implicitly {@link file.VersionedReadJsonReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {file.IVersionedReadJsonReplyBody} message VersionedReadJsonReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadJsonReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.json);
            return writer;
        };

        /**
         * Encodes the specified VersionedReadJsonReplyBody message, length delimited. Does not implicitly {@link file.VersionedReadJsonReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {file.IVersionedReadJsonReplyBody} message VersionedReadJsonReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadJsonReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedReadJsonReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedReadJsonReplyBody} VersionedReadJsonReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadJsonReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedReadJsonReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.json = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedReadJsonReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedReadJsonReplyBody} VersionedReadJsonReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadJsonReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedReadJsonReplyBody message.
         * @function verify
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedReadJsonReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                if (!$util.isString(message.json))
                    return "json: string expected";
            return null;
        };

        /**
         * Creates a VersionedReadJsonReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedReadJsonReplyBody} VersionedReadJsonReplyBody
         */
        VersionedReadJsonReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedReadJsonReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedReadJsonReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedReadJsonReplyBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            if (object.json != null)
                message.json = String(object.json);
            return message;
        };

        /**
         * Creates a plain object from a VersionedReadJsonReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {file.VersionedReadJsonReplyBody} message VersionedReadJsonReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedReadJsonReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.json = "";
            }
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = message.json;
            return object;
        };

        /**
         * Converts this VersionedReadJsonReplyBody to JSON.
         * @function toJSON
         * @memberof file.VersionedReadJsonReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedReadJsonReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedReadJsonReplyBody
         * @function getTypeUrl
         * @memberof file.VersionedReadJsonReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedReadJsonReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedReadJsonReplyBody";
        };

        return VersionedReadJsonReplyBody;
    })();

    file.VersionedGetByteSourceReplyBody = (function() {

        /**
         * Properties of a VersionedGetByteSourceReplyBody.
         * @memberof file
         * @interface IVersionedGetByteSourceReplyBody
         * @property {number|Long|null} [version] VersionedGetByteSourceReplyBody version
         * @property {common.IObjectReference|null} [src] VersionedGetByteSourceReplyBody src
         */

        /**
         * Constructs a new VersionedGetByteSourceReplyBody.
         * @memberof file
         * @classdesc Represents a VersionedGetByteSourceReplyBody.
         * @implements IVersionedGetByteSourceReplyBody
         * @constructor
         * @param {file.IVersionedGetByteSourceReplyBody=} [properties] Properties to set
         */
        function VersionedGetByteSourceReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedGetByteSourceReplyBody version.
         * @member {number|Long} version
         * @memberof file.VersionedGetByteSourceReplyBody
         * @instance
         */
        VersionedGetByteSourceReplyBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * VersionedGetByteSourceReplyBody src.
         * @member {common.IObjectReference|null|undefined} src
         * @memberof file.VersionedGetByteSourceReplyBody
         * @instance
         */
        VersionedGetByteSourceReplyBody.prototype.src = null;

        /**
         * Creates a new VersionedGetByteSourceReplyBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {file.IVersionedGetByteSourceReplyBody=} [properties] Properties to set
         * @returns {file.VersionedGetByteSourceReplyBody} VersionedGetByteSourceReplyBody instance
         */
        VersionedGetByteSourceReplyBody.create = function create(properties) {
            return new VersionedGetByteSourceReplyBody(properties);
        };

        /**
         * Encodes the specified VersionedGetByteSourceReplyBody message. Does not implicitly {@link file.VersionedGetByteSourceReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {file.IVersionedGetByteSourceReplyBody} message VersionedGetByteSourceReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetByteSourceReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                $root.common.ObjectReference.encode(message.src, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedGetByteSourceReplyBody message, length delimited. Does not implicitly {@link file.VersionedGetByteSourceReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {file.IVersionedGetByteSourceReplyBody} message VersionedGetByteSourceReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetByteSourceReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedGetByteSourceReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedGetByteSourceReplyBody} VersionedGetByteSourceReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetByteSourceReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetByteSourceReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.src = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedGetByteSourceReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedGetByteSourceReplyBody} VersionedGetByteSourceReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetByteSourceReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedGetByteSourceReplyBody message.
         * @function verify
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedGetByteSourceReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            if (message.src != null && Object.hasOwnProperty.call(message, "src")) {
                var error = $root.common.ObjectReference.verify(message.src, long + 1);
                if (error)
                    return "src." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedGetByteSourceReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedGetByteSourceReplyBody} VersionedGetByteSourceReplyBody
         */
        VersionedGetByteSourceReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedGetByteSourceReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedGetByteSourceReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedGetByteSourceReplyBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            if (object.src != null) {
                if (!$util.isObject(object.src))
                    throw TypeError(".file.VersionedGetByteSourceReplyBody.src: object expected");
                message.src = $root.common.ObjectReference.fromObject(object.src, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedGetByteSourceReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {file.VersionedGetByteSourceReplyBody} message VersionedGetByteSourceReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedGetByteSourceReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.src = null;
            }
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                object.src = $root.common.ObjectReference.toObject(message.src, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedGetByteSourceReplyBody to JSON.
         * @function toJSON
         * @memberof file.VersionedGetByteSourceReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedGetByteSourceReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedGetByteSourceReplyBody
         * @function getTypeUrl
         * @memberof file.VersionedGetByteSourceReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedGetByteSourceReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedGetByteSourceReplyBody";
        };

        return VersionedGetByteSourceReplyBody;
    })();

    file.ListVersionsReplyBody = (function() {

        /**
         * Properties of a ListVersionsReplyBody.
         * @memberof file
         * @interface IListVersionsReplyBody
         * @property {common.IUInt64Value|null} [current] ListVersionsReplyBody current
         * @property {Array.<number|Long>|null} [archived] ListVersionsReplyBody archived
         */

        /**
         * Constructs a new ListVersionsReplyBody.
         * @memberof file
         * @classdesc Represents a ListVersionsReplyBody.
         * @implements IListVersionsReplyBody
         * @constructor
         * @param {file.IListVersionsReplyBody=} [properties] Properties to set
         */
        function ListVersionsReplyBody(properties) {
            this.archived = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ListVersionsReplyBody current.
         * @member {common.IUInt64Value|null|undefined} current
         * @memberof file.ListVersionsReplyBody
         * @instance
         */
        ListVersionsReplyBody.prototype.current = null;

        /**
         * ListVersionsReplyBody archived.
         * @member {Array.<number|Long>} archived
         * @memberof file.ListVersionsReplyBody
         * @instance
         */
        ListVersionsReplyBody.prototype.archived = $util.emptyArray;

        /**
         * Creates a new ListVersionsReplyBody instance using the specified properties.
         * @function create
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {file.IListVersionsReplyBody=} [properties] Properties to set
         * @returns {file.ListVersionsReplyBody} ListVersionsReplyBody instance
         */
        ListVersionsReplyBody.create = function create(properties) {
            return new ListVersionsReplyBody(properties);
        };

        /**
         * Encodes the specified ListVersionsReplyBody message. Does not implicitly {@link file.ListVersionsReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {file.IListVersionsReplyBody} message ListVersionsReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ListVersionsReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                $root.common.UInt64Value.encode(message.current, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.archived != null && message.archived.length) {
                writer.uint32(/* id 2, wireType 2 =*/18).fork();
                for (var i = 0; i < message.archived.length; ++i)
                    writer.uint64(message.archived[i]);
                writer.ldelim();
            }
            return writer;
        };

        /**
         * Encodes the specified ListVersionsReplyBody message, length delimited. Does not implicitly {@link file.ListVersionsReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {file.IListVersionsReplyBody} message ListVersionsReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ListVersionsReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a ListVersionsReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.ListVersionsReplyBody} ListVersionsReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ListVersionsReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ListVersionsReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.current = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        if (!(message.archived && message.archived.length))
                            message.archived = [];
                        if ((tag & 7) === 2) {
                            var end2 = reader.uint32() + reader.pos;
                            while (reader.pos < end2)
                                message.archived.push(reader.uint64());
                        } else
                            message.archived.push(reader.uint64());
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a ListVersionsReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.ListVersionsReplyBody} ListVersionsReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ListVersionsReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a ListVersionsReplyBody message.
         * @function verify
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ListVersionsReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.current != null && Object.hasOwnProperty.call(message, "current")) {
                var error = $root.common.UInt64Value.verify(message.current, long + 1);
                if (error)
                    return "current." + error;
            }
            if (message.archived != null && Object.hasOwnProperty.call(message, "archived")) {
                if (!Array.isArray(message.archived))
                    return "archived: array expected";
                for (var i = 0; i < message.archived.length; ++i)
                    if (!$util.isInteger(message.archived[i]) && !(message.archived[i] && $util.isInteger(message.archived[i].low) && $util.isInteger(message.archived[i].high)))
                        return "archived: integer|Long[] expected";
            }
            return null;
        };

        /**
         * Creates a ListVersionsReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.ListVersionsReplyBody} ListVersionsReplyBody
         */
        ListVersionsReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.ListVersionsReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.ListVersionsReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.ListVersionsReplyBody();
            if (object.current != null) {
                if (!$util.isObject(object.current))
                    throw TypeError(".file.ListVersionsReplyBody.current: object expected");
                message.current = $root.common.UInt64Value.fromObject(object.current, long + 1);
            }
            if (object.archived) {
                if (!Array.isArray(object.archived))
                    throw TypeError(".file.ListVersionsReplyBody.archived: array expected");
                message.archived = [];
                for (var i = 0; i < object.archived.length; ++i)
                    if ($util.Long)
                        message.archived[i] = $util.Long.fromValue(object.archived[i], true);
                    else if (typeof object.archived[i] === "string")
                        message.archived[i] = parseInt(object.archived[i], 10);
                    else if (typeof object.archived[i] === "number")
                        message.archived[i] = object.archived[i];
                    else if (typeof object.archived[i] === "object")
                        message.archived[i] = new $util.LongBits(object.archived[i].low >>> 0, object.archived[i].high >>> 0).toNumber(true);
            }
            return message;
        };

        /**
         * Creates a plain object from a ListVersionsReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {file.ListVersionsReplyBody} message ListVersionsReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ListVersionsReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.archived = [];
            if (options.defaults)
                object.current = null;
            if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                object.current = $root.common.UInt64Value.toObject(message.current, options, q + 1);
            if (message.archived && message.archived.length) {
                object.archived = [];
                for (var j = 0; j < message.archived.length; ++j)
                    if (typeof BigInt !== "undefined" && options.longs === BigInt)
                        object.archived[j] = typeof message.archived[j] === "number" ? BigInt(message.archived[j]) : $util.Long.fromBits(message.archived[j].low >>> 0, message.archived[j].high >>> 0, true).toBigInt();
                    else if (typeof message.archived[j] === "number")
                        object.archived[j] = options.longs === String ? String(message.archived[j]) : message.archived[j];
                    else
                        object.archived[j] = options.longs === String ? $util.Long.prototype.toString.call(message.archived[j]) : options.longs === Number ? new $util.LongBits(message.archived[j].low >>> 0, message.archived[j].high >>> 0).toNumber(true) : message.archived[j];
            }
            return object;
        };

        /**
         * Converts this ListVersionsReplyBody to JSON.
         * @function toJSON
         * @memberof file.ListVersionsReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ListVersionsReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ListVersionsReplyBody
         * @function getTypeUrl
         * @memberof file.ListVersionsReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ListVersionsReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.ListVersionsReplyBody";
        };

        return ListVersionsReplyBody;
    })();

    file.UpdateXAttrsRequestBody = (function() {

        /**
         * Properties of an UpdateXAttrsRequestBody.
         * @memberof file
         * @interface IUpdateXAttrsRequestBody
         * @property {file.IXAttrsChanges|null} [changes] UpdateXAttrsRequestBody changes
         */

        /**
         * Constructs a new UpdateXAttrsRequestBody.
         * @memberof file
         * @classdesc Represents an UpdateXAttrsRequestBody.
         * @implements IUpdateXAttrsRequestBody
         * @constructor
         * @param {file.IUpdateXAttrsRequestBody=} [properties] Properties to set
         */
        function UpdateXAttrsRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * UpdateXAttrsRequestBody changes.
         * @member {file.IXAttrsChanges|null|undefined} changes
         * @memberof file.UpdateXAttrsRequestBody
         * @instance
         */
        UpdateXAttrsRequestBody.prototype.changes = null;

        /**
         * Creates a new UpdateXAttrsRequestBody instance using the specified properties.
         * @function create
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {file.IUpdateXAttrsRequestBody=} [properties] Properties to set
         * @returns {file.UpdateXAttrsRequestBody} UpdateXAttrsRequestBody instance
         */
        UpdateXAttrsRequestBody.create = function create(properties) {
            return new UpdateXAttrsRequestBody(properties);
        };

        /**
         * Encodes the specified UpdateXAttrsRequestBody message. Does not implicitly {@link file.UpdateXAttrsRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {file.IUpdateXAttrsRequestBody} message UpdateXAttrsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UpdateXAttrsRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.changes != null && Object.hasOwnProperty.call(message, "changes"))
                $root.file.XAttrsChanges.encode(message.changes, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified UpdateXAttrsRequestBody message, length delimited. Does not implicitly {@link file.UpdateXAttrsRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {file.IUpdateXAttrsRequestBody} message UpdateXAttrsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UpdateXAttrsRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an UpdateXAttrsRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.UpdateXAttrsRequestBody} UpdateXAttrsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UpdateXAttrsRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.UpdateXAttrsRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.changes = $root.file.XAttrsChanges.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an UpdateXAttrsRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.UpdateXAttrsRequestBody} UpdateXAttrsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UpdateXAttrsRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an UpdateXAttrsRequestBody message.
         * @function verify
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        UpdateXAttrsRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.changes != null && Object.hasOwnProperty.call(message, "changes")) {
                var error = $root.file.XAttrsChanges.verify(message.changes, long + 1);
                if (error)
                    return "changes." + error;
            }
            return null;
        };

        /**
         * Creates an UpdateXAttrsRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.UpdateXAttrsRequestBody} UpdateXAttrsRequestBody
         */
        UpdateXAttrsRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.UpdateXAttrsRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.UpdateXAttrsRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.UpdateXAttrsRequestBody();
            if (object.changes != null) {
                if (!$util.isObject(object.changes))
                    throw TypeError(".file.UpdateXAttrsRequestBody.changes: object expected");
                message.changes = $root.file.XAttrsChanges.fromObject(object.changes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an UpdateXAttrsRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {file.UpdateXAttrsRequestBody} message UpdateXAttrsRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        UpdateXAttrsRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.changes = null;
            if (message.changes != null && Object.hasOwnProperty.call(message, "changes"))
                object.changes = $root.file.XAttrsChanges.toObject(message.changes, options, q + 1);
            return object;
        };

        /**
         * Converts this UpdateXAttrsRequestBody to JSON.
         * @function toJSON
         * @memberof file.UpdateXAttrsRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        UpdateXAttrsRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for UpdateXAttrsRequestBody
         * @function getTypeUrl
         * @memberof file.UpdateXAttrsRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        UpdateXAttrsRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.UpdateXAttrsRequestBody";
        };

        return UpdateXAttrsRequestBody;
    })();

    file.NameAndXAttrValue = (function() {

        /**
         * Properties of a NameAndXAttrValue.
         * @memberof file
         * @interface INameAndXAttrValue
         * @property {string|null} [xaName] NameAndXAttrValue xaName
         * @property {common.IStringValue|null} [str] NameAndXAttrValue str
         * @property {common.IStringValue|null} [json] NameAndXAttrValue json
         * @property {common.IBytesValue|null} [bytes] NameAndXAttrValue bytes
         */

        /**
         * Constructs a new NameAndXAttrValue.
         * @memberof file
         * @classdesc Represents a NameAndXAttrValue.
         * @implements INameAndXAttrValue
         * @constructor
         * @param {file.INameAndXAttrValue=} [properties] Properties to set
         */
        function NameAndXAttrValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * NameAndXAttrValue xaName.
         * @member {string} xaName
         * @memberof file.NameAndXAttrValue
         * @instance
         */
        NameAndXAttrValue.prototype.xaName = "";

        /**
         * NameAndXAttrValue str.
         * @member {common.IStringValue|null|undefined} str
         * @memberof file.NameAndXAttrValue
         * @instance
         */
        NameAndXAttrValue.prototype.str = null;

        /**
         * NameAndXAttrValue json.
         * @member {common.IStringValue|null|undefined} json
         * @memberof file.NameAndXAttrValue
         * @instance
         */
        NameAndXAttrValue.prototype.json = null;

        /**
         * NameAndXAttrValue bytes.
         * @member {common.IBytesValue|null|undefined} bytes
         * @memberof file.NameAndXAttrValue
         * @instance
         */
        NameAndXAttrValue.prototype.bytes = null;

        /**
         * Creates a new NameAndXAttrValue instance using the specified properties.
         * @function create
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {file.INameAndXAttrValue=} [properties] Properties to set
         * @returns {file.NameAndXAttrValue} NameAndXAttrValue instance
         */
        NameAndXAttrValue.create = function create(properties) {
            return new NameAndXAttrValue(properties);
        };

        /**
         * Encodes the specified NameAndXAttrValue message. Does not implicitly {@link file.NameAndXAttrValue.verify|verify} messages.
         * @function encode
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {file.INameAndXAttrValue} message NameAndXAttrValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        NameAndXAttrValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.xaName);
            if (message.str != null && Object.hasOwnProperty.call(message, "str"))
                $root.common.StringValue.encode(message.str, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified NameAndXAttrValue message, length delimited. Does not implicitly {@link file.NameAndXAttrValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {file.INameAndXAttrValue} message NameAndXAttrValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        NameAndXAttrValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a NameAndXAttrValue message from the specified reader or buffer.
         * @function decode
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.NameAndXAttrValue} NameAndXAttrValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        NameAndXAttrValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.NameAndXAttrValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.xaName = reader.string();
                        break;
                    }
                case 2: {
                        message.str = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.json = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a NameAndXAttrValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.NameAndXAttrValue} NameAndXAttrValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        NameAndXAttrValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a NameAndXAttrValue message.
         * @function verify
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        NameAndXAttrValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                if (!$util.isString(message.xaName))
                    return "xaName: string expected";
            if (message.str != null && Object.hasOwnProperty.call(message, "str")) {
                var error = $root.common.StringValue.verify(message.str, long + 1);
                if (error)
                    return "str." + error;
            }
            if (message.json != null && Object.hasOwnProperty.call(message, "json")) {
                var error = $root.common.StringValue.verify(message.json, long + 1);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes, long + 1);
                if (error)
                    return "bytes." + error;
            }
            return null;
        };

        /**
         * Creates a NameAndXAttrValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.NameAndXAttrValue} NameAndXAttrValue
         */
        NameAndXAttrValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.NameAndXAttrValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.NameAndXAttrValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.NameAndXAttrValue();
            if (object.xaName != null)
                message.xaName = String(object.xaName);
            if (object.str != null) {
                if (!$util.isObject(object.str))
                    throw TypeError(".file.NameAndXAttrValue.str: object expected");
                message.str = $root.common.StringValue.fromObject(object.str, long + 1);
            }
            if (object.json != null) {
                if (!$util.isObject(object.json))
                    throw TypeError(".file.NameAndXAttrValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json, long + 1);
            }
            if (object.bytes != null) {
                if (!$util.isObject(object.bytes))
                    throw TypeError(".file.NameAndXAttrValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a NameAndXAttrValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {file.NameAndXAttrValue} message NameAndXAttrValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        NameAndXAttrValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.xaName = "";
                object.str = null;
                object.json = null;
                object.bytes = null;
            }
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                object.xaName = message.xaName;
            if (message.str != null && Object.hasOwnProperty.call(message, "str"))
                object.str = $root.common.StringValue.toObject(message.str, options, q + 1);
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = $root.common.StringValue.toObject(message.json, options, q + 1);
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options, q + 1);
            return object;
        };

        /**
         * Converts this NameAndXAttrValue to JSON.
         * @function toJSON
         * @memberof file.NameAndXAttrValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        NameAndXAttrValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for NameAndXAttrValue
         * @function getTypeUrl
         * @memberof file.NameAndXAttrValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        NameAndXAttrValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.NameAndXAttrValue";
        };

        return NameAndXAttrValue;
    })();

    file.XAttrsChanges = (function() {

        /**
         * Properties of a XAttrsChanges.
         * @memberof file
         * @interface IXAttrsChanges
         * @property {Array.<file.INameAndXAttrValue>|null} [set] XAttrsChanges set
         * @property {Array.<string>|null} [remove] XAttrsChanges remove
         */

        /**
         * Constructs a new XAttrsChanges.
         * @memberof file
         * @classdesc Represents a XAttrsChanges.
         * @implements IXAttrsChanges
         * @constructor
         * @param {file.IXAttrsChanges=} [properties] Properties to set
         */
        function XAttrsChanges(properties) {
            this.set = [];
            this.remove = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * XAttrsChanges set.
         * @member {Array.<file.INameAndXAttrValue>} set
         * @memberof file.XAttrsChanges
         * @instance
         */
        XAttrsChanges.prototype.set = $util.emptyArray;

        /**
         * XAttrsChanges remove.
         * @member {Array.<string>} remove
         * @memberof file.XAttrsChanges
         * @instance
         */
        XAttrsChanges.prototype.remove = $util.emptyArray;

        /**
         * Creates a new XAttrsChanges instance using the specified properties.
         * @function create
         * @memberof file.XAttrsChanges
         * @static
         * @param {file.IXAttrsChanges=} [properties] Properties to set
         * @returns {file.XAttrsChanges} XAttrsChanges instance
         */
        XAttrsChanges.create = function create(properties) {
            return new XAttrsChanges(properties);
        };

        /**
         * Encodes the specified XAttrsChanges message. Does not implicitly {@link file.XAttrsChanges.verify|verify} messages.
         * @function encode
         * @memberof file.XAttrsChanges
         * @static
         * @param {file.IXAttrsChanges} message XAttrsChanges message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        XAttrsChanges.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.set != null && message.set.length)
                for (var i = 0; i < message.set.length; ++i)
                    $root.file.NameAndXAttrValue.encode(message.set[i], writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.remove != null && message.remove.length)
                for (var i = 0; i < message.remove.length; ++i)
                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.remove[i]);
            return writer;
        };

        /**
         * Encodes the specified XAttrsChanges message, length delimited. Does not implicitly {@link file.XAttrsChanges.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.XAttrsChanges
         * @static
         * @param {file.IXAttrsChanges} message XAttrsChanges message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        XAttrsChanges.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a XAttrsChanges message from the specified reader or buffer.
         * @function decode
         * @memberof file.XAttrsChanges
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.XAttrsChanges} XAttrsChanges
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        XAttrsChanges.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.XAttrsChanges();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.set && message.set.length))
                            message.set = [];
                        message.set.push($root.file.NameAndXAttrValue.decode(reader, reader.uint32(), undefined, long + 1));
                        break;
                    }
                case 2: {
                        if (!(message.remove && message.remove.length))
                            message.remove = [];
                        message.remove.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a XAttrsChanges message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.XAttrsChanges
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.XAttrsChanges} XAttrsChanges
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        XAttrsChanges.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a XAttrsChanges message.
         * @function verify
         * @memberof file.XAttrsChanges
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        XAttrsChanges.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.set != null && Object.hasOwnProperty.call(message, "set")) {
                if (!Array.isArray(message.set))
                    return "set: array expected";
                for (var i = 0; i < message.set.length; ++i) {
                    var error = $root.file.NameAndXAttrValue.verify(message.set[i], long + 1);
                    if (error)
                        return "set." + error;
                }
            }
            if (message.remove != null && Object.hasOwnProperty.call(message, "remove")) {
                if (!Array.isArray(message.remove))
                    return "remove: array expected";
                for (var i = 0; i < message.remove.length; ++i)
                    if (!$util.isString(message.remove[i]))
                        return "remove: string[] expected";
            }
            return null;
        };

        /**
         * Creates a XAttrsChanges message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.XAttrsChanges
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.XAttrsChanges} XAttrsChanges
         */
        XAttrsChanges.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.XAttrsChanges)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.XAttrsChanges: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.XAttrsChanges();
            if (object.set) {
                if (!Array.isArray(object.set))
                    throw TypeError(".file.XAttrsChanges.set: array expected");
                message.set = [];
                for (var i = 0; i < object.set.length; ++i) {
                    if (!$util.isObject(object.set[i]))
                        throw TypeError(".file.XAttrsChanges.set: object expected");
                    message.set[i] = $root.file.NameAndXAttrValue.fromObject(object.set[i], long + 1);
                }
            }
            if (object.remove) {
                if (!Array.isArray(object.remove))
                    throw TypeError(".file.XAttrsChanges.remove: array expected");
                message.remove = [];
                for (var i = 0; i < object.remove.length; ++i)
                    message.remove[i] = String(object.remove[i]);
            }
            return message;
        };

        /**
         * Creates a plain object from a XAttrsChanges message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.XAttrsChanges
         * @static
         * @param {file.XAttrsChanges} message XAttrsChanges
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        XAttrsChanges.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults) {
                object.set = [];
                object.remove = [];
            }
            if (message.set && message.set.length) {
                object.set = [];
                for (var j = 0; j < message.set.length; ++j)
                    object.set[j] = $root.file.NameAndXAttrValue.toObject(message.set[j], options, q + 1);
            }
            if (message.remove && message.remove.length) {
                object.remove = [];
                for (var j = 0; j < message.remove.length; ++j)
                    object.remove[j] = message.remove[j];
            }
            return object;
        };

        /**
         * Converts this XAttrsChanges to JSON.
         * @function toJSON
         * @memberof file.XAttrsChanges
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        XAttrsChanges.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for XAttrsChanges
         * @function getTypeUrl
         * @memberof file.XAttrsChanges
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        XAttrsChanges.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.XAttrsChanges";
        };

        return XAttrsChanges;
    })();

    file.WriteBytesRequestBody = (function() {

        /**
         * Properties of a WriteBytesRequestBody.
         * @memberof file
         * @interface IWriteBytesRequestBody
         * @property {Uint8Array|null} [bytes] WriteBytesRequestBody bytes
         */

        /**
         * Constructs a new WriteBytesRequestBody.
         * @memberof file
         * @classdesc Represents a WriteBytesRequestBody.
         * @implements IWriteBytesRequestBody
         * @constructor
         * @param {file.IWriteBytesRequestBody=} [properties] Properties to set
         */
        function WriteBytesRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * WriteBytesRequestBody bytes.
         * @member {Uint8Array} bytes
         * @memberof file.WriteBytesRequestBody
         * @instance
         */
        WriteBytesRequestBody.prototype.bytes = $util.newBuffer([]);

        /**
         * Creates a new WriteBytesRequestBody instance using the specified properties.
         * @function create
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {file.IWriteBytesRequestBody=} [properties] Properties to set
         * @returns {file.WriteBytesRequestBody} WriteBytesRequestBody instance
         */
        WriteBytesRequestBody.create = function create(properties) {
            return new WriteBytesRequestBody(properties);
        };

        /**
         * Encodes the specified WriteBytesRequestBody message. Does not implicitly {@link file.WriteBytesRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {file.IWriteBytesRequestBody} message WriteBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteBytesRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.bytes);
            return writer;
        };

        /**
         * Encodes the specified WriteBytesRequestBody message, length delimited. Does not implicitly {@link file.WriteBytesRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {file.IWriteBytesRequestBody} message WriteBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteBytesRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a WriteBytesRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.WriteBytesRequestBody} WriteBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteBytesRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.WriteBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.bytes = reader.bytes();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a WriteBytesRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.WriteBytesRequestBody} WriteBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteBytesRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a WriteBytesRequestBody message.
         * @function verify
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        WriteBytesRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                if (!(message.bytes && typeof message.bytes.length === "number" || $util.isString(message.bytes)))
                    return "bytes: buffer expected";
            return null;
        };

        /**
         * Creates a WriteBytesRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.WriteBytesRequestBody} WriteBytesRequestBody
         */
        WriteBytesRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.WriteBytesRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.WriteBytesRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.WriteBytesRequestBody();
            if (object.bytes != null)
                if (typeof object.bytes === "string")
                    $util.base64.decode(object.bytes, message.bytes = $util.newBuffer($util.base64.length(object.bytes)), 0);
                else if (object.bytes.length >= 0)
                    message.bytes = object.bytes;
            return message;
        };

        /**
         * Creates a plain object from a WriteBytesRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {file.WriteBytesRequestBody} message WriteBytesRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        WriteBytesRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if (options.bytes === String)
                    object.bytes = "";
                else {
                    object.bytes = [];
                    if (options.bytes !== Array)
                        object.bytes = $util.newBuffer(object.bytes);
                }
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = options.bytes === String ? $util.base64.encode(message.bytes, 0, message.bytes.length) : options.bytes === Array ? Array.prototype.slice.call(message.bytes) : message.bytes;
            return object;
        };

        /**
         * Converts this WriteBytesRequestBody to JSON.
         * @function toJSON
         * @memberof file.WriteBytesRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        WriteBytesRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for WriteBytesRequestBody
         * @function getTypeUrl
         * @memberof file.WriteBytesRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        WriteBytesRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.WriteBytesRequestBody";
        };

        return WriteBytesRequestBody;
    })();

    file.WriteTxtRequestBody = (function() {

        /**
         * Properties of a WriteTxtRequestBody.
         * @memberof file
         * @interface IWriteTxtRequestBody
         * @property {string|null} [txt] WriteTxtRequestBody txt
         */

        /**
         * Constructs a new WriteTxtRequestBody.
         * @memberof file
         * @classdesc Represents a WriteTxtRequestBody.
         * @implements IWriteTxtRequestBody
         * @constructor
         * @param {file.IWriteTxtRequestBody=} [properties] Properties to set
         */
        function WriteTxtRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * WriteTxtRequestBody txt.
         * @member {string} txt
         * @memberof file.WriteTxtRequestBody
         * @instance
         */
        WriteTxtRequestBody.prototype.txt = "";

        /**
         * Creates a new WriteTxtRequestBody instance using the specified properties.
         * @function create
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {file.IWriteTxtRequestBody=} [properties] Properties to set
         * @returns {file.WriteTxtRequestBody} WriteTxtRequestBody instance
         */
        WriteTxtRequestBody.create = function create(properties) {
            return new WriteTxtRequestBody(properties);
        };

        /**
         * Encodes the specified WriteTxtRequestBody message. Does not implicitly {@link file.WriteTxtRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {file.IWriteTxtRequestBody} message WriteTxtRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteTxtRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.txt);
            return writer;
        };

        /**
         * Encodes the specified WriteTxtRequestBody message, length delimited. Does not implicitly {@link file.WriteTxtRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {file.IWriteTxtRequestBody} message WriteTxtRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteTxtRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a WriteTxtRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.WriteTxtRequestBody} WriteTxtRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteTxtRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.WriteTxtRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.txt = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a WriteTxtRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.WriteTxtRequestBody} WriteTxtRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteTxtRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a WriteTxtRequestBody message.
         * @function verify
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        WriteTxtRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                if (!$util.isString(message.txt))
                    return "txt: string expected";
            return null;
        };

        /**
         * Creates a WriteTxtRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.WriteTxtRequestBody} WriteTxtRequestBody
         */
        WriteTxtRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.WriteTxtRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.WriteTxtRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.WriteTxtRequestBody();
            if (object.txt != null)
                message.txt = String(object.txt);
            return message;
        };

        /**
         * Creates a plain object from a WriteTxtRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {file.WriteTxtRequestBody} message WriteTxtRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        WriteTxtRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.txt = "";
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                object.txt = message.txt;
            return object;
        };

        /**
         * Converts this WriteTxtRequestBody to JSON.
         * @function toJSON
         * @memberof file.WriteTxtRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        WriteTxtRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for WriteTxtRequestBody
         * @function getTypeUrl
         * @memberof file.WriteTxtRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        WriteTxtRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.WriteTxtRequestBody";
        };

        return WriteTxtRequestBody;
    })();

    file.WriteJsonRequestBody = (function() {

        /**
         * Properties of a WriteJsonRequestBody.
         * @memberof file
         * @interface IWriteJsonRequestBody
         * @property {string|null} [json] WriteJsonRequestBody json
         */

        /**
         * Constructs a new WriteJsonRequestBody.
         * @memberof file
         * @classdesc Represents a WriteJsonRequestBody.
         * @implements IWriteJsonRequestBody
         * @constructor
         * @param {file.IWriteJsonRequestBody=} [properties] Properties to set
         */
        function WriteJsonRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * WriteJsonRequestBody json.
         * @member {string} json
         * @memberof file.WriteJsonRequestBody
         * @instance
         */
        WriteJsonRequestBody.prototype.json = "";

        /**
         * Creates a new WriteJsonRequestBody instance using the specified properties.
         * @function create
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {file.IWriteJsonRequestBody=} [properties] Properties to set
         * @returns {file.WriteJsonRequestBody} WriteJsonRequestBody instance
         */
        WriteJsonRequestBody.create = function create(properties) {
            return new WriteJsonRequestBody(properties);
        };

        /**
         * Encodes the specified WriteJsonRequestBody message. Does not implicitly {@link file.WriteJsonRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {file.IWriteJsonRequestBody} message WriteJsonRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteJsonRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.json);
            return writer;
        };

        /**
         * Encodes the specified WriteJsonRequestBody message, length delimited. Does not implicitly {@link file.WriteJsonRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {file.IWriteJsonRequestBody} message WriteJsonRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteJsonRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a WriteJsonRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.WriteJsonRequestBody} WriteJsonRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteJsonRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.WriteJsonRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.json = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a WriteJsonRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.WriteJsonRequestBody} WriteJsonRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteJsonRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a WriteJsonRequestBody message.
         * @function verify
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        WriteJsonRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                if (!$util.isString(message.json))
                    return "json: string expected";
            return null;
        };

        /**
         * Creates a WriteJsonRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.WriteJsonRequestBody} WriteJsonRequestBody
         */
        WriteJsonRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.WriteJsonRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.WriteJsonRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.WriteJsonRequestBody();
            if (object.json != null)
                message.json = String(object.json);
            return message;
        };

        /**
         * Creates a plain object from a WriteJsonRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {file.WriteJsonRequestBody} message WriteJsonRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        WriteJsonRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.json = "";
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = message.json;
            return object;
        };

        /**
         * Converts this WriteJsonRequestBody to JSON.
         * @function toJSON
         * @memberof file.WriteJsonRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        WriteJsonRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for WriteJsonRequestBody
         * @function getTypeUrl
         * @memberof file.WriteJsonRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        WriteJsonRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.WriteJsonRequestBody";
        };

        return WriteJsonRequestBody;
    })();

    file.GetByteSinkRequestBody = (function() {

        /**
         * Properties of a GetByteSinkRequestBody.
         * @memberof file
         * @interface IGetByteSinkRequestBody
         * @property {common.IBooleanValue|null} [truncateFile] GetByteSinkRequestBody truncateFile
         */

        /**
         * Constructs a new GetByteSinkRequestBody.
         * @memberof file
         * @classdesc Represents a GetByteSinkRequestBody.
         * @implements IGetByteSinkRequestBody
         * @constructor
         * @param {file.IGetByteSinkRequestBody=} [properties] Properties to set
         */
        function GetByteSinkRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * GetByteSinkRequestBody truncateFile.
         * @member {common.IBooleanValue|null|undefined} truncateFile
         * @memberof file.GetByteSinkRequestBody
         * @instance
         */
        GetByteSinkRequestBody.prototype.truncateFile = null;

        /**
         * Creates a new GetByteSinkRequestBody instance using the specified properties.
         * @function create
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {file.IGetByteSinkRequestBody=} [properties] Properties to set
         * @returns {file.GetByteSinkRequestBody} GetByteSinkRequestBody instance
         */
        GetByteSinkRequestBody.create = function create(properties) {
            return new GetByteSinkRequestBody(properties);
        };

        /**
         * Encodes the specified GetByteSinkRequestBody message. Does not implicitly {@link file.GetByteSinkRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {file.IGetByteSinkRequestBody} message GetByteSinkRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        GetByteSinkRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.truncateFile != null && Object.hasOwnProperty.call(message, "truncateFile"))
                $root.common.BooleanValue.encode(message.truncateFile, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified GetByteSinkRequestBody message, length delimited. Does not implicitly {@link file.GetByteSinkRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {file.IGetByteSinkRequestBody} message GetByteSinkRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        GetByteSinkRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a GetByteSinkRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.GetByteSinkRequestBody} GetByteSinkRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        GetByteSinkRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.GetByteSinkRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.truncateFile = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a GetByteSinkRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.GetByteSinkRequestBody} GetByteSinkRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        GetByteSinkRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a GetByteSinkRequestBody message.
         * @function verify
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        GetByteSinkRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.truncateFile != null && Object.hasOwnProperty.call(message, "truncateFile")) {
                var error = $root.common.BooleanValue.verify(message.truncateFile, long + 1);
                if (error)
                    return "truncateFile." + error;
            }
            return null;
        };

        /**
         * Creates a GetByteSinkRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.GetByteSinkRequestBody} GetByteSinkRequestBody
         */
        GetByteSinkRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.GetByteSinkRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.GetByteSinkRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.GetByteSinkRequestBody();
            if (object.truncateFile != null) {
                if (!$util.isObject(object.truncateFile))
                    throw TypeError(".file.GetByteSinkRequestBody.truncateFile: object expected");
                message.truncateFile = $root.common.BooleanValue.fromObject(object.truncateFile, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a GetByteSinkRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {file.GetByteSinkRequestBody} message GetByteSinkRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        GetByteSinkRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.truncateFile = null;
            if (message.truncateFile != null && Object.hasOwnProperty.call(message, "truncateFile"))
                object.truncateFile = $root.common.BooleanValue.toObject(message.truncateFile, options, q + 1);
            return object;
        };

        /**
         * Converts this GetByteSinkRequestBody to JSON.
         * @function toJSON
         * @memberof file.GetByteSinkRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        GetByteSinkRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for GetByteSinkRequestBody
         * @function getTypeUrl
         * @memberof file.GetByteSinkRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        GetByteSinkRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.GetByteSinkRequestBody";
        };

        return GetByteSinkRequestBody;
    })();

    file.CopyRequestBody = (function() {

        /**
         * Properties of a CopyRequestBody.
         * @memberof file
         * @interface ICopyRequestBody
         * @property {common.IObjectReference|null} [file] CopyRequestBody file
         */

        /**
         * Constructs a new CopyRequestBody.
         * @memberof file
         * @classdesc Represents a CopyRequestBody.
         * @implements ICopyRequestBody
         * @constructor
         * @param {file.ICopyRequestBody=} [properties] Properties to set
         */
        function CopyRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * CopyRequestBody file.
         * @member {common.IObjectReference|null|undefined} file
         * @memberof file.CopyRequestBody
         * @instance
         */
        CopyRequestBody.prototype.file = null;

        /**
         * Creates a new CopyRequestBody instance using the specified properties.
         * @function create
         * @memberof file.CopyRequestBody
         * @static
         * @param {file.ICopyRequestBody=} [properties] Properties to set
         * @returns {file.CopyRequestBody} CopyRequestBody instance
         */
        CopyRequestBody.create = function create(properties) {
            return new CopyRequestBody(properties);
        };

        /**
         * Encodes the specified CopyRequestBody message. Does not implicitly {@link file.CopyRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.CopyRequestBody
         * @static
         * @param {file.ICopyRequestBody} message CopyRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CopyRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                $root.common.ObjectReference.encode(message.file, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified CopyRequestBody message, length delimited. Does not implicitly {@link file.CopyRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.CopyRequestBody
         * @static
         * @param {file.ICopyRequestBody} message CopyRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CopyRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a CopyRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.CopyRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.CopyRequestBody} CopyRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CopyRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.CopyRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.file = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a CopyRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.CopyRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.CopyRequestBody} CopyRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CopyRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a CopyRequestBody message.
         * @function verify
         * @memberof file.CopyRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        CopyRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.file != null && Object.hasOwnProperty.call(message, "file")) {
                var error = $root.common.ObjectReference.verify(message.file, long + 1);
                if (error)
                    return "file." + error;
            }
            return null;
        };

        /**
         * Creates a CopyRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.CopyRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.CopyRequestBody} CopyRequestBody
         */
        CopyRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.CopyRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.CopyRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.CopyRequestBody();
            if (object.file != null) {
                if (!$util.isObject(object.file))
                    throw TypeError(".file.CopyRequestBody.file: object expected");
                message.file = $root.common.ObjectReference.fromObject(object.file, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a CopyRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.CopyRequestBody
         * @static
         * @param {file.CopyRequestBody} message CopyRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        CopyRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.file = null;
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                object.file = $root.common.ObjectReference.toObject(message.file, options, q + 1);
            return object;
        };

        /**
         * Converts this CopyRequestBody to JSON.
         * @function toJSON
         * @memberof file.CopyRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        CopyRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for CopyRequestBody
         * @function getTypeUrl
         * @memberof file.CopyRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        CopyRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.CopyRequestBody";
        };

        return CopyRequestBody;
    })();

    file.VersionedGetByteSinkRequestBody = (function() {

        /**
         * Properties of a VersionedGetByteSinkRequestBody.
         * @memberof file
         * @interface IVersionedGetByteSinkRequestBody
         * @property {common.IBooleanValue|null} [truncateFile] VersionedGetByteSinkRequestBody truncateFile
         * @property {common.IUInt64Value|null} [currentVersion] VersionedGetByteSinkRequestBody currentVersion
         */

        /**
         * Constructs a new VersionedGetByteSinkRequestBody.
         * @memberof file
         * @classdesc Represents a VersionedGetByteSinkRequestBody.
         * @implements IVersionedGetByteSinkRequestBody
         * @constructor
         * @param {file.IVersionedGetByteSinkRequestBody=} [properties] Properties to set
         */
        function VersionedGetByteSinkRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedGetByteSinkRequestBody truncateFile.
         * @member {common.IBooleanValue|null|undefined} truncateFile
         * @memberof file.VersionedGetByteSinkRequestBody
         * @instance
         */
        VersionedGetByteSinkRequestBody.prototype.truncateFile = null;

        /**
         * VersionedGetByteSinkRequestBody currentVersion.
         * @member {common.IUInt64Value|null|undefined} currentVersion
         * @memberof file.VersionedGetByteSinkRequestBody
         * @instance
         */
        VersionedGetByteSinkRequestBody.prototype.currentVersion = null;

        /**
         * Creates a new VersionedGetByteSinkRequestBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {file.IVersionedGetByteSinkRequestBody=} [properties] Properties to set
         * @returns {file.VersionedGetByteSinkRequestBody} VersionedGetByteSinkRequestBody instance
         */
        VersionedGetByteSinkRequestBody.create = function create(properties) {
            return new VersionedGetByteSinkRequestBody(properties);
        };

        /**
         * Encodes the specified VersionedGetByteSinkRequestBody message. Does not implicitly {@link file.VersionedGetByteSinkRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {file.IVersionedGetByteSinkRequestBody} message VersionedGetByteSinkRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetByteSinkRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.truncateFile != null && Object.hasOwnProperty.call(message, "truncateFile"))
                $root.common.BooleanValue.encode(message.truncateFile, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                $root.common.UInt64Value.encode(message.currentVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedGetByteSinkRequestBody message, length delimited. Does not implicitly {@link file.VersionedGetByteSinkRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {file.IVersionedGetByteSinkRequestBody} message VersionedGetByteSinkRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetByteSinkRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedGetByteSinkRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedGetByteSinkRequestBody} VersionedGetByteSinkRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetByteSinkRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetByteSinkRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.truncateFile = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.currentVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedGetByteSinkRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedGetByteSinkRequestBody} VersionedGetByteSinkRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetByteSinkRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedGetByteSinkRequestBody message.
         * @function verify
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedGetByteSinkRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.truncateFile != null && Object.hasOwnProperty.call(message, "truncateFile")) {
                var error = $root.common.BooleanValue.verify(message.truncateFile, long + 1);
                if (error)
                    return "truncateFile." + error;
            }
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion")) {
                var error = $root.common.UInt64Value.verify(message.currentVersion, long + 1);
                if (error)
                    return "currentVersion." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedGetByteSinkRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedGetByteSinkRequestBody} VersionedGetByteSinkRequestBody
         */
        VersionedGetByteSinkRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedGetByteSinkRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedGetByteSinkRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedGetByteSinkRequestBody();
            if (object.truncateFile != null) {
                if (!$util.isObject(object.truncateFile))
                    throw TypeError(".file.VersionedGetByteSinkRequestBody.truncateFile: object expected");
                message.truncateFile = $root.common.BooleanValue.fromObject(object.truncateFile, long + 1);
            }
            if (object.currentVersion != null) {
                if (!$util.isObject(object.currentVersion))
                    throw TypeError(".file.VersionedGetByteSinkRequestBody.currentVersion: object expected");
                message.currentVersion = $root.common.UInt64Value.fromObject(object.currentVersion, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedGetByteSinkRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {file.VersionedGetByteSinkRequestBody} message VersionedGetByteSinkRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedGetByteSinkRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.truncateFile = null;
                object.currentVersion = null;
            }
            if (message.truncateFile != null && Object.hasOwnProperty.call(message, "truncateFile"))
                object.truncateFile = $root.common.BooleanValue.toObject(message.truncateFile, options, q + 1);
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                object.currentVersion = $root.common.UInt64Value.toObject(message.currentVersion, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedGetByteSinkRequestBody to JSON.
         * @function toJSON
         * @memberof file.VersionedGetByteSinkRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedGetByteSinkRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedGetByteSinkRequestBody
         * @function getTypeUrl
         * @memberof file.VersionedGetByteSinkRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedGetByteSinkRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedGetByteSinkRequestBody";
        };

        return VersionedGetByteSinkRequestBody;
    })();

    file.VersionedGetByteSinkReplyBody = (function() {

        /**
         * Properties of a VersionedGetByteSinkReplyBody.
         * @memberof file
         * @interface IVersionedGetByteSinkReplyBody
         * @property {number|Long|null} [version] VersionedGetByteSinkReplyBody version
         * @property {common.IObjectReference|null} [sink] VersionedGetByteSinkReplyBody sink
         */

        /**
         * Constructs a new VersionedGetByteSinkReplyBody.
         * @memberof file
         * @classdesc Represents a VersionedGetByteSinkReplyBody.
         * @implements IVersionedGetByteSinkReplyBody
         * @constructor
         * @param {file.IVersionedGetByteSinkReplyBody=} [properties] Properties to set
         */
        function VersionedGetByteSinkReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedGetByteSinkReplyBody version.
         * @member {number|Long} version
         * @memberof file.VersionedGetByteSinkReplyBody
         * @instance
         */
        VersionedGetByteSinkReplyBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * VersionedGetByteSinkReplyBody sink.
         * @member {common.IObjectReference|null|undefined} sink
         * @memberof file.VersionedGetByteSinkReplyBody
         * @instance
         */
        VersionedGetByteSinkReplyBody.prototype.sink = null;

        /**
         * Creates a new VersionedGetByteSinkReplyBody instance using the specified properties.
         * @function create
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {file.IVersionedGetByteSinkReplyBody=} [properties] Properties to set
         * @returns {file.VersionedGetByteSinkReplyBody} VersionedGetByteSinkReplyBody instance
         */
        VersionedGetByteSinkReplyBody.create = function create(properties) {
            return new VersionedGetByteSinkReplyBody(properties);
        };

        /**
         * Encodes the specified VersionedGetByteSinkReplyBody message. Does not implicitly {@link file.VersionedGetByteSinkReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {file.IVersionedGetByteSinkReplyBody} message VersionedGetByteSinkReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetByteSinkReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            if (message.sink != null && Object.hasOwnProperty.call(message, "sink"))
                $root.common.ObjectReference.encode(message.sink, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedGetByteSinkReplyBody message, length delimited. Does not implicitly {@link file.VersionedGetByteSinkReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {file.IVersionedGetByteSinkReplyBody} message VersionedGetByteSinkReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetByteSinkReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedGetByteSinkReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.VersionedGetByteSinkReplyBody} VersionedGetByteSinkReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetByteSinkReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.VersionedGetByteSinkReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        message.sink = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedGetByteSinkReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.VersionedGetByteSinkReplyBody} VersionedGetByteSinkReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetByteSinkReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedGetByteSinkReplyBody message.
         * @function verify
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedGetByteSinkReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            if (message.sink != null && Object.hasOwnProperty.call(message, "sink")) {
                var error = $root.common.ObjectReference.verify(message.sink, long + 1);
                if (error)
                    return "sink." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedGetByteSinkReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.VersionedGetByteSinkReplyBody} VersionedGetByteSinkReplyBody
         */
        VersionedGetByteSinkReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.VersionedGetByteSinkReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.VersionedGetByteSinkReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.VersionedGetByteSinkReplyBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            if (object.sink != null) {
                if (!$util.isObject(object.sink))
                    throw TypeError(".file.VersionedGetByteSinkReplyBody.sink: object expected");
                message.sink = $root.common.ObjectReference.fromObject(object.sink, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedGetByteSinkReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {file.VersionedGetByteSinkReplyBody} message VersionedGetByteSinkReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedGetByteSinkReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.sink = null;
            }
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            if (message.sink != null && Object.hasOwnProperty.call(message, "sink"))
                object.sink = $root.common.ObjectReference.toObject(message.sink, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedGetByteSinkReplyBody to JSON.
         * @function toJSON
         * @memberof file.VersionedGetByteSinkReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedGetByteSinkReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedGetByteSinkReplyBody
         * @function getTypeUrl
         * @memberof file.VersionedGetByteSinkReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedGetByteSinkReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.VersionedGetByteSinkReplyBody";
        };

        return VersionedGetByteSinkReplyBody;
    })();

    file.ArchiveCurrentRequestBody = (function() {

        /**
         * Properties of an ArchiveCurrentRequestBody.
         * @memberof file
         * @interface IArchiveCurrentRequestBody
         * @property {common.IUInt64Value|null} [version] ArchiveCurrentRequestBody version
         */

        /**
         * Constructs a new ArchiveCurrentRequestBody.
         * @memberof file
         * @classdesc Represents an ArchiveCurrentRequestBody.
         * @implements IArchiveCurrentRequestBody
         * @constructor
         * @param {file.IArchiveCurrentRequestBody=} [properties] Properties to set
         */
        function ArchiveCurrentRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ArchiveCurrentRequestBody version.
         * @member {common.IUInt64Value|null|undefined} version
         * @memberof file.ArchiveCurrentRequestBody
         * @instance
         */
        ArchiveCurrentRequestBody.prototype.version = null;

        /**
         * Creates a new ArchiveCurrentRequestBody instance using the specified properties.
         * @function create
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {file.IArchiveCurrentRequestBody=} [properties] Properties to set
         * @returns {file.ArchiveCurrentRequestBody} ArchiveCurrentRequestBody instance
         */
        ArchiveCurrentRequestBody.create = function create(properties) {
            return new ArchiveCurrentRequestBody(properties);
        };

        /**
         * Encodes the specified ArchiveCurrentRequestBody message. Does not implicitly {@link file.ArchiveCurrentRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {file.IArchiveCurrentRequestBody} message ArchiveCurrentRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ArchiveCurrentRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                $root.common.UInt64Value.encode(message.version, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified ArchiveCurrentRequestBody message, length delimited. Does not implicitly {@link file.ArchiveCurrentRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {file.IArchiveCurrentRequestBody} message ArchiveCurrentRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ArchiveCurrentRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an ArchiveCurrentRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.ArchiveCurrentRequestBody} ArchiveCurrentRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ArchiveCurrentRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.ArchiveCurrentRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an ArchiveCurrentRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.ArchiveCurrentRequestBody} ArchiveCurrentRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ArchiveCurrentRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an ArchiveCurrentRequestBody message.
         * @function verify
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ArchiveCurrentRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version")) {
                var error = $root.common.UInt64Value.verify(message.version, long + 1);
                if (error)
                    return "version." + error;
            }
            return null;
        };

        /**
         * Creates an ArchiveCurrentRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.ArchiveCurrentRequestBody} ArchiveCurrentRequestBody
         */
        ArchiveCurrentRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.ArchiveCurrentRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.ArchiveCurrentRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.ArchiveCurrentRequestBody();
            if (object.version != null) {
                if (!$util.isObject(object.version))
                    throw TypeError(".file.ArchiveCurrentRequestBody.version: object expected");
                message.version = $root.common.UInt64Value.fromObject(object.version, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an ArchiveCurrentRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {file.ArchiveCurrentRequestBody} message ArchiveCurrentRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ArchiveCurrentRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.version = null;
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                object.version = $root.common.UInt64Value.toObject(message.version, options, q + 1);
            return object;
        };

        /**
         * Converts this ArchiveCurrentRequestBody to JSON.
         * @function toJSON
         * @memberof file.ArchiveCurrentRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ArchiveCurrentRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ArchiveCurrentRequestBody
         * @function getTypeUrl
         * @memberof file.ArchiveCurrentRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ArchiveCurrentRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.ArchiveCurrentRequestBody";
        };

        return ArchiveCurrentRequestBody;
    })();

    file.FileSyncIsOnDiskRequestBody = (function() {

        /**
         * Properties of a FileSyncIsOnDiskRequestBody.
         * @memberof file
         * @interface IFileSyncIsOnDiskRequestBody
         * @property {number|Long|null} [version] FileSyncIsOnDiskRequestBody version
         */

        /**
         * Constructs a new FileSyncIsOnDiskRequestBody.
         * @memberof file
         * @classdesc Represents a FileSyncIsOnDiskRequestBody.
         * @implements IFileSyncIsOnDiskRequestBody
         * @constructor
         * @param {file.IFileSyncIsOnDiskRequestBody=} [properties] Properties to set
         */
        function FileSyncIsOnDiskRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileSyncIsOnDiskRequestBody version.
         * @member {number|Long} version
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @instance
         */
        FileSyncIsOnDiskRequestBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new FileSyncIsOnDiskRequestBody instance using the specified properties.
         * @function create
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {file.IFileSyncIsOnDiskRequestBody=} [properties] Properties to set
         * @returns {file.FileSyncIsOnDiskRequestBody} FileSyncIsOnDiskRequestBody instance
         */
        FileSyncIsOnDiskRequestBody.create = function create(properties) {
            return new FileSyncIsOnDiskRequestBody(properties);
        };

        /**
         * Encodes the specified FileSyncIsOnDiskRequestBody message. Does not implicitly {@link file.FileSyncIsOnDiskRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {file.IFileSyncIsOnDiskRequestBody} message FileSyncIsOnDiskRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncIsOnDiskRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            return writer;
        };

        /**
         * Encodes the specified FileSyncIsOnDiskRequestBody message, length delimited. Does not implicitly {@link file.FileSyncIsOnDiskRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {file.IFileSyncIsOnDiskRequestBody} message FileSyncIsOnDiskRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncIsOnDiskRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileSyncIsOnDiskRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileSyncIsOnDiskRequestBody} FileSyncIsOnDiskRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncIsOnDiskRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncIsOnDiskRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileSyncIsOnDiskRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.FileSyncIsOnDiskRequestBody} FileSyncIsOnDiskRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncIsOnDiskRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileSyncIsOnDiskRequestBody message.
         * @function verify
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileSyncIsOnDiskRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            return null;
        };

        /**
         * Creates a FileSyncIsOnDiskRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileSyncIsOnDiskRequestBody} FileSyncIsOnDiskRequestBody
         */
        FileSyncIsOnDiskRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.FileSyncIsOnDiskRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.FileSyncIsOnDiskRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.FileSyncIsOnDiskRequestBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from a FileSyncIsOnDiskRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {file.FileSyncIsOnDiskRequestBody} message FileSyncIsOnDiskRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileSyncIsOnDiskRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            return object;
        };

        /**
         * Converts this FileSyncIsOnDiskRequestBody to JSON.
         * @function toJSON
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileSyncIsOnDiskRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileSyncIsOnDiskRequestBody
         * @function getTypeUrl
         * @memberof file.FileSyncIsOnDiskRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileSyncIsOnDiskRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.FileSyncIsOnDiskRequestBody";
        };

        return FileSyncIsOnDiskRequestBody;
    })();

    file.FileSyncIsOnDiskReplyBody = (function() {

        /**
         * Properties of a FileSyncIsOnDiskReplyBody.
         * @memberof file
         * @interface IFileSyncIsOnDiskReplyBody
         * @property {string|null} [status] FileSyncIsOnDiskReplyBody status
         */

        /**
         * Constructs a new FileSyncIsOnDiskReplyBody.
         * @memberof file
         * @classdesc Represents a FileSyncIsOnDiskReplyBody.
         * @implements IFileSyncIsOnDiskReplyBody
         * @constructor
         * @param {file.IFileSyncIsOnDiskReplyBody=} [properties] Properties to set
         */
        function FileSyncIsOnDiskReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileSyncIsOnDiskReplyBody status.
         * @member {string} status
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @instance
         */
        FileSyncIsOnDiskReplyBody.prototype.status = "";

        /**
         * Creates a new FileSyncIsOnDiskReplyBody instance using the specified properties.
         * @function create
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {file.IFileSyncIsOnDiskReplyBody=} [properties] Properties to set
         * @returns {file.FileSyncIsOnDiskReplyBody} FileSyncIsOnDiskReplyBody instance
         */
        FileSyncIsOnDiskReplyBody.create = function create(properties) {
            return new FileSyncIsOnDiskReplyBody(properties);
        };

        /**
         * Encodes the specified FileSyncIsOnDiskReplyBody message. Does not implicitly {@link file.FileSyncIsOnDiskReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {file.IFileSyncIsOnDiskReplyBody} message FileSyncIsOnDiskReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncIsOnDiskReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.status != null && Object.hasOwnProperty.call(message, "status"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.status);
            return writer;
        };

        /**
         * Encodes the specified FileSyncIsOnDiskReplyBody message, length delimited. Does not implicitly {@link file.FileSyncIsOnDiskReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {file.IFileSyncIsOnDiskReplyBody} message FileSyncIsOnDiskReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncIsOnDiskReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileSyncIsOnDiskReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileSyncIsOnDiskReplyBody} FileSyncIsOnDiskReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncIsOnDiskReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncIsOnDiskReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.status = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileSyncIsOnDiskReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.FileSyncIsOnDiskReplyBody} FileSyncIsOnDiskReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncIsOnDiskReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileSyncIsOnDiskReplyBody message.
         * @function verify
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileSyncIsOnDiskReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.status != null && Object.hasOwnProperty.call(message, "status"))
                if (!$util.isString(message.status))
                    return "status: string expected";
            return null;
        };

        /**
         * Creates a FileSyncIsOnDiskReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileSyncIsOnDiskReplyBody} FileSyncIsOnDiskReplyBody
         */
        FileSyncIsOnDiskReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.FileSyncIsOnDiskReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.FileSyncIsOnDiskReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.FileSyncIsOnDiskReplyBody();
            if (object.status != null)
                message.status = String(object.status);
            return message;
        };

        /**
         * Creates a plain object from a FileSyncIsOnDiskReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {file.FileSyncIsOnDiskReplyBody} message FileSyncIsOnDiskReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileSyncIsOnDiskReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.status = "";
            if (message.status != null && Object.hasOwnProperty.call(message, "status"))
                object.status = message.status;
            return object;
        };

        /**
         * Converts this FileSyncIsOnDiskReplyBody to JSON.
         * @function toJSON
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileSyncIsOnDiskReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileSyncIsOnDiskReplyBody
         * @function getTypeUrl
         * @memberof file.FileSyncIsOnDiskReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileSyncIsOnDiskReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.FileSyncIsOnDiskReplyBody";
        };

        return FileSyncIsOnDiskReplyBody;
    })();

    file.FileSyncStartDownloadRequestBody = (function() {

        /**
         * Properties of a FileSyncStartDownloadRequestBody.
         * @memberof file
         * @interface IFileSyncStartDownloadRequestBody
         * @property {number|Long|null} [version] FileSyncStartDownloadRequestBody version
         */

        /**
         * Constructs a new FileSyncStartDownloadRequestBody.
         * @memberof file
         * @classdesc Represents a FileSyncStartDownloadRequestBody.
         * @implements IFileSyncStartDownloadRequestBody
         * @constructor
         * @param {file.IFileSyncStartDownloadRequestBody=} [properties] Properties to set
         */
        function FileSyncStartDownloadRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileSyncStartDownloadRequestBody version.
         * @member {number|Long} version
         * @memberof file.FileSyncStartDownloadRequestBody
         * @instance
         */
        FileSyncStartDownloadRequestBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new FileSyncStartDownloadRequestBody instance using the specified properties.
         * @function create
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {file.IFileSyncStartDownloadRequestBody=} [properties] Properties to set
         * @returns {file.FileSyncStartDownloadRequestBody} FileSyncStartDownloadRequestBody instance
         */
        FileSyncStartDownloadRequestBody.create = function create(properties) {
            return new FileSyncStartDownloadRequestBody(properties);
        };

        /**
         * Encodes the specified FileSyncStartDownloadRequestBody message. Does not implicitly {@link file.FileSyncStartDownloadRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {file.IFileSyncStartDownloadRequestBody} message FileSyncStartDownloadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncStartDownloadRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            return writer;
        };

        /**
         * Encodes the specified FileSyncStartDownloadRequestBody message, length delimited. Does not implicitly {@link file.FileSyncStartDownloadRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {file.IFileSyncStartDownloadRequestBody} message FileSyncStartDownloadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncStartDownloadRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileSyncStartDownloadRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileSyncStartDownloadRequestBody} FileSyncStartDownloadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncStartDownloadRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncStartDownloadRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileSyncStartDownloadRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.FileSyncStartDownloadRequestBody} FileSyncStartDownloadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncStartDownloadRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileSyncStartDownloadRequestBody message.
         * @function verify
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileSyncStartDownloadRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            return null;
        };

        /**
         * Creates a FileSyncStartDownloadRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileSyncStartDownloadRequestBody} FileSyncStartDownloadRequestBody
         */
        FileSyncStartDownloadRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.FileSyncStartDownloadRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.FileSyncStartDownloadRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.FileSyncStartDownloadRequestBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from a FileSyncStartDownloadRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {file.FileSyncStartDownloadRequestBody} message FileSyncStartDownloadRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileSyncStartDownloadRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            return object;
        };

        /**
         * Converts this FileSyncStartDownloadRequestBody to JSON.
         * @function toJSON
         * @memberof file.FileSyncStartDownloadRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileSyncStartDownloadRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileSyncStartDownloadRequestBody
         * @function getTypeUrl
         * @memberof file.FileSyncStartDownloadRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileSyncStartDownloadRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.FileSyncStartDownloadRequestBody";
        };

        return FileSyncStartDownloadRequestBody;
    })();

    file.FileSyncStartDownloadReplyBody = (function() {

        /**
         * Properties of a FileSyncStartDownloadReplyBody.
         * @memberof file
         * @interface IFileSyncStartDownloadReplyBody
         * @property {file.FileSyncStartDownloadReplyBody.IDownloadInfo|null} [startedDownload] FileSyncStartDownloadReplyBody startedDownload
         */

        /**
         * Constructs a new FileSyncStartDownloadReplyBody.
         * @memberof file
         * @classdesc Represents a FileSyncStartDownloadReplyBody.
         * @implements IFileSyncStartDownloadReplyBody
         * @constructor
         * @param {file.IFileSyncStartDownloadReplyBody=} [properties] Properties to set
         */
        function FileSyncStartDownloadReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileSyncStartDownloadReplyBody startedDownload.
         * @member {file.FileSyncStartDownloadReplyBody.IDownloadInfo|null|undefined} startedDownload
         * @memberof file.FileSyncStartDownloadReplyBody
         * @instance
         */
        FileSyncStartDownloadReplyBody.prototype.startedDownload = null;

        /**
         * Creates a new FileSyncStartDownloadReplyBody instance using the specified properties.
         * @function create
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {file.IFileSyncStartDownloadReplyBody=} [properties] Properties to set
         * @returns {file.FileSyncStartDownloadReplyBody} FileSyncStartDownloadReplyBody instance
         */
        FileSyncStartDownloadReplyBody.create = function create(properties) {
            return new FileSyncStartDownloadReplyBody(properties);
        };

        /**
         * Encodes the specified FileSyncStartDownloadReplyBody message. Does not implicitly {@link file.FileSyncStartDownloadReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {file.IFileSyncStartDownloadReplyBody} message FileSyncStartDownloadReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncStartDownloadReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.startedDownload != null && Object.hasOwnProperty.call(message, "startedDownload"))
                $root.file.FileSyncStartDownloadReplyBody.DownloadInfo.encode(message.startedDownload, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FileSyncStartDownloadReplyBody message, length delimited. Does not implicitly {@link file.FileSyncStartDownloadReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {file.IFileSyncStartDownloadReplyBody} message FileSyncStartDownloadReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncStartDownloadReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileSyncStartDownloadReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileSyncStartDownloadReplyBody} FileSyncStartDownloadReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncStartDownloadReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncStartDownloadReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.startedDownload = $root.file.FileSyncStartDownloadReplyBody.DownloadInfo.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileSyncStartDownloadReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.FileSyncStartDownloadReplyBody} FileSyncStartDownloadReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncStartDownloadReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileSyncStartDownloadReplyBody message.
         * @function verify
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileSyncStartDownloadReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.startedDownload != null && Object.hasOwnProperty.call(message, "startedDownload")) {
                var error = $root.file.FileSyncStartDownloadReplyBody.DownloadInfo.verify(message.startedDownload, long + 1);
                if (error)
                    return "startedDownload." + error;
            }
            return null;
        };

        /**
         * Creates a FileSyncStartDownloadReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileSyncStartDownloadReplyBody} FileSyncStartDownloadReplyBody
         */
        FileSyncStartDownloadReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.FileSyncStartDownloadReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.FileSyncStartDownloadReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.FileSyncStartDownloadReplyBody();
            if (object.startedDownload != null) {
                if (!$util.isObject(object.startedDownload))
                    throw TypeError(".file.FileSyncStartDownloadReplyBody.startedDownload: object expected");
                message.startedDownload = $root.file.FileSyncStartDownloadReplyBody.DownloadInfo.fromObject(object.startedDownload, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a FileSyncStartDownloadReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {file.FileSyncStartDownloadReplyBody} message FileSyncStartDownloadReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileSyncStartDownloadReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.startedDownload = null;
            if (message.startedDownload != null && Object.hasOwnProperty.call(message, "startedDownload"))
                object.startedDownload = $root.file.FileSyncStartDownloadReplyBody.DownloadInfo.toObject(message.startedDownload, options, q + 1);
            return object;
        };

        /**
         * Converts this FileSyncStartDownloadReplyBody to JSON.
         * @function toJSON
         * @memberof file.FileSyncStartDownloadReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileSyncStartDownloadReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileSyncStartDownloadReplyBody
         * @function getTypeUrl
         * @memberof file.FileSyncStartDownloadReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileSyncStartDownloadReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.FileSyncStartDownloadReplyBody";
        };

        FileSyncStartDownloadReplyBody.DownloadInfo = (function() {

            /**
             * Properties of a DownloadInfo.
             * @memberof file.FileSyncStartDownloadReplyBody
             * @interface IDownloadInfo
             * @property {number|Long|null} [downloadTaskId] DownloadInfo downloadTaskId
             */

            /**
             * Constructs a new DownloadInfo.
             * @memberof file.FileSyncStartDownloadReplyBody
             * @classdesc Represents a DownloadInfo.
             * @implements IDownloadInfo
             * @constructor
             * @param {file.FileSyncStartDownloadReplyBody.IDownloadInfo=} [properties] Properties to set
             */
            function DownloadInfo(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * DownloadInfo downloadTaskId.
             * @member {number|Long} downloadTaskId
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @instance
             */
            DownloadInfo.prototype.downloadTaskId = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

            /**
             * Creates a new DownloadInfo instance using the specified properties.
             * @function create
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {file.FileSyncStartDownloadReplyBody.IDownloadInfo=} [properties] Properties to set
             * @returns {file.FileSyncStartDownloadReplyBody.DownloadInfo} DownloadInfo instance
             */
            DownloadInfo.create = function create(properties) {
                return new DownloadInfo(properties);
            };

            /**
             * Encodes the specified DownloadInfo message. Does not implicitly {@link file.FileSyncStartDownloadReplyBody.DownloadInfo.verify|verify} messages.
             * @function encode
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {file.FileSyncStartDownloadReplyBody.IDownloadInfo} message DownloadInfo message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            DownloadInfo.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.downloadTaskId != null && Object.hasOwnProperty.call(message, "downloadTaskId"))
                    writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.downloadTaskId);
                return writer;
            };

            /**
             * Encodes the specified DownloadInfo message, length delimited. Does not implicitly {@link file.FileSyncStartDownloadReplyBody.DownloadInfo.verify|verify} messages.
             * @function encodeDelimited
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {file.FileSyncStartDownloadReplyBody.IDownloadInfo} message DownloadInfo message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            DownloadInfo.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes a DownloadInfo message from the specified reader or buffer.
             * @function decode
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {file.FileSyncStartDownloadReplyBody.DownloadInfo} DownloadInfo
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            DownloadInfo.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncStartDownloadReplyBody.DownloadInfo();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 2: {
                            message.downloadTaskId = reader.uint64();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a DownloadInfo message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {file.FileSyncStartDownloadReplyBody.DownloadInfo} DownloadInfo
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            DownloadInfo.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a DownloadInfo message.
             * @function verify
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            DownloadInfo.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.downloadTaskId != null && Object.hasOwnProperty.call(message, "downloadTaskId"))
                    if (!$util.isInteger(message.downloadTaskId) && !(message.downloadTaskId && $util.isInteger(message.downloadTaskId.low) && $util.isInteger(message.downloadTaskId.high)))
                        return "downloadTaskId: integer|Long expected";
                return null;
            };

            /**
             * Creates a DownloadInfo message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {file.FileSyncStartDownloadReplyBody.DownloadInfo} DownloadInfo
             */
            DownloadInfo.fromObject = function fromObject(object, long) {
                if (object instanceof $root.file.FileSyncStartDownloadReplyBody.DownloadInfo)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".file.FileSyncStartDownloadReplyBody.DownloadInfo: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.file.FileSyncStartDownloadReplyBody.DownloadInfo();
                if (object.downloadTaskId != null)
                    if ($util.Long)
                        message.downloadTaskId = $util.Long.fromValue(object.downloadTaskId, true);
                    else if (typeof object.downloadTaskId === "string")
                        message.downloadTaskId = parseInt(object.downloadTaskId, 10);
                    else if (typeof object.downloadTaskId === "number")
                        message.downloadTaskId = object.downloadTaskId;
                    else if (typeof object.downloadTaskId === "object")
                        message.downloadTaskId = new $util.LongBits(object.downloadTaskId.low >>> 0, object.downloadTaskId.high >>> 0).toNumber(true);
                return message;
            };

            /**
             * Creates a plain object from a DownloadInfo message. Also converts values to other types if specified.
             * @function toObject
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {file.FileSyncStartDownloadReplyBody.DownloadInfo} message DownloadInfo
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            DownloadInfo.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults)
                    if ($util.Long) {
                        var long = new $util.Long(0, 0, true);
                        object.downloadTaskId = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                    } else
                        object.downloadTaskId = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                if (message.downloadTaskId != null && Object.hasOwnProperty.call(message, "downloadTaskId"))
                    if (typeof BigInt !== "undefined" && options.longs === BigInt)
                        object.downloadTaskId = typeof message.downloadTaskId === "number" ? BigInt(message.downloadTaskId) : $util.Long.fromBits(message.downloadTaskId.low >>> 0, message.downloadTaskId.high >>> 0, true).toBigInt();
                    else if (typeof message.downloadTaskId === "number")
                        object.downloadTaskId = options.longs === String ? String(message.downloadTaskId) : message.downloadTaskId;
                    else
                        object.downloadTaskId = options.longs === String ? $util.Long.prototype.toString.call(message.downloadTaskId) : options.longs === Number ? new $util.LongBits(message.downloadTaskId.low >>> 0, message.downloadTaskId.high >>> 0).toNumber(true) : message.downloadTaskId;
                return object;
            };

            /**
             * Converts this DownloadInfo to JSON.
             * @function toJSON
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            DownloadInfo.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for DownloadInfo
             * @function getTypeUrl
             * @memberof file.FileSyncStartDownloadReplyBody.DownloadInfo
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            DownloadInfo.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/file.FileSyncStartDownloadReplyBody.DownloadInfo";
            };

            return DownloadInfo;
        })();

        return FileSyncStartDownloadReplyBody;
    })();

    file.AdoptRemoteRequestBody = (function() {

        /**
         * Properties of an AdoptRemoteRequestBody.
         * @memberof file
         * @interface IAdoptRemoteRequestBody
         * @property {file.IOptionsToAdopteRemote|null} [opts] AdoptRemoteRequestBody opts
         */

        /**
         * Constructs a new AdoptRemoteRequestBody.
         * @memberof file
         * @classdesc Represents an AdoptRemoteRequestBody.
         * @implements IAdoptRemoteRequestBody
         * @constructor
         * @param {file.IAdoptRemoteRequestBody=} [properties] Properties to set
         */
        function AdoptRemoteRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * AdoptRemoteRequestBody opts.
         * @member {file.IOptionsToAdopteRemote|null|undefined} opts
         * @memberof file.AdoptRemoteRequestBody
         * @instance
         */
        AdoptRemoteRequestBody.prototype.opts = null;

        /**
         * Creates a new AdoptRemoteRequestBody instance using the specified properties.
         * @function create
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {file.IAdoptRemoteRequestBody=} [properties] Properties to set
         * @returns {file.AdoptRemoteRequestBody} AdoptRemoteRequestBody instance
         */
        AdoptRemoteRequestBody.create = function create(properties) {
            return new AdoptRemoteRequestBody(properties);
        };

        /**
         * Encodes the specified AdoptRemoteRequestBody message. Does not implicitly {@link file.AdoptRemoteRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {file.IAdoptRemoteRequestBody} message AdoptRemoteRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AdoptRemoteRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.file.OptionsToAdopteRemote.encode(message.opts, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified AdoptRemoteRequestBody message, length delimited. Does not implicitly {@link file.AdoptRemoteRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {file.IAdoptRemoteRequestBody} message AdoptRemoteRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AdoptRemoteRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an AdoptRemoteRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.AdoptRemoteRequestBody} AdoptRemoteRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AdoptRemoteRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.AdoptRemoteRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.opts = $root.file.OptionsToAdopteRemote.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an AdoptRemoteRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.AdoptRemoteRequestBody} AdoptRemoteRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AdoptRemoteRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an AdoptRemoteRequestBody message.
         * @function verify
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        AdoptRemoteRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts")) {
                var error = $root.file.OptionsToAdopteRemote.verify(message.opts, long + 1);
                if (error)
                    return "opts." + error;
            }
            return null;
        };

        /**
         * Creates an AdoptRemoteRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.AdoptRemoteRequestBody} AdoptRemoteRequestBody
         */
        AdoptRemoteRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.AdoptRemoteRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.AdoptRemoteRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.AdoptRemoteRequestBody();
            if (object.opts != null) {
                if (!$util.isObject(object.opts))
                    throw TypeError(".file.AdoptRemoteRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToAdopteRemote.fromObject(object.opts, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an AdoptRemoteRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {file.AdoptRemoteRequestBody} message AdoptRemoteRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        AdoptRemoteRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.opts = null;
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                object.opts = $root.file.OptionsToAdopteRemote.toObject(message.opts, options, q + 1);
            return object;
        };

        /**
         * Converts this AdoptRemoteRequestBody to JSON.
         * @function toJSON
         * @memberof file.AdoptRemoteRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        AdoptRemoteRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for AdoptRemoteRequestBody
         * @function getTypeUrl
         * @memberof file.AdoptRemoteRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        AdoptRemoteRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.AdoptRemoteRequestBody";
        };

        return AdoptRemoteRequestBody;
    })();

    file.OptionsToAdopteRemote = (function() {

        /**
         * Properties of an OptionsToAdopteRemote.
         * @memberof file
         * @interface IOptionsToAdopteRemote
         * @property {common.IBooleanValue|null} [dropLocalVer] OptionsToAdopteRemote dropLocalVer
         * @property {common.IUInt64Value|null} [remoteVersion] OptionsToAdopteRemote remoteVersion
         */

        /**
         * Constructs a new OptionsToAdopteRemote.
         * @memberof file
         * @classdesc Represents an OptionsToAdopteRemote.
         * @implements IOptionsToAdopteRemote
         * @constructor
         * @param {file.IOptionsToAdopteRemote=} [properties] Properties to set
         */
        function OptionsToAdopteRemote(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * OptionsToAdopteRemote dropLocalVer.
         * @member {common.IBooleanValue|null|undefined} dropLocalVer
         * @memberof file.OptionsToAdopteRemote
         * @instance
         */
        OptionsToAdopteRemote.prototype.dropLocalVer = null;

        /**
         * OptionsToAdopteRemote remoteVersion.
         * @member {common.IUInt64Value|null|undefined} remoteVersion
         * @memberof file.OptionsToAdopteRemote
         * @instance
         */
        OptionsToAdopteRemote.prototype.remoteVersion = null;

        /**
         * Creates a new OptionsToAdopteRemote instance using the specified properties.
         * @function create
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {file.IOptionsToAdopteRemote=} [properties] Properties to set
         * @returns {file.OptionsToAdopteRemote} OptionsToAdopteRemote instance
         */
        OptionsToAdopteRemote.create = function create(properties) {
            return new OptionsToAdopteRemote(properties);
        };

        /**
         * Encodes the specified OptionsToAdopteRemote message. Does not implicitly {@link file.OptionsToAdopteRemote.verify|verify} messages.
         * @function encode
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {file.IOptionsToAdopteRemote} message OptionsToAdopteRemote message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        OptionsToAdopteRemote.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.dropLocalVer != null && Object.hasOwnProperty.call(message, "dropLocalVer"))
                $root.common.BooleanValue.encode(message.dropLocalVer, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified OptionsToAdopteRemote message, length delimited. Does not implicitly {@link file.OptionsToAdopteRemote.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {file.IOptionsToAdopteRemote} message OptionsToAdopteRemote message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        OptionsToAdopteRemote.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an OptionsToAdopteRemote message from the specified reader or buffer.
         * @function decode
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.OptionsToAdopteRemote} OptionsToAdopteRemote
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        OptionsToAdopteRemote.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.OptionsToAdopteRemote();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.dropLocalVer = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an OptionsToAdopteRemote message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.OptionsToAdopteRemote} OptionsToAdopteRemote
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        OptionsToAdopteRemote.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an OptionsToAdopteRemote message.
         * @function verify
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        OptionsToAdopteRemote.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.dropLocalVer != null && Object.hasOwnProperty.call(message, "dropLocalVer")) {
                var error = $root.common.BooleanValue.verify(message.dropLocalVer, long + 1);
                if (error)
                    return "dropLocalVer." + error;
            }
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion, long + 1);
                if (error)
                    return "remoteVersion." + error;
            }
            return null;
        };

        /**
         * Creates an OptionsToAdopteRemote message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.OptionsToAdopteRemote} OptionsToAdopteRemote
         */
        OptionsToAdopteRemote.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.OptionsToAdopteRemote)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.OptionsToAdopteRemote: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.OptionsToAdopteRemote();
            if (object.dropLocalVer != null) {
                if (!$util.isObject(object.dropLocalVer))
                    throw TypeError(".file.OptionsToAdopteRemote.dropLocalVer: object expected");
                message.dropLocalVer = $root.common.BooleanValue.fromObject(object.dropLocalVer, long + 1);
            }
            if (object.remoteVersion != null) {
                if (!$util.isObject(object.remoteVersion))
                    throw TypeError(".file.OptionsToAdopteRemote.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an OptionsToAdopteRemote message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {file.OptionsToAdopteRemote} message OptionsToAdopteRemote
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        OptionsToAdopteRemote.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.dropLocalVer = null;
                object.remoteVersion = null;
            }
            if (message.dropLocalVer != null && Object.hasOwnProperty.call(message, "dropLocalVer"))
                object.dropLocalVer = $root.common.BooleanValue.toObject(message.dropLocalVer, options, q + 1);
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options, q + 1);
            return object;
        };

        /**
         * Converts this OptionsToAdopteRemote to JSON.
         * @function toJSON
         * @memberof file.OptionsToAdopteRemote
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        OptionsToAdopteRemote.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for OptionsToAdopteRemote
         * @function getTypeUrl
         * @memberof file.OptionsToAdopteRemote
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        OptionsToAdopteRemote.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.OptionsToAdopteRemote";
        };

        return OptionsToAdopteRemote;
    })();

    file.DiffCurrentAndRemoteRequestBody = (function() {

        /**
         * Properties of a DiffCurrentAndRemoteRequestBody.
         * @memberof file
         * @interface IDiffCurrentAndRemoteRequestBody
         * @property {file.IOptionsToDiffFileVersions|null} [opts] DiffCurrentAndRemoteRequestBody opts
         */

        /**
         * Constructs a new DiffCurrentAndRemoteRequestBody.
         * @memberof file
         * @classdesc Represents a DiffCurrentAndRemoteRequestBody.
         * @implements IDiffCurrentAndRemoteRequestBody
         * @constructor
         * @param {file.IDiffCurrentAndRemoteRequestBody=} [properties] Properties to set
         */
        function DiffCurrentAndRemoteRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * DiffCurrentAndRemoteRequestBody opts.
         * @member {file.IOptionsToDiffFileVersions|null|undefined} opts
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @instance
         */
        DiffCurrentAndRemoteRequestBody.prototype.opts = null;

        /**
         * Creates a new DiffCurrentAndRemoteRequestBody instance using the specified properties.
         * @function create
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {file.IDiffCurrentAndRemoteRequestBody=} [properties] Properties to set
         * @returns {file.DiffCurrentAndRemoteRequestBody} DiffCurrentAndRemoteRequestBody instance
         */
        DiffCurrentAndRemoteRequestBody.create = function create(properties) {
            return new DiffCurrentAndRemoteRequestBody(properties);
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteRequestBody message. Does not implicitly {@link file.DiffCurrentAndRemoteRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {file.IDiffCurrentAndRemoteRequestBody} message DiffCurrentAndRemoteRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.file.OptionsToDiffFileVersions.encode(message.opts, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteRequestBody message, length delimited. Does not implicitly {@link file.DiffCurrentAndRemoteRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {file.IDiffCurrentAndRemoteRequestBody} message DiffCurrentAndRemoteRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a DiffCurrentAndRemoteRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.DiffCurrentAndRemoteRequestBody} DiffCurrentAndRemoteRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.DiffCurrentAndRemoteRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.opts = $root.file.OptionsToDiffFileVersions.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a DiffCurrentAndRemoteRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.DiffCurrentAndRemoteRequestBody} DiffCurrentAndRemoteRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a DiffCurrentAndRemoteRequestBody message.
         * @function verify
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        DiffCurrentAndRemoteRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts")) {
                var error = $root.file.OptionsToDiffFileVersions.verify(message.opts, long + 1);
                if (error)
                    return "opts." + error;
            }
            return null;
        };

        /**
         * Creates a DiffCurrentAndRemoteRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.DiffCurrentAndRemoteRequestBody} DiffCurrentAndRemoteRequestBody
         */
        DiffCurrentAndRemoteRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.DiffCurrentAndRemoteRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.DiffCurrentAndRemoteRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.DiffCurrentAndRemoteRequestBody();
            if (object.opts != null) {
                if (!$util.isObject(object.opts))
                    throw TypeError(".file.DiffCurrentAndRemoteRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToDiffFileVersions.fromObject(object.opts, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a DiffCurrentAndRemoteRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {file.DiffCurrentAndRemoteRequestBody} message DiffCurrentAndRemoteRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        DiffCurrentAndRemoteRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.opts = null;
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                object.opts = $root.file.OptionsToDiffFileVersions.toObject(message.opts, options, q + 1);
            return object;
        };

        /**
         * Converts this DiffCurrentAndRemoteRequestBody to JSON.
         * @function toJSON
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        DiffCurrentAndRemoteRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for DiffCurrentAndRemoteRequestBody
         * @function getTypeUrl
         * @memberof file.DiffCurrentAndRemoteRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        DiffCurrentAndRemoteRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.DiffCurrentAndRemoteRequestBody";
        };

        return DiffCurrentAndRemoteRequestBody;
    })();

    file.DiffCurrentAndRemoteReplyBody = (function() {

        /**
         * Properties of a DiffCurrentAndRemoteReplyBody.
         * @memberof file
         * @interface IDiffCurrentAndRemoteReplyBody
         * @property {file.IFileDiff|null} [diff] DiffCurrentAndRemoteReplyBody diff
         */

        /**
         * Constructs a new DiffCurrentAndRemoteReplyBody.
         * @memberof file
         * @classdesc Represents a DiffCurrentAndRemoteReplyBody.
         * @implements IDiffCurrentAndRemoteReplyBody
         * @constructor
         * @param {file.IDiffCurrentAndRemoteReplyBody=} [properties] Properties to set
         */
        function DiffCurrentAndRemoteReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * DiffCurrentAndRemoteReplyBody diff.
         * @member {file.IFileDiff|null|undefined} diff
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @instance
         */
        DiffCurrentAndRemoteReplyBody.prototype.diff = null;

        /**
         * Creates a new DiffCurrentAndRemoteReplyBody instance using the specified properties.
         * @function create
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {file.IDiffCurrentAndRemoteReplyBody=} [properties] Properties to set
         * @returns {file.DiffCurrentAndRemoteReplyBody} DiffCurrentAndRemoteReplyBody instance
         */
        DiffCurrentAndRemoteReplyBody.create = function create(properties) {
            return new DiffCurrentAndRemoteReplyBody(properties);
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteReplyBody message. Does not implicitly {@link file.DiffCurrentAndRemoteReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {file.IDiffCurrentAndRemoteReplyBody} message DiffCurrentAndRemoteReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.diff != null && Object.hasOwnProperty.call(message, "diff"))
                $root.file.FileDiff.encode(message.diff, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteReplyBody message, length delimited. Does not implicitly {@link file.DiffCurrentAndRemoteReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {file.IDiffCurrentAndRemoteReplyBody} message DiffCurrentAndRemoteReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a DiffCurrentAndRemoteReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.DiffCurrentAndRemoteReplyBody} DiffCurrentAndRemoteReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.DiffCurrentAndRemoteReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.diff = $root.file.FileDiff.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a DiffCurrentAndRemoteReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.DiffCurrentAndRemoteReplyBody} DiffCurrentAndRemoteReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a DiffCurrentAndRemoteReplyBody message.
         * @function verify
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        DiffCurrentAndRemoteReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.diff != null && Object.hasOwnProperty.call(message, "diff")) {
                var error = $root.file.FileDiff.verify(message.diff, long + 1);
                if (error)
                    return "diff." + error;
            }
            return null;
        };

        /**
         * Creates a DiffCurrentAndRemoteReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.DiffCurrentAndRemoteReplyBody} DiffCurrentAndRemoteReplyBody
         */
        DiffCurrentAndRemoteReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.DiffCurrentAndRemoteReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.DiffCurrentAndRemoteReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.DiffCurrentAndRemoteReplyBody();
            if (object.diff != null) {
                if (!$util.isObject(object.diff))
                    throw TypeError(".file.DiffCurrentAndRemoteReplyBody.diff: object expected");
                message.diff = $root.file.FileDiff.fromObject(object.diff, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a DiffCurrentAndRemoteReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {file.DiffCurrentAndRemoteReplyBody} message DiffCurrentAndRemoteReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        DiffCurrentAndRemoteReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.diff = null;
            if (message.diff != null && Object.hasOwnProperty.call(message, "diff"))
                object.diff = $root.file.FileDiff.toObject(message.diff, options, q + 1);
            return object;
        };

        /**
         * Converts this DiffCurrentAndRemoteReplyBody to JSON.
         * @function toJSON
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        DiffCurrentAndRemoteReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for DiffCurrentAndRemoteReplyBody
         * @function getTypeUrl
         * @memberof file.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        DiffCurrentAndRemoteReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.DiffCurrentAndRemoteReplyBody";
        };

        return DiffCurrentAndRemoteReplyBody;
    })();

    file.OptionsToDiffFileVersions = (function() {

        /**
         * Properties of an OptionsToDiffFileVersions.
         * @memberof file
         * @interface IOptionsToDiffFileVersions
         * @property {common.IUInt64Value|null} [remoteVersion] OptionsToDiffFileVersions remoteVersion
         * @property {common.IBooleanValue|null} [compareContentIfSameMTime] OptionsToDiffFileVersions compareContentIfSameMTime
         */

        /**
         * Constructs a new OptionsToDiffFileVersions.
         * @memberof file
         * @classdesc Represents an OptionsToDiffFileVersions.
         * @implements IOptionsToDiffFileVersions
         * @constructor
         * @param {file.IOptionsToDiffFileVersions=} [properties] Properties to set
         */
        function OptionsToDiffFileVersions(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * OptionsToDiffFileVersions remoteVersion.
         * @member {common.IUInt64Value|null|undefined} remoteVersion
         * @memberof file.OptionsToDiffFileVersions
         * @instance
         */
        OptionsToDiffFileVersions.prototype.remoteVersion = null;

        /**
         * OptionsToDiffFileVersions compareContentIfSameMTime.
         * @member {common.IBooleanValue|null|undefined} compareContentIfSameMTime
         * @memberof file.OptionsToDiffFileVersions
         * @instance
         */
        OptionsToDiffFileVersions.prototype.compareContentIfSameMTime = null;

        /**
         * Creates a new OptionsToDiffFileVersions instance using the specified properties.
         * @function create
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {file.IOptionsToDiffFileVersions=} [properties] Properties to set
         * @returns {file.OptionsToDiffFileVersions} OptionsToDiffFileVersions instance
         */
        OptionsToDiffFileVersions.create = function create(properties) {
            return new OptionsToDiffFileVersions(properties);
        };

        /**
         * Encodes the specified OptionsToDiffFileVersions message. Does not implicitly {@link file.OptionsToDiffFileVersions.verify|verify} messages.
         * @function encode
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {file.IOptionsToDiffFileVersions} message OptionsToDiffFileVersions message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        OptionsToDiffFileVersions.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.compareContentIfSameMTime != null && Object.hasOwnProperty.call(message, "compareContentIfSameMTime"))
                $root.common.BooleanValue.encode(message.compareContentIfSameMTime, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified OptionsToDiffFileVersions message, length delimited. Does not implicitly {@link file.OptionsToDiffFileVersions.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {file.IOptionsToDiffFileVersions} message OptionsToDiffFileVersions message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        OptionsToDiffFileVersions.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an OptionsToDiffFileVersions message from the specified reader or buffer.
         * @function decode
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.OptionsToDiffFileVersions} OptionsToDiffFileVersions
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        OptionsToDiffFileVersions.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.OptionsToDiffFileVersions();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.compareContentIfSameMTime = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an OptionsToDiffFileVersions message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.OptionsToDiffFileVersions} OptionsToDiffFileVersions
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        OptionsToDiffFileVersions.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an OptionsToDiffFileVersions message.
         * @function verify
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        OptionsToDiffFileVersions.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion, long + 1);
                if (error)
                    return "remoteVersion." + error;
            }
            if (message.compareContentIfSameMTime != null && Object.hasOwnProperty.call(message, "compareContentIfSameMTime")) {
                var error = $root.common.BooleanValue.verify(message.compareContentIfSameMTime, long + 1);
                if (error)
                    return "compareContentIfSameMTime." + error;
            }
            return null;
        };

        /**
         * Creates an OptionsToDiffFileVersions message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.OptionsToDiffFileVersions} OptionsToDiffFileVersions
         */
        OptionsToDiffFileVersions.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.OptionsToDiffFileVersions)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.OptionsToDiffFileVersions: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.OptionsToDiffFileVersions();
            if (object.remoteVersion != null) {
                if (!$util.isObject(object.remoteVersion))
                    throw TypeError(".file.OptionsToDiffFileVersions.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion, long + 1);
            }
            if (object.compareContentIfSameMTime != null) {
                if (!$util.isObject(object.compareContentIfSameMTime))
                    throw TypeError(".file.OptionsToDiffFileVersions.compareContentIfSameMTime: object expected");
                message.compareContentIfSameMTime = $root.common.BooleanValue.fromObject(object.compareContentIfSameMTime, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an OptionsToDiffFileVersions message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {file.OptionsToDiffFileVersions} message OptionsToDiffFileVersions
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        OptionsToDiffFileVersions.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.remoteVersion = null;
                object.compareContentIfSameMTime = null;
            }
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options, q + 1);
            if (message.compareContentIfSameMTime != null && Object.hasOwnProperty.call(message, "compareContentIfSameMTime"))
                object.compareContentIfSameMTime = $root.common.BooleanValue.toObject(message.compareContentIfSameMTime, options, q + 1);
            return object;
        };

        /**
         * Converts this OptionsToDiffFileVersions to JSON.
         * @function toJSON
         * @memberof file.OptionsToDiffFileVersions
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        OptionsToDiffFileVersions.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for OptionsToDiffFileVersions
         * @function getTypeUrl
         * @memberof file.OptionsToDiffFileVersions
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        OptionsToDiffFileVersions.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.OptionsToDiffFileVersions";
        };

        return OptionsToDiffFileVersions;
    })();

    file.TimeStampsDiff = (function() {

        /**
         * Properties of a TimeStampsDiff.
         * @memberof file
         * @interface ITimeStampsDiff
         * @property {number|Long|null} [current] TimeStampsDiff current
         * @property {number|Long|null} [remote] TimeStampsDiff remote
         * @property {number|Long|null} [synced] TimeStampsDiff synced
         */

        /**
         * Constructs a new TimeStampsDiff.
         * @memberof file
         * @classdesc Represents a TimeStampsDiff.
         * @implements ITimeStampsDiff
         * @constructor
         * @param {file.ITimeStampsDiff=} [properties] Properties to set
         */
        function TimeStampsDiff(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * TimeStampsDiff current.
         * @member {number|Long} current
         * @memberof file.TimeStampsDiff
         * @instance
         */
        TimeStampsDiff.prototype.current = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * TimeStampsDiff remote.
         * @member {number|Long} remote
         * @memberof file.TimeStampsDiff
         * @instance
         */
        TimeStampsDiff.prototype.remote = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * TimeStampsDiff synced.
         * @member {number|Long} synced
         * @memberof file.TimeStampsDiff
         * @instance
         */
        TimeStampsDiff.prototype.synced = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new TimeStampsDiff instance using the specified properties.
         * @function create
         * @memberof file.TimeStampsDiff
         * @static
         * @param {file.ITimeStampsDiff=} [properties] Properties to set
         * @returns {file.TimeStampsDiff} TimeStampsDiff instance
         */
        TimeStampsDiff.create = function create(properties) {
            return new TimeStampsDiff(properties);
        };

        /**
         * Encodes the specified TimeStampsDiff message. Does not implicitly {@link file.TimeStampsDiff.verify|verify} messages.
         * @function encode
         * @memberof file.TimeStampsDiff
         * @static
         * @param {file.ITimeStampsDiff} message TimeStampsDiff message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        TimeStampsDiff.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.current);
            if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.remote);
            if (message.synced != null && Object.hasOwnProperty.call(message, "synced"))
                writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.synced);
            return writer;
        };

        /**
         * Encodes the specified TimeStampsDiff message, length delimited. Does not implicitly {@link file.TimeStampsDiff.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.TimeStampsDiff
         * @static
         * @param {file.ITimeStampsDiff} message TimeStampsDiff message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        TimeStampsDiff.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a TimeStampsDiff message from the specified reader or buffer.
         * @function decode
         * @memberof file.TimeStampsDiff
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.TimeStampsDiff} TimeStampsDiff
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        TimeStampsDiff.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.TimeStampsDiff();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.current = reader.uint64();
                        break;
                    }
                case 2: {
                        message.remote = reader.uint64();
                        break;
                    }
                case 3: {
                        message.synced = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a TimeStampsDiff message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.TimeStampsDiff
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.TimeStampsDiff} TimeStampsDiff
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        TimeStampsDiff.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a TimeStampsDiff message.
         * @function verify
         * @memberof file.TimeStampsDiff
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        TimeStampsDiff.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                if (!$util.isInteger(message.current) && !(message.current && $util.isInteger(message.current.low) && $util.isInteger(message.current.high)))
                    return "current: integer|Long expected";
            if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                if (!$util.isInteger(message.remote) && !(message.remote && $util.isInteger(message.remote.low) && $util.isInteger(message.remote.high)))
                    return "remote: integer|Long expected";
            if (message.synced != null && Object.hasOwnProperty.call(message, "synced"))
                if (!$util.isInteger(message.synced) && !(message.synced && $util.isInteger(message.synced.low) && $util.isInteger(message.synced.high)))
                    return "synced: integer|Long expected";
            return null;
        };

        /**
         * Creates a TimeStampsDiff message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.TimeStampsDiff
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.TimeStampsDiff} TimeStampsDiff
         */
        TimeStampsDiff.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.TimeStampsDiff)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.TimeStampsDiff: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.TimeStampsDiff();
            if (object.current != null)
                if ($util.Long)
                    message.current = $util.Long.fromValue(object.current, true);
                else if (typeof object.current === "string")
                    message.current = parseInt(object.current, 10);
                else if (typeof object.current === "number")
                    message.current = object.current;
                else if (typeof object.current === "object")
                    message.current = new $util.LongBits(object.current.low >>> 0, object.current.high >>> 0).toNumber(true);
            if (object.remote != null)
                if ($util.Long)
                    message.remote = $util.Long.fromValue(object.remote, true);
                else if (typeof object.remote === "string")
                    message.remote = parseInt(object.remote, 10);
                else if (typeof object.remote === "number")
                    message.remote = object.remote;
                else if (typeof object.remote === "object")
                    message.remote = new $util.LongBits(object.remote.low >>> 0, object.remote.high >>> 0).toNumber(true);
            if (object.synced != null)
                if ($util.Long)
                    message.synced = $util.Long.fromValue(object.synced, true);
                else if (typeof object.synced === "string")
                    message.synced = parseInt(object.synced, 10);
                else if (typeof object.synced === "number")
                    message.synced = object.synced;
                else if (typeof object.synced === "object")
                    message.synced = new $util.LongBits(object.synced.low >>> 0, object.synced.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from a TimeStampsDiff message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.TimeStampsDiff
         * @static
         * @param {file.TimeStampsDiff} message TimeStampsDiff
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        TimeStampsDiff.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.current = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.current = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.remote = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.remote = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.synced = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.synced = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            }
            if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.current = typeof message.current === "number" ? BigInt(message.current) : $util.Long.fromBits(message.current.low >>> 0, message.current.high >>> 0, true).toBigInt();
                else if (typeof message.current === "number")
                    object.current = options.longs === String ? String(message.current) : message.current;
                else
                    object.current = options.longs === String ? $util.Long.prototype.toString.call(message.current) : options.longs === Number ? new $util.LongBits(message.current.low >>> 0, message.current.high >>> 0).toNumber(true) : message.current;
            if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.remote = typeof message.remote === "number" ? BigInt(message.remote) : $util.Long.fromBits(message.remote.low >>> 0, message.remote.high >>> 0, true).toBigInt();
                else if (typeof message.remote === "number")
                    object.remote = options.longs === String ? String(message.remote) : message.remote;
                else
                    object.remote = options.longs === String ? $util.Long.prototype.toString.call(message.remote) : options.longs === Number ? new $util.LongBits(message.remote.low >>> 0, message.remote.high >>> 0).toNumber(true) : message.remote;
            if (message.synced != null && Object.hasOwnProperty.call(message, "synced"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.synced = typeof message.synced === "number" ? BigInt(message.synced) : $util.Long.fromBits(message.synced.low >>> 0, message.synced.high >>> 0, true).toBigInt();
                else if (typeof message.synced === "number")
                    object.synced = options.longs === String ? String(message.synced) : message.synced;
                else
                    object.synced = options.longs === String ? $util.Long.prototype.toString.call(message.synced) : options.longs === Number ? new $util.LongBits(message.synced.low >>> 0, message.synced.high >>> 0).toNumber(true) : message.synced;
            return object;
        };

        /**
         * Converts this TimeStampsDiff to JSON.
         * @function toJSON
         * @memberof file.TimeStampsDiff
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        TimeStampsDiff.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for TimeStampsDiff
         * @function getTypeUrl
         * @memberof file.TimeStampsDiff
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        TimeStampsDiff.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.TimeStampsDiff";
        };

        return TimeStampsDiff;
    })();

    file.XAttrDiff = (function() {

        /**
         * Properties of a XAttrDiff.
         * @memberof file
         * @interface IXAttrDiff
         * @property {string|null} [name] XAttrDiff name
         * @property {common.IStringValue|null} [addedIn] XAttrDiff addedIn
         * @property {common.IStringValue|null} [removedIn] XAttrDiff removedIn
         * @property {common.IStringValue|null} [changedIn] XAttrDiff changedIn
         */

        /**
         * Constructs a new XAttrDiff.
         * @memberof file
         * @classdesc Represents a XAttrDiff.
         * @implements IXAttrDiff
         * @constructor
         * @param {file.IXAttrDiff=} [properties] Properties to set
         */
        function XAttrDiff(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * XAttrDiff name.
         * @member {string} name
         * @memberof file.XAttrDiff
         * @instance
         */
        XAttrDiff.prototype.name = "";

        /**
         * XAttrDiff addedIn.
         * @member {common.IStringValue|null|undefined} addedIn
         * @memberof file.XAttrDiff
         * @instance
         */
        XAttrDiff.prototype.addedIn = null;

        /**
         * XAttrDiff removedIn.
         * @member {common.IStringValue|null|undefined} removedIn
         * @memberof file.XAttrDiff
         * @instance
         */
        XAttrDiff.prototype.removedIn = null;

        /**
         * XAttrDiff changedIn.
         * @member {common.IStringValue|null|undefined} changedIn
         * @memberof file.XAttrDiff
         * @instance
         */
        XAttrDiff.prototype.changedIn = null;

        /**
         * Creates a new XAttrDiff instance using the specified properties.
         * @function create
         * @memberof file.XAttrDiff
         * @static
         * @param {file.IXAttrDiff=} [properties] Properties to set
         * @returns {file.XAttrDiff} XAttrDiff instance
         */
        XAttrDiff.create = function create(properties) {
            return new XAttrDiff(properties);
        };

        /**
         * Encodes the specified XAttrDiff message. Does not implicitly {@link file.XAttrDiff.verify|verify} messages.
         * @function encode
         * @memberof file.XAttrDiff
         * @static
         * @param {file.IXAttrDiff} message XAttrDiff message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        XAttrDiff.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
            if (message.addedIn != null && Object.hasOwnProperty.call(message, "addedIn"))
                $root.common.StringValue.encode(message.addedIn, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.removedIn != null && Object.hasOwnProperty.call(message, "removedIn"))
                $root.common.StringValue.encode(message.removedIn, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.changedIn != null && Object.hasOwnProperty.call(message, "changedIn"))
                $root.common.StringValue.encode(message.changedIn, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified XAttrDiff message, length delimited. Does not implicitly {@link file.XAttrDiff.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.XAttrDiff
         * @static
         * @param {file.IXAttrDiff} message XAttrDiff message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        XAttrDiff.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a XAttrDiff message from the specified reader or buffer.
         * @function decode
         * @memberof file.XAttrDiff
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.XAttrDiff} XAttrDiff
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        XAttrDiff.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.XAttrDiff();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.name = reader.string();
                        break;
                    }
                case 2: {
                        message.addedIn = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.removedIn = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.changedIn = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a XAttrDiff message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.XAttrDiff
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.XAttrDiff} XAttrDiff
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        XAttrDiff.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a XAttrDiff message.
         * @function verify
         * @memberof file.XAttrDiff
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        XAttrDiff.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.addedIn != null && Object.hasOwnProperty.call(message, "addedIn")) {
                var error = $root.common.StringValue.verify(message.addedIn, long + 1);
                if (error)
                    return "addedIn." + error;
            }
            if (message.removedIn != null && Object.hasOwnProperty.call(message, "removedIn")) {
                var error = $root.common.StringValue.verify(message.removedIn, long + 1);
                if (error)
                    return "removedIn." + error;
            }
            if (message.changedIn != null && Object.hasOwnProperty.call(message, "changedIn")) {
                var error = $root.common.StringValue.verify(message.changedIn, long + 1);
                if (error)
                    return "changedIn." + error;
            }
            return null;
        };

        /**
         * Creates a XAttrDiff message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.XAttrDiff
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.XAttrDiff} XAttrDiff
         */
        XAttrDiff.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.XAttrDiff)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.XAttrDiff: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.XAttrDiff();
            if (object.name != null)
                message.name = String(object.name);
            if (object.addedIn != null) {
                if (!$util.isObject(object.addedIn))
                    throw TypeError(".file.XAttrDiff.addedIn: object expected");
                message.addedIn = $root.common.StringValue.fromObject(object.addedIn, long + 1);
            }
            if (object.removedIn != null) {
                if (!$util.isObject(object.removedIn))
                    throw TypeError(".file.XAttrDiff.removedIn: object expected");
                message.removedIn = $root.common.StringValue.fromObject(object.removedIn, long + 1);
            }
            if (object.changedIn != null) {
                if (!$util.isObject(object.changedIn))
                    throw TypeError(".file.XAttrDiff.changedIn: object expected");
                message.changedIn = $root.common.StringValue.fromObject(object.changedIn, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a XAttrDiff message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.XAttrDiff
         * @static
         * @param {file.XAttrDiff} message XAttrDiff
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        XAttrDiff.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.name = "";
                object.addedIn = null;
                object.removedIn = null;
                object.changedIn = null;
            }
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                object.name = message.name;
            if (message.addedIn != null && Object.hasOwnProperty.call(message, "addedIn"))
                object.addedIn = $root.common.StringValue.toObject(message.addedIn, options, q + 1);
            if (message.removedIn != null && Object.hasOwnProperty.call(message, "removedIn"))
                object.removedIn = $root.common.StringValue.toObject(message.removedIn, options, q + 1);
            if (message.changedIn != null && Object.hasOwnProperty.call(message, "changedIn"))
                object.changedIn = $root.common.StringValue.toObject(message.changedIn, options, q + 1);
            return object;
        };

        /**
         * Converts this XAttrDiff to JSON.
         * @function toJSON
         * @memberof file.XAttrDiff
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        XAttrDiff.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for XAttrDiff
         * @function getTypeUrl
         * @memberof file.XAttrDiff
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        XAttrDiff.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.XAttrDiff";
        };

        return XAttrDiff;
    })();

    file.FileDiff = (function() {

        /**
         * Properties of a FileDiff.
         * @memberof file
         * @interface IFileDiff
         * @property {number|Long|null} [currentVersion] FileDiff currentVersion
         * @property {boolean|null} [isCurrentLocal] FileDiff isCurrentLocal
         * @property {common.IUInt64Value|null} [remoteVersion] FileDiff remoteVersion
         * @property {common.IUInt64Value|null} [syncedVersion] FileDiff syncedVersion
         * @property {boolean|null} [isRemoteRemoved] FileDiff isRemoteRemoved
         * @property {file.ITimeStampsDiff|null} [ctime] FileDiff ctime
         * @property {file.ITimeStampsDiff|null} [mtime] FileDiff mtime
         * @property {Array.<file.IXAttrDiff>|null} [xattrs] FileDiff xattrs
         * @property {boolean|null} [areContentsSame] FileDiff areContentsSame
         * @property {file.FileDiff.ISize|null} [size] FileDiff size
         */

        /**
         * Constructs a new FileDiff.
         * @memberof file
         * @classdesc Represents a FileDiff.
         * @implements IFileDiff
         * @constructor
         * @param {file.IFileDiff=} [properties] Properties to set
         */
        function FileDiff(properties) {
            this.xattrs = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileDiff currentVersion.
         * @member {number|Long} currentVersion
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.currentVersion = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * FileDiff isCurrentLocal.
         * @member {boolean} isCurrentLocal
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.isCurrentLocal = false;

        /**
         * FileDiff remoteVersion.
         * @member {common.IUInt64Value|null|undefined} remoteVersion
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.remoteVersion = null;

        /**
         * FileDiff syncedVersion.
         * @member {common.IUInt64Value|null|undefined} syncedVersion
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.syncedVersion = null;

        /**
         * FileDiff isRemoteRemoved.
         * @member {boolean} isRemoteRemoved
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.isRemoteRemoved = false;

        /**
         * FileDiff ctime.
         * @member {file.ITimeStampsDiff|null|undefined} ctime
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.ctime = null;

        /**
         * FileDiff mtime.
         * @member {file.ITimeStampsDiff|null|undefined} mtime
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.mtime = null;

        /**
         * FileDiff xattrs.
         * @member {Array.<file.IXAttrDiff>} xattrs
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.xattrs = $util.emptyArray;

        /**
         * FileDiff areContentsSame.
         * @member {boolean} areContentsSame
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.areContentsSame = false;

        /**
         * FileDiff size.
         * @member {file.FileDiff.ISize|null|undefined} size
         * @memberof file.FileDiff
         * @instance
         */
        FileDiff.prototype.size = null;

        /**
         * Creates a new FileDiff instance using the specified properties.
         * @function create
         * @memberof file.FileDiff
         * @static
         * @param {file.IFileDiff=} [properties] Properties to set
         * @returns {file.FileDiff} FileDiff instance
         */
        FileDiff.create = function create(properties) {
            return new FileDiff(properties);
        };

        /**
         * Encodes the specified FileDiff message. Does not implicitly {@link file.FileDiff.verify|verify} messages.
         * @function encode
         * @memberof file.FileDiff
         * @static
         * @param {file.IFileDiff} message FileDiff message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileDiff.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.currentVersion);
            if (message.isCurrentLocal != null && Object.hasOwnProperty.call(message, "isCurrentLocal"))
                writer.uint32(/* id 2, wireType 0 =*/16).bool(message.isCurrentLocal);
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.syncedVersion != null && Object.hasOwnProperty.call(message, "syncedVersion"))
                $root.common.UInt64Value.encode(message.syncedVersion, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            if (message.isRemoteRemoved != null && Object.hasOwnProperty.call(message, "isRemoteRemoved"))
                writer.uint32(/* id 5, wireType 0 =*/40).bool(message.isRemoteRemoved);
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime"))
                $root.file.TimeStampsDiff.encode(message.ctime, writer.uint32(/* id 6, wireType 2 =*/50).fork(), q + 1).ldelim();
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime"))
                $root.file.TimeStampsDiff.encode(message.mtime, writer.uint32(/* id 7, wireType 2 =*/58).fork(), q + 1).ldelim();
            if (message.xattrs != null && message.xattrs.length)
                for (var i = 0; i < message.xattrs.length; ++i)
                    $root.file.XAttrDiff.encode(message.xattrs[i], writer.uint32(/* id 8, wireType 2 =*/66).fork(), q + 1).ldelim();
            if (message.areContentsSame != null && Object.hasOwnProperty.call(message, "areContentsSame"))
                writer.uint32(/* id 11, wireType 0 =*/88).bool(message.areContentsSame);
            if (message.size != null && Object.hasOwnProperty.call(message, "size"))
                $root.file.FileDiff.Size.encode(message.size, writer.uint32(/* id 12, wireType 2 =*/98).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FileDiff message, length delimited. Does not implicitly {@link file.FileDiff.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.FileDiff
         * @static
         * @param {file.IFileDiff} message FileDiff message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileDiff.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileDiff message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileDiff
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileDiff} FileDiff
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileDiff.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileDiff();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.currentVersion = reader.uint64();
                        break;
                    }
                case 2: {
                        message.isCurrentLocal = reader.bool();
                        break;
                    }
                case 3: {
                        message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.syncedVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 5: {
                        message.isRemoteRemoved = reader.bool();
                        break;
                    }
                case 6: {
                        message.ctime = $root.file.TimeStampsDiff.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 7: {
                        message.mtime = $root.file.TimeStampsDiff.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 8: {
                        if (!(message.xattrs && message.xattrs.length))
                            message.xattrs = [];
                        message.xattrs.push($root.file.XAttrDiff.decode(reader, reader.uint32(), undefined, long + 1));
                        break;
                    }
                case 11: {
                        message.areContentsSame = reader.bool();
                        break;
                    }
                case 12: {
                        message.size = $root.file.FileDiff.Size.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileDiff message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.FileDiff
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.FileDiff} FileDiff
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileDiff.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileDiff message.
         * @function verify
         * @memberof file.FileDiff
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileDiff.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                if (!$util.isInteger(message.currentVersion) && !(message.currentVersion && $util.isInteger(message.currentVersion.low) && $util.isInteger(message.currentVersion.high)))
                    return "currentVersion: integer|Long expected";
            if (message.isCurrentLocal != null && Object.hasOwnProperty.call(message, "isCurrentLocal"))
                if (typeof message.isCurrentLocal !== "boolean")
                    return "isCurrentLocal: boolean expected";
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion, long + 1);
                if (error)
                    return "remoteVersion." + error;
            }
            if (message.syncedVersion != null && Object.hasOwnProperty.call(message, "syncedVersion")) {
                var error = $root.common.UInt64Value.verify(message.syncedVersion, long + 1);
                if (error)
                    return "syncedVersion." + error;
            }
            if (message.isRemoteRemoved != null && Object.hasOwnProperty.call(message, "isRemoteRemoved"))
                if (typeof message.isRemoteRemoved !== "boolean")
                    return "isRemoteRemoved: boolean expected";
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime")) {
                var error = $root.file.TimeStampsDiff.verify(message.ctime, long + 1);
                if (error)
                    return "ctime." + error;
            }
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime")) {
                var error = $root.file.TimeStampsDiff.verify(message.mtime, long + 1);
                if (error)
                    return "mtime." + error;
            }
            if (message.xattrs != null && Object.hasOwnProperty.call(message, "xattrs")) {
                if (!Array.isArray(message.xattrs))
                    return "xattrs: array expected";
                for (var i = 0; i < message.xattrs.length; ++i) {
                    var error = $root.file.XAttrDiff.verify(message.xattrs[i], long + 1);
                    if (error)
                        return "xattrs." + error;
                }
            }
            if (message.areContentsSame != null && Object.hasOwnProperty.call(message, "areContentsSame"))
                if (typeof message.areContentsSame !== "boolean")
                    return "areContentsSame: boolean expected";
            if (message.size != null && Object.hasOwnProperty.call(message, "size")) {
                var error = $root.file.FileDiff.Size.verify(message.size, long + 1);
                if (error)
                    return "size." + error;
            }
            return null;
        };

        /**
         * Creates a FileDiff message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileDiff
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileDiff} FileDiff
         */
        FileDiff.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.FileDiff)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.FileDiff: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.FileDiff();
            if (object.currentVersion != null)
                if ($util.Long)
                    message.currentVersion = $util.Long.fromValue(object.currentVersion, true);
                else if (typeof object.currentVersion === "string")
                    message.currentVersion = parseInt(object.currentVersion, 10);
                else if (typeof object.currentVersion === "number")
                    message.currentVersion = object.currentVersion;
                else if (typeof object.currentVersion === "object")
                    message.currentVersion = new $util.LongBits(object.currentVersion.low >>> 0, object.currentVersion.high >>> 0).toNumber(true);
            if (object.isCurrentLocal != null)
                message.isCurrentLocal = Boolean(object.isCurrentLocal);
            if (object.remoteVersion != null) {
                if (!$util.isObject(object.remoteVersion))
                    throw TypeError(".file.FileDiff.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion, long + 1);
            }
            if (object.syncedVersion != null) {
                if (!$util.isObject(object.syncedVersion))
                    throw TypeError(".file.FileDiff.syncedVersion: object expected");
                message.syncedVersion = $root.common.UInt64Value.fromObject(object.syncedVersion, long + 1);
            }
            if (object.isRemoteRemoved != null)
                message.isRemoteRemoved = Boolean(object.isRemoteRemoved);
            if (object.ctime != null) {
                if (!$util.isObject(object.ctime))
                    throw TypeError(".file.FileDiff.ctime: object expected");
                message.ctime = $root.file.TimeStampsDiff.fromObject(object.ctime, long + 1);
            }
            if (object.mtime != null) {
                if (!$util.isObject(object.mtime))
                    throw TypeError(".file.FileDiff.mtime: object expected");
                message.mtime = $root.file.TimeStampsDiff.fromObject(object.mtime, long + 1);
            }
            if (object.xattrs) {
                if (!Array.isArray(object.xattrs))
                    throw TypeError(".file.FileDiff.xattrs: array expected");
                message.xattrs = [];
                for (var i = 0; i < object.xattrs.length; ++i) {
                    if (!$util.isObject(object.xattrs[i]))
                        throw TypeError(".file.FileDiff.xattrs: object expected");
                    message.xattrs[i] = $root.file.XAttrDiff.fromObject(object.xattrs[i], long + 1);
                }
            }
            if (object.areContentsSame != null)
                message.areContentsSame = Boolean(object.areContentsSame);
            if (object.size != null) {
                if (!$util.isObject(object.size))
                    throw TypeError(".file.FileDiff.size: object expected");
                message.size = $root.file.FileDiff.Size.fromObject(object.size, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a FileDiff message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileDiff
         * @static
         * @param {file.FileDiff} message FileDiff
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileDiff.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.xattrs = [];
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.currentVersion = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.currentVersion = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.isCurrentLocal = false;
                object.remoteVersion = null;
                object.syncedVersion = null;
                object.isRemoteRemoved = false;
                object.ctime = null;
                object.mtime = null;
                object.areContentsSame = false;
                object.size = null;
            }
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.currentVersion = typeof message.currentVersion === "number" ? BigInt(message.currentVersion) : $util.Long.fromBits(message.currentVersion.low >>> 0, message.currentVersion.high >>> 0, true).toBigInt();
                else if (typeof message.currentVersion === "number")
                    object.currentVersion = options.longs === String ? String(message.currentVersion) : message.currentVersion;
                else
                    object.currentVersion = options.longs === String ? $util.Long.prototype.toString.call(message.currentVersion) : options.longs === Number ? new $util.LongBits(message.currentVersion.low >>> 0, message.currentVersion.high >>> 0).toNumber(true) : message.currentVersion;
            if (message.isCurrentLocal != null && Object.hasOwnProperty.call(message, "isCurrentLocal"))
                object.isCurrentLocal = message.isCurrentLocal;
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options, q + 1);
            if (message.syncedVersion != null && Object.hasOwnProperty.call(message, "syncedVersion"))
                object.syncedVersion = $root.common.UInt64Value.toObject(message.syncedVersion, options, q + 1);
            if (message.isRemoteRemoved != null && Object.hasOwnProperty.call(message, "isRemoteRemoved"))
                object.isRemoteRemoved = message.isRemoteRemoved;
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime"))
                object.ctime = $root.file.TimeStampsDiff.toObject(message.ctime, options, q + 1);
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime"))
                object.mtime = $root.file.TimeStampsDiff.toObject(message.mtime, options, q + 1);
            if (message.xattrs && message.xattrs.length) {
                object.xattrs = [];
                for (var j = 0; j < message.xattrs.length; ++j)
                    object.xattrs[j] = $root.file.XAttrDiff.toObject(message.xattrs[j], options, q + 1);
            }
            if (message.areContentsSame != null && Object.hasOwnProperty.call(message, "areContentsSame"))
                object.areContentsSame = message.areContentsSame;
            if (message.size != null && Object.hasOwnProperty.call(message, "size"))
                object.size = $root.file.FileDiff.Size.toObject(message.size, options, q + 1);
            return object;
        };

        /**
         * Converts this FileDiff to JSON.
         * @function toJSON
         * @memberof file.FileDiff
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileDiff.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileDiff
         * @function getTypeUrl
         * @memberof file.FileDiff
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileDiff.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.FileDiff";
        };

        FileDiff.Size = (function() {

            /**
             * Properties of a Size.
             * @memberof file.FileDiff
             * @interface ISize
             * @property {number|Long|null} [current] Size current
             * @property {number|Long|null} [remote] Size remote
             */

            /**
             * Constructs a new Size.
             * @memberof file.FileDiff
             * @classdesc Represents a Size.
             * @implements ISize
             * @constructor
             * @param {file.FileDiff.ISize=} [properties] Properties to set
             */
            function Size(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * Size current.
             * @member {number|Long} current
             * @memberof file.FileDiff.Size
             * @instance
             */
            Size.prototype.current = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

            /**
             * Size remote.
             * @member {number|Long} remote
             * @memberof file.FileDiff.Size
             * @instance
             */
            Size.prototype.remote = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

            /**
             * Creates a new Size instance using the specified properties.
             * @function create
             * @memberof file.FileDiff.Size
             * @static
             * @param {file.FileDiff.ISize=} [properties] Properties to set
             * @returns {file.FileDiff.Size} Size instance
             */
            Size.create = function create(properties) {
                return new Size(properties);
            };

            /**
             * Encodes the specified Size message. Does not implicitly {@link file.FileDiff.Size.verify|verify} messages.
             * @function encode
             * @memberof file.FileDiff.Size
             * @static
             * @param {file.FileDiff.ISize} message Size message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Size.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                    writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.current);
                if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                    writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.remote);
                return writer;
            };

            /**
             * Encodes the specified Size message, length delimited. Does not implicitly {@link file.FileDiff.Size.verify|verify} messages.
             * @function encodeDelimited
             * @memberof file.FileDiff.Size
             * @static
             * @param {file.FileDiff.ISize} message Size message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Size.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes a Size message from the specified reader or buffer.
             * @function decode
             * @memberof file.FileDiff.Size
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {file.FileDiff.Size} Size
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Size.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileDiff.Size();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.current = reader.uint64();
                            break;
                        }
                    case 2: {
                            message.remote = reader.uint64();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a Size message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof file.FileDiff.Size
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {file.FileDiff.Size} Size
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Size.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a Size message.
             * @function verify
             * @memberof file.FileDiff.Size
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            Size.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                    if (!$util.isInteger(message.current) && !(message.current && $util.isInteger(message.current.low) && $util.isInteger(message.current.high)))
                        return "current: integer|Long expected";
                if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                    if (!$util.isInteger(message.remote) && !(message.remote && $util.isInteger(message.remote.low) && $util.isInteger(message.remote.high)))
                        return "remote: integer|Long expected";
                return null;
            };

            /**
             * Creates a Size message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof file.FileDiff.Size
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {file.FileDiff.Size} Size
             */
            Size.fromObject = function fromObject(object, long) {
                if (object instanceof $root.file.FileDiff.Size)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".file.FileDiff.Size: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.file.FileDiff.Size();
                if (object.current != null)
                    if ($util.Long)
                        message.current = $util.Long.fromValue(object.current, true);
                    else if (typeof object.current === "string")
                        message.current = parseInt(object.current, 10);
                    else if (typeof object.current === "number")
                        message.current = object.current;
                    else if (typeof object.current === "object")
                        message.current = new $util.LongBits(object.current.low >>> 0, object.current.high >>> 0).toNumber(true);
                if (object.remote != null)
                    if ($util.Long)
                        message.remote = $util.Long.fromValue(object.remote, true);
                    else if (typeof object.remote === "string")
                        message.remote = parseInt(object.remote, 10);
                    else if (typeof object.remote === "number")
                        message.remote = object.remote;
                    else if (typeof object.remote === "object")
                        message.remote = new $util.LongBits(object.remote.low >>> 0, object.remote.high >>> 0).toNumber(true);
                return message;
            };

            /**
             * Creates a plain object from a Size message. Also converts values to other types if specified.
             * @function toObject
             * @memberof file.FileDiff.Size
             * @static
             * @param {file.FileDiff.Size} message Size
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            Size.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults) {
                    if ($util.Long) {
                        var long = new $util.Long(0, 0, true);
                        object.current = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                    } else
                        object.current = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                    if ($util.Long) {
                        var long = new $util.Long(0, 0, true);
                        object.remote = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                    } else
                        object.remote = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                }
                if (message.current != null && Object.hasOwnProperty.call(message, "current"))
                    if (typeof BigInt !== "undefined" && options.longs === BigInt)
                        object.current = typeof message.current === "number" ? BigInt(message.current) : $util.Long.fromBits(message.current.low >>> 0, message.current.high >>> 0, true).toBigInt();
                    else if (typeof message.current === "number")
                        object.current = options.longs === String ? String(message.current) : message.current;
                    else
                        object.current = options.longs === String ? $util.Long.prototype.toString.call(message.current) : options.longs === Number ? new $util.LongBits(message.current.low >>> 0, message.current.high >>> 0).toNumber(true) : message.current;
                if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                    if (typeof BigInt !== "undefined" && options.longs === BigInt)
                        object.remote = typeof message.remote === "number" ? BigInt(message.remote) : $util.Long.fromBits(message.remote.low >>> 0, message.remote.high >>> 0, true).toBigInt();
                    else if (typeof message.remote === "number")
                        object.remote = options.longs === String ? String(message.remote) : message.remote;
                    else
                        object.remote = options.longs === String ? $util.Long.prototype.toString.call(message.remote) : options.longs === Number ? new $util.LongBits(message.remote.low >>> 0, message.remote.high >>> 0).toNumber(true) : message.remote;
                return object;
            };

            /**
             * Converts this Size to JSON.
             * @function toJSON
             * @memberof file.FileDiff.Size
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            Size.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for Size
             * @function getTypeUrl
             * @memberof file.FileDiff.Size
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            Size.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/file.FileDiff.Size";
            };

            return Size;
        })();

        return FileDiff;
    })();

    file.FileSyncUploadRequestBody = (function() {

        /**
         * Properties of a FileSyncUploadRequestBody.
         * @memberof file
         * @interface IFileSyncUploadRequestBody
         * @property {file.IOptionsToUploadLocal|null} [opts] FileSyncUploadRequestBody opts
         */

        /**
         * Constructs a new FileSyncUploadRequestBody.
         * @memberof file
         * @classdesc Represents a FileSyncUploadRequestBody.
         * @implements IFileSyncUploadRequestBody
         * @constructor
         * @param {file.IFileSyncUploadRequestBody=} [properties] Properties to set
         */
        function FileSyncUploadRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileSyncUploadRequestBody opts.
         * @member {file.IOptionsToUploadLocal|null|undefined} opts
         * @memberof file.FileSyncUploadRequestBody
         * @instance
         */
        FileSyncUploadRequestBody.prototype.opts = null;

        /**
         * Creates a new FileSyncUploadRequestBody instance using the specified properties.
         * @function create
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {file.IFileSyncUploadRequestBody=} [properties] Properties to set
         * @returns {file.FileSyncUploadRequestBody} FileSyncUploadRequestBody instance
         */
        FileSyncUploadRequestBody.create = function create(properties) {
            return new FileSyncUploadRequestBody(properties);
        };

        /**
         * Encodes the specified FileSyncUploadRequestBody message. Does not implicitly {@link file.FileSyncUploadRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {file.IFileSyncUploadRequestBody} message FileSyncUploadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncUploadRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.file.OptionsToUploadLocal.encode(message.opts, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FileSyncUploadRequestBody message, length delimited. Does not implicitly {@link file.FileSyncUploadRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {file.IFileSyncUploadRequestBody} message FileSyncUploadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncUploadRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileSyncUploadRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileSyncUploadRequestBody} FileSyncUploadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncUploadRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncUploadRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.opts = $root.file.OptionsToUploadLocal.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileSyncUploadRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.FileSyncUploadRequestBody} FileSyncUploadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncUploadRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileSyncUploadRequestBody message.
         * @function verify
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileSyncUploadRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts")) {
                var error = $root.file.OptionsToUploadLocal.verify(message.opts, long + 1);
                if (error)
                    return "opts." + error;
            }
            return null;
        };

        /**
         * Creates a FileSyncUploadRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileSyncUploadRequestBody} FileSyncUploadRequestBody
         */
        FileSyncUploadRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.FileSyncUploadRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.FileSyncUploadRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.FileSyncUploadRequestBody();
            if (object.opts != null) {
                if (!$util.isObject(object.opts))
                    throw TypeError(".file.FileSyncUploadRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToUploadLocal.fromObject(object.opts, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a FileSyncUploadRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {file.FileSyncUploadRequestBody} message FileSyncUploadRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileSyncUploadRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.opts = null;
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                object.opts = $root.file.OptionsToUploadLocal.toObject(message.opts, options, q + 1);
            return object;
        };

        /**
         * Converts this FileSyncUploadRequestBody to JSON.
         * @function toJSON
         * @memberof file.FileSyncUploadRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileSyncUploadRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileSyncUploadRequestBody
         * @function getTypeUrl
         * @memberof file.FileSyncUploadRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileSyncUploadRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.FileSyncUploadRequestBody";
        };

        return FileSyncUploadRequestBody;
    })();

    file.FileSyncUploadReplyBody = (function() {

        /**
         * Properties of a FileSyncUploadReplyBody.
         * @memberof file
         * @interface IFileSyncUploadReplyBody
         * @property {common.IUInt64Value|null} [uploadedVersion] FileSyncUploadReplyBody uploadedVersion
         */

        /**
         * Constructs a new FileSyncUploadReplyBody.
         * @memberof file
         * @classdesc Represents a FileSyncUploadReplyBody.
         * @implements IFileSyncUploadReplyBody
         * @constructor
         * @param {file.IFileSyncUploadReplyBody=} [properties] Properties to set
         */
        function FileSyncUploadReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileSyncUploadReplyBody uploadedVersion.
         * @member {common.IUInt64Value|null|undefined} uploadedVersion
         * @memberof file.FileSyncUploadReplyBody
         * @instance
         */
        FileSyncUploadReplyBody.prototype.uploadedVersion = null;

        /**
         * Creates a new FileSyncUploadReplyBody instance using the specified properties.
         * @function create
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {file.IFileSyncUploadReplyBody=} [properties] Properties to set
         * @returns {file.FileSyncUploadReplyBody} FileSyncUploadReplyBody instance
         */
        FileSyncUploadReplyBody.create = function create(properties) {
            return new FileSyncUploadReplyBody(properties);
        };

        /**
         * Encodes the specified FileSyncUploadReplyBody message. Does not implicitly {@link file.FileSyncUploadReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {file.IFileSyncUploadReplyBody} message FileSyncUploadReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncUploadReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.uploadedVersion != null && Object.hasOwnProperty.call(message, "uploadedVersion"))
                $root.common.UInt64Value.encode(message.uploadedVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FileSyncUploadReplyBody message, length delimited. Does not implicitly {@link file.FileSyncUploadReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {file.IFileSyncUploadReplyBody} message FileSyncUploadReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncUploadReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileSyncUploadReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileSyncUploadReplyBody} FileSyncUploadReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncUploadReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncUploadReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.uploadedVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileSyncUploadReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.FileSyncUploadReplyBody} FileSyncUploadReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncUploadReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileSyncUploadReplyBody message.
         * @function verify
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileSyncUploadReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.uploadedVersion != null && Object.hasOwnProperty.call(message, "uploadedVersion")) {
                var error = $root.common.UInt64Value.verify(message.uploadedVersion, long + 1);
                if (error)
                    return "uploadedVersion." + error;
            }
            return null;
        };

        /**
         * Creates a FileSyncUploadReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileSyncUploadReplyBody} FileSyncUploadReplyBody
         */
        FileSyncUploadReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.FileSyncUploadReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.FileSyncUploadReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.FileSyncUploadReplyBody();
            if (object.uploadedVersion != null) {
                if (!$util.isObject(object.uploadedVersion))
                    throw TypeError(".file.FileSyncUploadReplyBody.uploadedVersion: object expected");
                message.uploadedVersion = $root.common.UInt64Value.fromObject(object.uploadedVersion, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a FileSyncUploadReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {file.FileSyncUploadReplyBody} message FileSyncUploadReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileSyncUploadReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.uploadedVersion = null;
            if (message.uploadedVersion != null && Object.hasOwnProperty.call(message, "uploadedVersion"))
                object.uploadedVersion = $root.common.UInt64Value.toObject(message.uploadedVersion, options, q + 1);
            return object;
        };

        /**
         * Converts this FileSyncUploadReplyBody to JSON.
         * @function toJSON
         * @memberof file.FileSyncUploadReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileSyncUploadReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileSyncUploadReplyBody
         * @function getTypeUrl
         * @memberof file.FileSyncUploadReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileSyncUploadReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.FileSyncUploadReplyBody";
        };

        return FileSyncUploadReplyBody;
    })();

    file.FileSyncStartUploadReplyBody = (function() {

        /**
         * Properties of a FileSyncStartUploadReplyBody.
         * @memberof file
         * @interface IFileSyncStartUploadReplyBody
         * @property {file.FileSyncStartUploadReplyBody.IUploadInfo|null} [startedUpload] FileSyncStartUploadReplyBody startedUpload
         */

        /**
         * Constructs a new FileSyncStartUploadReplyBody.
         * @memberof file
         * @classdesc Represents a FileSyncStartUploadReplyBody.
         * @implements IFileSyncStartUploadReplyBody
         * @constructor
         * @param {file.IFileSyncStartUploadReplyBody=} [properties] Properties to set
         */
        function FileSyncStartUploadReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileSyncStartUploadReplyBody startedUpload.
         * @member {file.FileSyncStartUploadReplyBody.IUploadInfo|null|undefined} startedUpload
         * @memberof file.FileSyncStartUploadReplyBody
         * @instance
         */
        FileSyncStartUploadReplyBody.prototype.startedUpload = null;

        /**
         * Creates a new FileSyncStartUploadReplyBody instance using the specified properties.
         * @function create
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {file.IFileSyncStartUploadReplyBody=} [properties] Properties to set
         * @returns {file.FileSyncStartUploadReplyBody} FileSyncStartUploadReplyBody instance
         */
        FileSyncStartUploadReplyBody.create = function create(properties) {
            return new FileSyncStartUploadReplyBody(properties);
        };

        /**
         * Encodes the specified FileSyncStartUploadReplyBody message. Does not implicitly {@link file.FileSyncStartUploadReplyBody.verify|verify} messages.
         * @function encode
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {file.IFileSyncStartUploadReplyBody} message FileSyncStartUploadReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncStartUploadReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.startedUpload != null && Object.hasOwnProperty.call(message, "startedUpload"))
                $root.file.FileSyncStartUploadReplyBody.UploadInfo.encode(message.startedUpload, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FileSyncStartUploadReplyBody message, length delimited. Does not implicitly {@link file.FileSyncStartUploadReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {file.IFileSyncStartUploadReplyBody} message FileSyncStartUploadReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileSyncStartUploadReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileSyncStartUploadReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.FileSyncStartUploadReplyBody} FileSyncStartUploadReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncStartUploadReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncStartUploadReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.startedUpload = $root.file.FileSyncStartUploadReplyBody.UploadInfo.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileSyncStartUploadReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.FileSyncStartUploadReplyBody} FileSyncStartUploadReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileSyncStartUploadReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileSyncStartUploadReplyBody message.
         * @function verify
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileSyncStartUploadReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.startedUpload != null && Object.hasOwnProperty.call(message, "startedUpload")) {
                var error = $root.file.FileSyncStartUploadReplyBody.UploadInfo.verify(message.startedUpload, long + 1);
                if (error)
                    return "startedUpload." + error;
            }
            return null;
        };

        /**
         * Creates a FileSyncStartUploadReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.FileSyncStartUploadReplyBody} FileSyncStartUploadReplyBody
         */
        FileSyncStartUploadReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.FileSyncStartUploadReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.FileSyncStartUploadReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.FileSyncStartUploadReplyBody();
            if (object.startedUpload != null) {
                if (!$util.isObject(object.startedUpload))
                    throw TypeError(".file.FileSyncStartUploadReplyBody.startedUpload: object expected");
                message.startedUpload = $root.file.FileSyncStartUploadReplyBody.UploadInfo.fromObject(object.startedUpload, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a FileSyncStartUploadReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {file.FileSyncStartUploadReplyBody} message FileSyncStartUploadReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileSyncStartUploadReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.startedUpload = null;
            if (message.startedUpload != null && Object.hasOwnProperty.call(message, "startedUpload"))
                object.startedUpload = $root.file.FileSyncStartUploadReplyBody.UploadInfo.toObject(message.startedUpload, options, q + 1);
            return object;
        };

        /**
         * Converts this FileSyncStartUploadReplyBody to JSON.
         * @function toJSON
         * @memberof file.FileSyncStartUploadReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileSyncStartUploadReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileSyncStartUploadReplyBody
         * @function getTypeUrl
         * @memberof file.FileSyncStartUploadReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileSyncStartUploadReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.FileSyncStartUploadReplyBody";
        };

        FileSyncStartUploadReplyBody.UploadInfo = (function() {

            /**
             * Properties of an UploadInfo.
             * @memberof file.FileSyncStartUploadReplyBody
             * @interface IUploadInfo
             * @property {number|Long|null} [uploadVersion] UploadInfo uploadVersion
             * @property {number|Long|null} [uploadTaskId] UploadInfo uploadTaskId
             */

            /**
             * Constructs a new UploadInfo.
             * @memberof file.FileSyncStartUploadReplyBody
             * @classdesc Represents an UploadInfo.
             * @implements IUploadInfo
             * @constructor
             * @param {file.FileSyncStartUploadReplyBody.IUploadInfo=} [properties] Properties to set
             */
            function UploadInfo(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * UploadInfo uploadVersion.
             * @member {number|Long} uploadVersion
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @instance
             */
            UploadInfo.prototype.uploadVersion = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

            /**
             * UploadInfo uploadTaskId.
             * @member {number|Long} uploadTaskId
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @instance
             */
            UploadInfo.prototype.uploadTaskId = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

            /**
             * Creates a new UploadInfo instance using the specified properties.
             * @function create
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {file.FileSyncStartUploadReplyBody.IUploadInfo=} [properties] Properties to set
             * @returns {file.FileSyncStartUploadReplyBody.UploadInfo} UploadInfo instance
             */
            UploadInfo.create = function create(properties) {
                return new UploadInfo(properties);
            };

            /**
             * Encodes the specified UploadInfo message. Does not implicitly {@link file.FileSyncStartUploadReplyBody.UploadInfo.verify|verify} messages.
             * @function encode
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {file.FileSyncStartUploadReplyBody.IUploadInfo} message UploadInfo message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            UploadInfo.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                    writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.uploadVersion);
                if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                    writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.uploadTaskId);
                return writer;
            };

            /**
             * Encodes the specified UploadInfo message, length delimited. Does not implicitly {@link file.FileSyncStartUploadReplyBody.UploadInfo.verify|verify} messages.
             * @function encodeDelimited
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {file.FileSyncStartUploadReplyBody.IUploadInfo} message UploadInfo message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            UploadInfo.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes an UploadInfo message from the specified reader or buffer.
             * @function decode
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {file.FileSyncStartUploadReplyBody.UploadInfo} UploadInfo
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            UploadInfo.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.FileSyncStartUploadReplyBody.UploadInfo();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.uploadVersion = reader.uint64();
                            break;
                        }
                    case 2: {
                            message.uploadTaskId = reader.uint64();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes an UploadInfo message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {file.FileSyncStartUploadReplyBody.UploadInfo} UploadInfo
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            UploadInfo.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies an UploadInfo message.
             * @function verify
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            UploadInfo.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                    if (!$util.isInteger(message.uploadVersion) && !(message.uploadVersion && $util.isInteger(message.uploadVersion.low) && $util.isInteger(message.uploadVersion.high)))
                        return "uploadVersion: integer|Long expected";
                if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                    if (!$util.isInteger(message.uploadTaskId) && !(message.uploadTaskId && $util.isInteger(message.uploadTaskId.low) && $util.isInteger(message.uploadTaskId.high)))
                        return "uploadTaskId: integer|Long expected";
                return null;
            };

            /**
             * Creates an UploadInfo message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {file.FileSyncStartUploadReplyBody.UploadInfo} UploadInfo
             */
            UploadInfo.fromObject = function fromObject(object, long) {
                if (object instanceof $root.file.FileSyncStartUploadReplyBody.UploadInfo)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".file.FileSyncStartUploadReplyBody.UploadInfo: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.file.FileSyncStartUploadReplyBody.UploadInfo();
                if (object.uploadVersion != null)
                    if ($util.Long)
                        message.uploadVersion = $util.Long.fromValue(object.uploadVersion, true);
                    else if (typeof object.uploadVersion === "string")
                        message.uploadVersion = parseInt(object.uploadVersion, 10);
                    else if (typeof object.uploadVersion === "number")
                        message.uploadVersion = object.uploadVersion;
                    else if (typeof object.uploadVersion === "object")
                        message.uploadVersion = new $util.LongBits(object.uploadVersion.low >>> 0, object.uploadVersion.high >>> 0).toNumber(true);
                if (object.uploadTaskId != null)
                    if ($util.Long)
                        message.uploadTaskId = $util.Long.fromValue(object.uploadTaskId, true);
                    else if (typeof object.uploadTaskId === "string")
                        message.uploadTaskId = parseInt(object.uploadTaskId, 10);
                    else if (typeof object.uploadTaskId === "number")
                        message.uploadTaskId = object.uploadTaskId;
                    else if (typeof object.uploadTaskId === "object")
                        message.uploadTaskId = new $util.LongBits(object.uploadTaskId.low >>> 0, object.uploadTaskId.high >>> 0).toNumber(true);
                return message;
            };

            /**
             * Creates a plain object from an UploadInfo message. Also converts values to other types if specified.
             * @function toObject
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {file.FileSyncStartUploadReplyBody.UploadInfo} message UploadInfo
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            UploadInfo.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults) {
                    if ($util.Long) {
                        var long = new $util.Long(0, 0, true);
                        object.uploadVersion = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                    } else
                        object.uploadVersion = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                    if ($util.Long) {
                        var long = new $util.Long(0, 0, true);
                        object.uploadTaskId = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                    } else
                        object.uploadTaskId = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                }
                if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                    if (typeof BigInt !== "undefined" && options.longs === BigInt)
                        object.uploadVersion = typeof message.uploadVersion === "number" ? BigInt(message.uploadVersion) : $util.Long.fromBits(message.uploadVersion.low >>> 0, message.uploadVersion.high >>> 0, true).toBigInt();
                    else if (typeof message.uploadVersion === "number")
                        object.uploadVersion = options.longs === String ? String(message.uploadVersion) : message.uploadVersion;
                    else
                        object.uploadVersion = options.longs === String ? $util.Long.prototype.toString.call(message.uploadVersion) : options.longs === Number ? new $util.LongBits(message.uploadVersion.low >>> 0, message.uploadVersion.high >>> 0).toNumber(true) : message.uploadVersion;
                if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                    if (typeof BigInt !== "undefined" && options.longs === BigInt)
                        object.uploadTaskId = typeof message.uploadTaskId === "number" ? BigInt(message.uploadTaskId) : $util.Long.fromBits(message.uploadTaskId.low >>> 0, message.uploadTaskId.high >>> 0, true).toBigInt();
                    else if (typeof message.uploadTaskId === "number")
                        object.uploadTaskId = options.longs === String ? String(message.uploadTaskId) : message.uploadTaskId;
                    else
                        object.uploadTaskId = options.longs === String ? $util.Long.prototype.toString.call(message.uploadTaskId) : options.longs === Number ? new $util.LongBits(message.uploadTaskId.low >>> 0, message.uploadTaskId.high >>> 0).toNumber(true) : message.uploadTaskId;
                return object;
            };

            /**
             * Converts this UploadInfo to JSON.
             * @function toJSON
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            UploadInfo.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for UploadInfo
             * @function getTypeUrl
             * @memberof file.FileSyncStartUploadReplyBody.UploadInfo
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            UploadInfo.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/file.FileSyncStartUploadReplyBody.UploadInfo";
            };

            return UploadInfo;
        })();

        return FileSyncStartUploadReplyBody;
    })();

    file.OptionsToUploadLocal = (function() {

        /**
         * Properties of an OptionsToUploadLocal.
         * @memberof file
         * @interface IOptionsToUploadLocal
         * @property {common.IUInt64Value|null} [localVersion] OptionsToUploadLocal localVersion
         * @property {common.IUInt64Value|null} [uploadVersion] OptionsToUploadLocal uploadVersion
         */

        /**
         * Constructs a new OptionsToUploadLocal.
         * @memberof file
         * @classdesc Represents an OptionsToUploadLocal.
         * @implements IOptionsToUploadLocal
         * @constructor
         * @param {file.IOptionsToUploadLocal=} [properties] Properties to set
         */
        function OptionsToUploadLocal(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * OptionsToUploadLocal localVersion.
         * @member {common.IUInt64Value|null|undefined} localVersion
         * @memberof file.OptionsToUploadLocal
         * @instance
         */
        OptionsToUploadLocal.prototype.localVersion = null;

        /**
         * OptionsToUploadLocal uploadVersion.
         * @member {common.IUInt64Value|null|undefined} uploadVersion
         * @memberof file.OptionsToUploadLocal
         * @instance
         */
        OptionsToUploadLocal.prototype.uploadVersion = null;

        /**
         * Creates a new OptionsToUploadLocal instance using the specified properties.
         * @function create
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {file.IOptionsToUploadLocal=} [properties] Properties to set
         * @returns {file.OptionsToUploadLocal} OptionsToUploadLocal instance
         */
        OptionsToUploadLocal.create = function create(properties) {
            return new OptionsToUploadLocal(properties);
        };

        /**
         * Encodes the specified OptionsToUploadLocal message. Does not implicitly {@link file.OptionsToUploadLocal.verify|verify} messages.
         * @function encode
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {file.IOptionsToUploadLocal} message OptionsToUploadLocal message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        OptionsToUploadLocal.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                $root.common.UInt64Value.encode(message.localVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                $root.common.UInt64Value.encode(message.uploadVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified OptionsToUploadLocal message, length delimited. Does not implicitly {@link file.OptionsToUploadLocal.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {file.IOptionsToUploadLocal} message OptionsToUploadLocal message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        OptionsToUploadLocal.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an OptionsToUploadLocal message from the specified reader or buffer.
         * @function decode
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.OptionsToUploadLocal} OptionsToUploadLocal
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        OptionsToUploadLocal.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.OptionsToUploadLocal();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.localVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.uploadVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an OptionsToUploadLocal message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.OptionsToUploadLocal} OptionsToUploadLocal
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        OptionsToUploadLocal.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an OptionsToUploadLocal message.
         * @function verify
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        OptionsToUploadLocal.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion")) {
                var error = $root.common.UInt64Value.verify(message.localVersion, long + 1);
                if (error)
                    return "localVersion." + error;
            }
            if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion")) {
                var error = $root.common.UInt64Value.verify(message.uploadVersion, long + 1);
                if (error)
                    return "uploadVersion." + error;
            }
            return null;
        };

        /**
         * Creates an OptionsToUploadLocal message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.OptionsToUploadLocal} OptionsToUploadLocal
         */
        OptionsToUploadLocal.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.OptionsToUploadLocal)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.OptionsToUploadLocal: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.OptionsToUploadLocal();
            if (object.localVersion != null) {
                if (!$util.isObject(object.localVersion))
                    throw TypeError(".file.OptionsToUploadLocal.localVersion: object expected");
                message.localVersion = $root.common.UInt64Value.fromObject(object.localVersion, long + 1);
            }
            if (object.uploadVersion != null) {
                if (!$util.isObject(object.uploadVersion))
                    throw TypeError(".file.OptionsToUploadLocal.uploadVersion: object expected");
                message.uploadVersion = $root.common.UInt64Value.fromObject(object.uploadVersion, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an OptionsToUploadLocal message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {file.OptionsToUploadLocal} message OptionsToUploadLocal
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        OptionsToUploadLocal.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.localVersion = null;
                object.uploadVersion = null;
            }
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                object.localVersion = $root.common.UInt64Value.toObject(message.localVersion, options, q + 1);
            if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                object.uploadVersion = $root.common.UInt64Value.toObject(message.uploadVersion, options, q + 1);
            return object;
        };

        /**
         * Converts this OptionsToUploadLocal to JSON.
         * @function toJSON
         * @memberof file.OptionsToUploadLocal
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        OptionsToUploadLocal.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for OptionsToUploadLocal
         * @function getTypeUrl
         * @memberof file.OptionsToUploadLocal
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        OptionsToUploadLocal.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.OptionsToUploadLocal";
        };

        return OptionsToUploadLocal;
    })();

    file.WatchUploadRequestBody = (function() {

        /**
         * Properties of a WatchUploadRequestBody.
         * @memberof file
         * @interface IWatchUploadRequestBody
         * @property {number|Long|null} [uploadTaskId] WatchUploadRequestBody uploadTaskId
         */

        /**
         * Constructs a new WatchUploadRequestBody.
         * @memberof file
         * @classdesc Represents a WatchUploadRequestBody.
         * @implements IWatchUploadRequestBody
         * @constructor
         * @param {file.IWatchUploadRequestBody=} [properties] Properties to set
         */
        function WatchUploadRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * WatchUploadRequestBody uploadTaskId.
         * @member {number|Long} uploadTaskId
         * @memberof file.WatchUploadRequestBody
         * @instance
         */
        WatchUploadRequestBody.prototype.uploadTaskId = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new WatchUploadRequestBody instance using the specified properties.
         * @function create
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {file.IWatchUploadRequestBody=} [properties] Properties to set
         * @returns {file.WatchUploadRequestBody} WatchUploadRequestBody instance
         */
        WatchUploadRequestBody.create = function create(properties) {
            return new WatchUploadRequestBody(properties);
        };

        /**
         * Encodes the specified WatchUploadRequestBody message. Does not implicitly {@link file.WatchUploadRequestBody.verify|verify} messages.
         * @function encode
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {file.IWatchUploadRequestBody} message WatchUploadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WatchUploadRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.uploadTaskId);
            return writer;
        };

        /**
         * Encodes the specified WatchUploadRequestBody message, length delimited. Does not implicitly {@link file.WatchUploadRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {file.IWatchUploadRequestBody} message WatchUploadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WatchUploadRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a WatchUploadRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.WatchUploadRequestBody} WatchUploadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WatchUploadRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.WatchUploadRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.uploadTaskId = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a WatchUploadRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.WatchUploadRequestBody} WatchUploadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WatchUploadRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a WatchUploadRequestBody message.
         * @function verify
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        WatchUploadRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                if (!$util.isInteger(message.uploadTaskId) && !(message.uploadTaskId && $util.isInteger(message.uploadTaskId.low) && $util.isInteger(message.uploadTaskId.high)))
                    return "uploadTaskId: integer|Long expected";
            return null;
        };

        /**
         * Creates a WatchUploadRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.WatchUploadRequestBody} WatchUploadRequestBody
         */
        WatchUploadRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.WatchUploadRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.WatchUploadRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.WatchUploadRequestBody();
            if (object.uploadTaskId != null)
                if ($util.Long)
                    message.uploadTaskId = $util.Long.fromValue(object.uploadTaskId, true);
                else if (typeof object.uploadTaskId === "string")
                    message.uploadTaskId = parseInt(object.uploadTaskId, 10);
                else if (typeof object.uploadTaskId === "number")
                    message.uploadTaskId = object.uploadTaskId;
                else if (typeof object.uploadTaskId === "object")
                    message.uploadTaskId = new $util.LongBits(object.uploadTaskId.low >>> 0, object.uploadTaskId.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from a WatchUploadRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {file.WatchUploadRequestBody} message WatchUploadRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        WatchUploadRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.uploadTaskId = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.uploadTaskId = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.uploadTaskId = typeof message.uploadTaskId === "number" ? BigInt(message.uploadTaskId) : $util.Long.fromBits(message.uploadTaskId.low >>> 0, message.uploadTaskId.high >>> 0, true).toBigInt();
                else if (typeof message.uploadTaskId === "number")
                    object.uploadTaskId = options.longs === String ? String(message.uploadTaskId) : message.uploadTaskId;
                else
                    object.uploadTaskId = options.longs === String ? $util.Long.prototype.toString.call(message.uploadTaskId) : options.longs === Number ? new $util.LongBits(message.uploadTaskId.low >>> 0, message.uploadTaskId.high >>> 0).toNumber(true) : message.uploadTaskId;
            return object;
        };

        /**
         * Converts this WatchUploadRequestBody to JSON.
         * @function toJSON
         * @memberof file.WatchUploadRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        WatchUploadRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for WatchUploadRequestBody
         * @function getTypeUrl
         * @memberof file.WatchUploadRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        WatchUploadRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.WatchUploadRequestBody";
        };

        return WatchUploadRequestBody;
    })();

    file.UploadEventMsg = (function() {

        /**
         * Properties of an UploadEventMsg.
         * @memberof file
         * @interface IUploadEventMsg
         * @property {string|null} [type] UploadEventMsg type
         * @property {number|Long|null} [uploadTaskId] UploadEventMsg uploadTaskId
         * @property {number|Long|null} [localVersion] UploadEventMsg localVersion
         * @property {number|Long|null} [uploadVersion] UploadEventMsg uploadVersion
         */

        /**
         * Constructs a new UploadEventMsg.
         * @memberof file
         * @classdesc Represents an UploadEventMsg.
         * @implements IUploadEventMsg
         * @constructor
         * @param {file.IUploadEventMsg=} [properties] Properties to set
         */
        function UploadEventMsg(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * UploadEventMsg type.
         * @member {string} type
         * @memberof file.UploadEventMsg
         * @instance
         */
        UploadEventMsg.prototype.type = "";

        /**
         * UploadEventMsg uploadTaskId.
         * @member {number|Long} uploadTaskId
         * @memberof file.UploadEventMsg
         * @instance
         */
        UploadEventMsg.prototype.uploadTaskId = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * UploadEventMsg localVersion.
         * @member {number|Long} localVersion
         * @memberof file.UploadEventMsg
         * @instance
         */
        UploadEventMsg.prototype.localVersion = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * UploadEventMsg uploadVersion.
         * @member {number|Long} uploadVersion
         * @memberof file.UploadEventMsg
         * @instance
         */
        UploadEventMsg.prototype.uploadVersion = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new UploadEventMsg instance using the specified properties.
         * @function create
         * @memberof file.UploadEventMsg
         * @static
         * @param {file.IUploadEventMsg=} [properties] Properties to set
         * @returns {file.UploadEventMsg} UploadEventMsg instance
         */
        UploadEventMsg.create = function create(properties) {
            return new UploadEventMsg(properties);
        };

        /**
         * Encodes the specified UploadEventMsg message. Does not implicitly {@link file.UploadEventMsg.verify|verify} messages.
         * @function encode
         * @memberof file.UploadEventMsg
         * @static
         * @param {file.IUploadEventMsg} message UploadEventMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UploadEventMsg.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.type);
            if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.uploadTaskId);
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.localVersion);
            if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                writer.uint32(/* id 4, wireType 0 =*/32).uint64(message.uploadVersion);
            return writer;
        };

        /**
         * Encodes the specified UploadEventMsg message, length delimited. Does not implicitly {@link file.UploadEventMsg.verify|verify} messages.
         * @function encodeDelimited
         * @memberof file.UploadEventMsg
         * @static
         * @param {file.IUploadEventMsg} message UploadEventMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UploadEventMsg.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an UploadEventMsg message from the specified reader or buffer.
         * @function decode
         * @memberof file.UploadEventMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {file.UploadEventMsg} UploadEventMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UploadEventMsg.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.file.UploadEventMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.type = reader.string();
                        break;
                    }
                case 2: {
                        message.uploadTaskId = reader.uint64();
                        break;
                    }
                case 3: {
                        message.localVersion = reader.uint64();
                        break;
                    }
                case 4: {
                        message.uploadVersion = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an UploadEventMsg message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof file.UploadEventMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {file.UploadEventMsg} UploadEventMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UploadEventMsg.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an UploadEventMsg message.
         * @function verify
         * @memberof file.UploadEventMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        UploadEventMsg.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                if (!$util.isInteger(message.uploadTaskId) && !(message.uploadTaskId && $util.isInteger(message.uploadTaskId.low) && $util.isInteger(message.uploadTaskId.high)))
                    return "uploadTaskId: integer|Long expected";
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                if (!$util.isInteger(message.localVersion) && !(message.localVersion && $util.isInteger(message.localVersion.low) && $util.isInteger(message.localVersion.high)))
                    return "localVersion: integer|Long expected";
            if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                if (!$util.isInteger(message.uploadVersion) && !(message.uploadVersion && $util.isInteger(message.uploadVersion.low) && $util.isInteger(message.uploadVersion.high)))
                    return "uploadVersion: integer|Long expected";
            return null;
        };

        /**
         * Creates an UploadEventMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof file.UploadEventMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {file.UploadEventMsg} UploadEventMsg
         */
        UploadEventMsg.fromObject = function fromObject(object, long) {
            if (object instanceof $root.file.UploadEventMsg)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".file.UploadEventMsg: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.file.UploadEventMsg();
            if (object.type != null)
                message.type = String(object.type);
            if (object.uploadTaskId != null)
                if ($util.Long)
                    message.uploadTaskId = $util.Long.fromValue(object.uploadTaskId, true);
                else if (typeof object.uploadTaskId === "string")
                    message.uploadTaskId = parseInt(object.uploadTaskId, 10);
                else if (typeof object.uploadTaskId === "number")
                    message.uploadTaskId = object.uploadTaskId;
                else if (typeof object.uploadTaskId === "object")
                    message.uploadTaskId = new $util.LongBits(object.uploadTaskId.low >>> 0, object.uploadTaskId.high >>> 0).toNumber(true);
            if (object.localVersion != null)
                if ($util.Long)
                    message.localVersion = $util.Long.fromValue(object.localVersion, true);
                else if (typeof object.localVersion === "string")
                    message.localVersion = parseInt(object.localVersion, 10);
                else if (typeof object.localVersion === "number")
                    message.localVersion = object.localVersion;
                else if (typeof object.localVersion === "object")
                    message.localVersion = new $util.LongBits(object.localVersion.low >>> 0, object.localVersion.high >>> 0).toNumber(true);
            if (object.uploadVersion != null)
                if ($util.Long)
                    message.uploadVersion = $util.Long.fromValue(object.uploadVersion, true);
                else if (typeof object.uploadVersion === "string")
                    message.uploadVersion = parseInt(object.uploadVersion, 10);
                else if (typeof object.uploadVersion === "number")
                    message.uploadVersion = object.uploadVersion;
                else if (typeof object.uploadVersion === "object")
                    message.uploadVersion = new $util.LongBits(object.uploadVersion.low >>> 0, object.uploadVersion.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from an UploadEventMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof file.UploadEventMsg
         * @static
         * @param {file.UploadEventMsg} message UploadEventMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        UploadEventMsg.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.type = "";
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.uploadTaskId = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.uploadTaskId = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.localVersion = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.localVersion = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.uploadVersion = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.uploadVersion = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            }
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                object.type = message.type;
            if (message.uploadTaskId != null && Object.hasOwnProperty.call(message, "uploadTaskId"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.uploadTaskId = typeof message.uploadTaskId === "number" ? BigInt(message.uploadTaskId) : $util.Long.fromBits(message.uploadTaskId.low >>> 0, message.uploadTaskId.high >>> 0, true).toBigInt();
                else if (typeof message.uploadTaskId === "number")
                    object.uploadTaskId = options.longs === String ? String(message.uploadTaskId) : message.uploadTaskId;
                else
                    object.uploadTaskId = options.longs === String ? $util.Long.prototype.toString.call(message.uploadTaskId) : options.longs === Number ? new $util.LongBits(message.uploadTaskId.low >>> 0, message.uploadTaskId.high >>> 0).toNumber(true) : message.uploadTaskId;
            if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.localVersion = typeof message.localVersion === "number" ? BigInt(message.localVersion) : $util.Long.fromBits(message.localVersion.low >>> 0, message.localVersion.high >>> 0, true).toBigInt();
                else if (typeof message.localVersion === "number")
                    object.localVersion = options.longs === String ? String(message.localVersion) : message.localVersion;
                else
                    object.localVersion = options.longs === String ? $util.Long.prototype.toString.call(message.localVersion) : options.longs === Number ? new $util.LongBits(message.localVersion.low >>> 0, message.localVersion.high >>> 0).toNumber(true) : message.localVersion;
            if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.uploadVersion = typeof message.uploadVersion === "number" ? BigInt(message.uploadVersion) : $util.Long.fromBits(message.uploadVersion.low >>> 0, message.uploadVersion.high >>> 0, true).toBigInt();
                else if (typeof message.uploadVersion === "number")
                    object.uploadVersion = options.longs === String ? String(message.uploadVersion) : message.uploadVersion;
                else
                    object.uploadVersion = options.longs === String ? $util.Long.prototype.toString.call(message.uploadVersion) : options.longs === Number ? new $util.LongBits(message.uploadVersion.low >>> 0, message.uploadVersion.high >>> 0).toNumber(true) : message.uploadVersion;
            return object;
        };

        /**
         * Converts this UploadEventMsg to JSON.
         * @function toJSON
         * @memberof file.UploadEventMsg
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        UploadEventMsg.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for UploadEventMsg
         * @function getTypeUrl
         * @memberof file.UploadEventMsg
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        UploadEventMsg.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/file.UploadEventMsg";
        };

        return UploadEventMsg;
    })();

    return file;
})();

$root.fs = (function() {

    /**
     * Namespace fs.
     * @exports fs
     * @namespace
     */
    var fs = {};

    fs.FS = (function() {

        /**
         * Properties of a FS.
         * @memberof fs
         * @interface IFS
         * @property {string|null} [type] FS type
         * @property {boolean|null} [isVersioned] FS isVersioned
         * @property {boolean|null} [writable] FS writable
         * @property {string|null} [name] FS name
         * @property {common.IObjectReference|null} [impl] FS impl
         * @property {boolean|null} [isSynced] FS isSynced
         */

        /**
         * Constructs a new FS.
         * @memberof fs
         * @classdesc Represents a FS.
         * @implements IFS
         * @constructor
         * @param {fs.IFS=} [properties] Properties to set
         */
        function FS(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FS type.
         * @member {string} type
         * @memberof fs.FS
         * @instance
         */
        FS.prototype.type = "";

        /**
         * FS isVersioned.
         * @member {boolean} isVersioned
         * @memberof fs.FS
         * @instance
         */
        FS.prototype.isVersioned = false;

        /**
         * FS writable.
         * @member {boolean} writable
         * @memberof fs.FS
         * @instance
         */
        FS.prototype.writable = false;

        /**
         * FS name.
         * @member {string} name
         * @memberof fs.FS
         * @instance
         */
        FS.prototype.name = "";

        /**
         * FS impl.
         * @member {common.IObjectReference|null|undefined} impl
         * @memberof fs.FS
         * @instance
         */
        FS.prototype.impl = null;

        /**
         * FS isSynced.
         * @member {boolean} isSynced
         * @memberof fs.FS
         * @instance
         */
        FS.prototype.isSynced = false;

        /**
         * Creates a new FS instance using the specified properties.
         * @function create
         * @memberof fs.FS
         * @static
         * @param {fs.IFS=} [properties] Properties to set
         * @returns {fs.FS} FS instance
         */
        FS.create = function create(properties) {
            return new FS(properties);
        };

        /**
         * Encodes the specified FS message. Does not implicitly {@link fs.FS.verify|verify} messages.
         * @function encode
         * @memberof fs.FS
         * @static
         * @param {fs.IFS} message FS message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FS.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.type);
            if (message.isVersioned != null && Object.hasOwnProperty.call(message, "isVersioned"))
                writer.uint32(/* id 2, wireType 0 =*/16).bool(message.isVersioned);
            if (message.writable != null && Object.hasOwnProperty.call(message, "writable"))
                writer.uint32(/* id 3, wireType 0 =*/24).bool(message.writable);
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                writer.uint32(/* id 4, wireType 2 =*/34).string(message.name);
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl"))
                $root.common.ObjectReference.encode(message.impl, writer.uint32(/* id 5, wireType 2 =*/42).fork(), q + 1).ldelim();
            if (message.isSynced != null && Object.hasOwnProperty.call(message, "isSynced"))
                writer.uint32(/* id 6, wireType 0 =*/48).bool(message.isSynced);
            return writer;
        };

        /**
         * Encodes the specified FS message, length delimited. Does not implicitly {@link fs.FS.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FS
         * @static
         * @param {fs.IFS} message FS message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FS.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FS message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FS
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FS} FS
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FS.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FS();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.type = reader.string();
                        break;
                    }
                case 2: {
                        message.isVersioned = reader.bool();
                        break;
                    }
                case 3: {
                        message.writable = reader.bool();
                        break;
                    }
                case 4: {
                        message.name = reader.string();
                        break;
                    }
                case 5: {
                        message.impl = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 6: {
                        message.isSynced = reader.bool();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FS message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FS
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FS} FS
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FS.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FS message.
         * @function verify
         * @memberof fs.FS
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FS.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.isVersioned != null && Object.hasOwnProperty.call(message, "isVersioned"))
                if (typeof message.isVersioned !== "boolean")
                    return "isVersioned: boolean expected";
            if (message.writable != null && Object.hasOwnProperty.call(message, "writable"))
                if (typeof message.writable !== "boolean")
                    return "writable: boolean expected";
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl")) {
                var error = $root.common.ObjectReference.verify(message.impl, long + 1);
                if (error)
                    return "impl." + error;
            }
            if (message.isSynced != null && Object.hasOwnProperty.call(message, "isSynced"))
                if (typeof message.isSynced !== "boolean")
                    return "isSynced: boolean expected";
            return null;
        };

        /**
         * Creates a FS message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FS
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FS} FS
         */
        FS.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FS)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FS: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FS();
            if (object.type != null)
                message.type = String(object.type);
            if (object.isVersioned != null)
                message.isVersioned = Boolean(object.isVersioned);
            if (object.writable != null)
                message.writable = Boolean(object.writable);
            if (object.name != null)
                message.name = String(object.name);
            if (object.impl != null) {
                if (!$util.isObject(object.impl))
                    throw TypeError(".fs.FS.impl: object expected");
                message.impl = $root.common.ObjectReference.fromObject(object.impl, long + 1);
            }
            if (object.isSynced != null)
                message.isSynced = Boolean(object.isSynced);
            return message;
        };

        /**
         * Creates a plain object from a FS message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FS
         * @static
         * @param {fs.FS} message FS
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FS.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.isVersioned = false;
                object.writable = false;
                object.name = "";
                object.impl = null;
                object.isSynced = false;
            }
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                object.type = message.type;
            if (message.isVersioned != null && Object.hasOwnProperty.call(message, "isVersioned"))
                object.isVersioned = message.isVersioned;
            if (message.writable != null && Object.hasOwnProperty.call(message, "writable"))
                object.writable = message.writable;
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                object.name = message.name;
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl"))
                object.impl = $root.common.ObjectReference.toObject(message.impl, options, q + 1);
            if (message.isSynced != null && Object.hasOwnProperty.call(message, "isSynced"))
                object.isSynced = message.isSynced;
            return object;
        };

        /**
         * Converts this FS to JSON.
         * @function toJSON
         * @memberof fs.FS
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FS.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FS
         * @function getTypeUrl
         * @memberof fs.FS
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FS.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FS";
        };

        return FS;
    })();

    fs.CheckPresenceRequestBody = (function() {

        /**
         * Properties of a CheckPresenceRequestBody.
         * @memberof fs
         * @interface ICheckPresenceRequestBody
         * @property {string|null} [path] CheckPresenceRequestBody path
         * @property {common.IBooleanValue|null} [throwIfMissing] CheckPresenceRequestBody throwIfMissing
         */

        /**
         * Constructs a new CheckPresenceRequestBody.
         * @memberof fs
         * @classdesc Represents a CheckPresenceRequestBody.
         * @implements ICheckPresenceRequestBody
         * @constructor
         * @param {fs.ICheckPresenceRequestBody=} [properties] Properties to set
         */
        function CheckPresenceRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * CheckPresenceRequestBody path.
         * @member {string} path
         * @memberof fs.CheckPresenceRequestBody
         * @instance
         */
        CheckPresenceRequestBody.prototype.path = "";

        /**
         * CheckPresenceRequestBody throwIfMissing.
         * @member {common.IBooleanValue|null|undefined} throwIfMissing
         * @memberof fs.CheckPresenceRequestBody
         * @instance
         */
        CheckPresenceRequestBody.prototype.throwIfMissing = null;

        /**
         * Creates a new CheckPresenceRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.CheckPresenceRequestBody
         * @static
         * @param {fs.ICheckPresenceRequestBody=} [properties] Properties to set
         * @returns {fs.CheckPresenceRequestBody} CheckPresenceRequestBody instance
         */
        CheckPresenceRequestBody.create = function create(properties) {
            return new CheckPresenceRequestBody(properties);
        };

        /**
         * Encodes the specified CheckPresenceRequestBody message. Does not implicitly {@link fs.CheckPresenceRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.CheckPresenceRequestBody
         * @static
         * @param {fs.ICheckPresenceRequestBody} message CheckPresenceRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CheckPresenceRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.throwIfMissing != null && Object.hasOwnProperty.call(message, "throwIfMissing"))
                $root.common.BooleanValue.encode(message.throwIfMissing, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified CheckPresenceRequestBody message, length delimited. Does not implicitly {@link fs.CheckPresenceRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.CheckPresenceRequestBody
         * @static
         * @param {fs.ICheckPresenceRequestBody} message CheckPresenceRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CheckPresenceRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a CheckPresenceRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.CheckPresenceRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.CheckPresenceRequestBody} CheckPresenceRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CheckPresenceRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.CheckPresenceRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.throwIfMissing = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a CheckPresenceRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.CheckPresenceRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.CheckPresenceRequestBody} CheckPresenceRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CheckPresenceRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a CheckPresenceRequestBody message.
         * @function verify
         * @memberof fs.CheckPresenceRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        CheckPresenceRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.throwIfMissing != null && Object.hasOwnProperty.call(message, "throwIfMissing")) {
                var error = $root.common.BooleanValue.verify(message.throwIfMissing, long + 1);
                if (error)
                    return "throwIfMissing." + error;
            }
            return null;
        };

        /**
         * Creates a CheckPresenceRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.CheckPresenceRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.CheckPresenceRequestBody} CheckPresenceRequestBody
         */
        CheckPresenceRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.CheckPresenceRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.CheckPresenceRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.CheckPresenceRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.throwIfMissing != null) {
                if (!$util.isObject(object.throwIfMissing))
                    throw TypeError(".fs.CheckPresenceRequestBody.throwIfMissing: object expected");
                message.throwIfMissing = $root.common.BooleanValue.fromObject(object.throwIfMissing, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a CheckPresenceRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.CheckPresenceRequestBody
         * @static
         * @param {fs.CheckPresenceRequestBody} message CheckPresenceRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        CheckPresenceRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.throwIfMissing = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.throwIfMissing != null && Object.hasOwnProperty.call(message, "throwIfMissing"))
                object.throwIfMissing = $root.common.BooleanValue.toObject(message.throwIfMissing, options, q + 1);
            return object;
        };

        /**
         * Converts this CheckPresenceRequestBody to JSON.
         * @function toJSON
         * @memberof fs.CheckPresenceRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        CheckPresenceRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for CheckPresenceRequestBody
         * @function getTypeUrl
         * @memberof fs.CheckPresenceRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        CheckPresenceRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.CheckPresenceRequestBody";
        };

        return CheckPresenceRequestBody;
    })();

    fs.PathOnlyRequestBody = (function() {

        /**
         * Properties of a PathOnlyRequestBody.
         * @memberof fs
         * @interface IPathOnlyRequestBody
         * @property {string|null} [path] PathOnlyRequestBody path
         */

        /**
         * Constructs a new PathOnlyRequestBody.
         * @memberof fs
         * @classdesc Represents a PathOnlyRequestBody.
         * @implements IPathOnlyRequestBody
         * @constructor
         * @param {fs.IPathOnlyRequestBody=} [properties] Properties to set
         */
        function PathOnlyRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * PathOnlyRequestBody path.
         * @member {string} path
         * @memberof fs.PathOnlyRequestBody
         * @instance
         */
        PathOnlyRequestBody.prototype.path = "";

        /**
         * Creates a new PathOnlyRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.PathOnlyRequestBody
         * @static
         * @param {fs.IPathOnlyRequestBody=} [properties] Properties to set
         * @returns {fs.PathOnlyRequestBody} PathOnlyRequestBody instance
         */
        PathOnlyRequestBody.create = function create(properties) {
            return new PathOnlyRequestBody(properties);
        };

        /**
         * Encodes the specified PathOnlyRequestBody message. Does not implicitly {@link fs.PathOnlyRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.PathOnlyRequestBody
         * @static
         * @param {fs.IPathOnlyRequestBody} message PathOnlyRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        PathOnlyRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            return writer;
        };

        /**
         * Encodes the specified PathOnlyRequestBody message, length delimited. Does not implicitly {@link fs.PathOnlyRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.PathOnlyRequestBody
         * @static
         * @param {fs.IPathOnlyRequestBody} message PathOnlyRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        PathOnlyRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a PathOnlyRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.PathOnlyRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.PathOnlyRequestBody} PathOnlyRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        PathOnlyRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.PathOnlyRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a PathOnlyRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.PathOnlyRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.PathOnlyRequestBody} PathOnlyRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        PathOnlyRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a PathOnlyRequestBody message.
         * @function verify
         * @memberof fs.PathOnlyRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        PathOnlyRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            return null;
        };

        /**
         * Creates a PathOnlyRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.PathOnlyRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.PathOnlyRequestBody} PathOnlyRequestBody
         */
        PathOnlyRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.PathOnlyRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.PathOnlyRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.PathOnlyRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            return message;
        };

        /**
         * Creates a plain object from a PathOnlyRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.PathOnlyRequestBody
         * @static
         * @param {fs.PathOnlyRequestBody} message PathOnlyRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        PathOnlyRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.path = "";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            return object;
        };

        /**
         * Converts this PathOnlyRequestBody to JSON.
         * @function toJSON
         * @memberof fs.PathOnlyRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        PathOnlyRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for PathOnlyRequestBody
         * @function getTypeUrl
         * @memberof fs.PathOnlyRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        PathOnlyRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.PathOnlyRequestBody";
        };

        return PathOnlyRequestBody;
    })();

    fs.GetXAttrRequestBody = (function() {

        /**
         * Properties of a GetXAttrRequestBody.
         * @memberof fs
         * @interface IGetXAttrRequestBody
         * @property {string|null} [path] GetXAttrRequestBody path
         * @property {string|null} [xaName] GetXAttrRequestBody xaName
         */

        /**
         * Constructs a new GetXAttrRequestBody.
         * @memberof fs
         * @classdesc Represents a GetXAttrRequestBody.
         * @implements IGetXAttrRequestBody
         * @constructor
         * @param {fs.IGetXAttrRequestBody=} [properties] Properties to set
         */
        function GetXAttrRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * GetXAttrRequestBody path.
         * @member {string} path
         * @memberof fs.GetXAttrRequestBody
         * @instance
         */
        GetXAttrRequestBody.prototype.path = "";

        /**
         * GetXAttrRequestBody xaName.
         * @member {string} xaName
         * @memberof fs.GetXAttrRequestBody
         * @instance
         */
        GetXAttrRequestBody.prototype.xaName = "";

        /**
         * Creates a new GetXAttrRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.GetXAttrRequestBody
         * @static
         * @param {fs.IGetXAttrRequestBody=} [properties] Properties to set
         * @returns {fs.GetXAttrRequestBody} GetXAttrRequestBody instance
         */
        GetXAttrRequestBody.create = function create(properties) {
            return new GetXAttrRequestBody(properties);
        };

        /**
         * Encodes the specified GetXAttrRequestBody message. Does not implicitly {@link fs.GetXAttrRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.GetXAttrRequestBody
         * @static
         * @param {fs.IGetXAttrRequestBody} message GetXAttrRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        GetXAttrRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.xaName);
            return writer;
        };

        /**
         * Encodes the specified GetXAttrRequestBody message, length delimited. Does not implicitly {@link fs.GetXAttrRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.GetXAttrRequestBody
         * @static
         * @param {fs.IGetXAttrRequestBody} message GetXAttrRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        GetXAttrRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a GetXAttrRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.GetXAttrRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.GetXAttrRequestBody} GetXAttrRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        GetXAttrRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.GetXAttrRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.xaName = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a GetXAttrRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.GetXAttrRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.GetXAttrRequestBody} GetXAttrRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        GetXAttrRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a GetXAttrRequestBody message.
         * @function verify
         * @memberof fs.GetXAttrRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        GetXAttrRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                if (!$util.isString(message.xaName))
                    return "xaName: string expected";
            return null;
        };

        /**
         * Creates a GetXAttrRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.GetXAttrRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.GetXAttrRequestBody} GetXAttrRequestBody
         */
        GetXAttrRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.GetXAttrRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.GetXAttrRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.GetXAttrRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.xaName != null)
                message.xaName = String(object.xaName);
            return message;
        };

        /**
         * Creates a plain object from a GetXAttrRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.GetXAttrRequestBody
         * @static
         * @param {fs.GetXAttrRequestBody} message GetXAttrRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        GetXAttrRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.xaName = "";
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                object.xaName = message.xaName;
            return object;
        };

        /**
         * Converts this GetXAttrRequestBody to JSON.
         * @function toJSON
         * @memberof fs.GetXAttrRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        GetXAttrRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for GetXAttrRequestBody
         * @function getTypeUrl
         * @memberof fs.GetXAttrRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        GetXAttrRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.GetXAttrRequestBody";
        };

        return GetXAttrRequestBody;
    })();

    fs.SymLink = (function() {

        /**
         * Properties of a SymLink.
         * @memberof fs
         * @interface ISymLink
         * @property {boolean|null} [readonly] SymLink readonly
         * @property {common.IBooleanValue|null} [isFile] SymLink isFile
         * @property {common.IBooleanValue|null} [isFolder] SymLink isFolder
         * @property {common.IObjectReference|null} [impl] SymLink impl
         */

        /**
         * Constructs a new SymLink.
         * @memberof fs
         * @classdesc Represents a SymLink.
         * @implements ISymLink
         * @constructor
         * @param {fs.ISymLink=} [properties] Properties to set
         */
        function SymLink(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * SymLink readonly.
         * @member {boolean} readonly
         * @memberof fs.SymLink
         * @instance
         */
        SymLink.prototype.readonly = false;

        /**
         * SymLink isFile.
         * @member {common.IBooleanValue|null|undefined} isFile
         * @memberof fs.SymLink
         * @instance
         */
        SymLink.prototype.isFile = null;

        /**
         * SymLink isFolder.
         * @member {common.IBooleanValue|null|undefined} isFolder
         * @memberof fs.SymLink
         * @instance
         */
        SymLink.prototype.isFolder = null;

        /**
         * SymLink impl.
         * @member {common.IObjectReference|null|undefined} impl
         * @memberof fs.SymLink
         * @instance
         */
        SymLink.prototype.impl = null;

        /**
         * Creates a new SymLink instance using the specified properties.
         * @function create
         * @memberof fs.SymLink
         * @static
         * @param {fs.ISymLink=} [properties] Properties to set
         * @returns {fs.SymLink} SymLink instance
         */
        SymLink.create = function create(properties) {
            return new SymLink(properties);
        };

        /**
         * Encodes the specified SymLink message. Does not implicitly {@link fs.SymLink.verify|verify} messages.
         * @function encode
         * @memberof fs.SymLink
         * @static
         * @param {fs.ISymLink} message SymLink message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SymLink.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.readonly != null && Object.hasOwnProperty.call(message, "readonly"))
                writer.uint32(/* id 1, wireType 0 =*/8).bool(message.readonly);
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                $root.common.BooleanValue.encode(message.isFile, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                $root.common.BooleanValue.encode(message.isFolder, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl"))
                $root.common.ObjectReference.encode(message.impl, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified SymLink message, length delimited. Does not implicitly {@link fs.SymLink.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.SymLink
         * @static
         * @param {fs.ISymLink} message SymLink message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SymLink.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a SymLink message from the specified reader or buffer.
         * @function decode
         * @memberof fs.SymLink
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.SymLink} SymLink
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SymLink.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SymLink();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.readonly = reader.bool();
                        break;
                    }
                case 2: {
                        message.isFile = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.isFolder = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.impl = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a SymLink message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.SymLink
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.SymLink} SymLink
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SymLink.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a SymLink message.
         * @function verify
         * @memberof fs.SymLink
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        SymLink.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.readonly != null && Object.hasOwnProperty.call(message, "readonly"))
                if (typeof message.readonly !== "boolean")
                    return "readonly: boolean expected";
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile")) {
                var error = $root.common.BooleanValue.verify(message.isFile, long + 1);
                if (error)
                    return "isFile." + error;
            }
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder")) {
                var error = $root.common.BooleanValue.verify(message.isFolder, long + 1);
                if (error)
                    return "isFolder." + error;
            }
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl")) {
                var error = $root.common.ObjectReference.verify(message.impl, long + 1);
                if (error)
                    return "impl." + error;
            }
            return null;
        };

        /**
         * Creates a SymLink message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.SymLink
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.SymLink} SymLink
         */
        SymLink.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.SymLink)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.SymLink: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.SymLink();
            if (object.readonly != null)
                message.readonly = Boolean(object.readonly);
            if (object.isFile != null) {
                if (!$util.isObject(object.isFile))
                    throw TypeError(".fs.SymLink.isFile: object expected");
                message.isFile = $root.common.BooleanValue.fromObject(object.isFile, long + 1);
            }
            if (object.isFolder != null) {
                if (!$util.isObject(object.isFolder))
                    throw TypeError(".fs.SymLink.isFolder: object expected");
                message.isFolder = $root.common.BooleanValue.fromObject(object.isFolder, long + 1);
            }
            if (object.impl != null) {
                if (!$util.isObject(object.impl))
                    throw TypeError(".fs.SymLink.impl: object expected");
                message.impl = $root.common.ObjectReference.fromObject(object.impl, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a SymLink message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.SymLink
         * @static
         * @param {fs.SymLink} message SymLink
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        SymLink.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.readonly = false;
                object.isFile = null;
                object.isFolder = null;
                object.impl = null;
            }
            if (message.readonly != null && Object.hasOwnProperty.call(message, "readonly"))
                object.readonly = message.readonly;
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                object.isFile = $root.common.BooleanValue.toObject(message.isFile, options, q + 1);
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                object.isFolder = $root.common.BooleanValue.toObject(message.isFolder, options, q + 1);
            if (message.impl != null && Object.hasOwnProperty.call(message, "impl"))
                object.impl = $root.common.ObjectReference.toObject(message.impl, options, q + 1);
            return object;
        };

        /**
         * Converts this SymLink to JSON.
         * @function toJSON
         * @memberof fs.SymLink
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        SymLink.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for SymLink
         * @function getTypeUrl
         * @memberof fs.SymLink
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        SymLink.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.SymLink";
        };

        return SymLink;
    })();

    fs.SymLinkTargetReplyBody = (function() {

        /**
         * Properties of a SymLinkTargetReplyBody.
         * @memberof fs
         * @interface ISymLinkTargetReplyBody
         * @property {fs.IFS|null} [fs] SymLinkTargetReplyBody fs
         * @property {file.IFile|null} [file] SymLinkTargetReplyBody file
         */

        /**
         * Constructs a new SymLinkTargetReplyBody.
         * @memberof fs
         * @classdesc Represents a SymLinkTargetReplyBody.
         * @implements ISymLinkTargetReplyBody
         * @constructor
         * @param {fs.ISymLinkTargetReplyBody=} [properties] Properties to set
         */
        function SymLinkTargetReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * SymLinkTargetReplyBody fs.
         * @member {fs.IFS|null|undefined} fs
         * @memberof fs.SymLinkTargetReplyBody
         * @instance
         */
        SymLinkTargetReplyBody.prototype.fs = null;

        /**
         * SymLinkTargetReplyBody file.
         * @member {file.IFile|null|undefined} file
         * @memberof fs.SymLinkTargetReplyBody
         * @instance
         */
        SymLinkTargetReplyBody.prototype.file = null;

        /**
         * Creates a new SymLinkTargetReplyBody instance using the specified properties.
         * @function create
         * @memberof fs.SymLinkTargetReplyBody
         * @static
         * @param {fs.ISymLinkTargetReplyBody=} [properties] Properties to set
         * @returns {fs.SymLinkTargetReplyBody} SymLinkTargetReplyBody instance
         */
        SymLinkTargetReplyBody.create = function create(properties) {
            return new SymLinkTargetReplyBody(properties);
        };

        /**
         * Encodes the specified SymLinkTargetReplyBody message. Does not implicitly {@link fs.SymLinkTargetReplyBody.verify|verify} messages.
         * @function encode
         * @memberof fs.SymLinkTargetReplyBody
         * @static
         * @param {fs.ISymLinkTargetReplyBody} message SymLinkTargetReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SymLinkTargetReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.fs != null && Object.hasOwnProperty.call(message, "fs"))
                $root.fs.FS.encode(message.fs, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                $root.file.File.encode(message.file, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified SymLinkTargetReplyBody message, length delimited. Does not implicitly {@link fs.SymLinkTargetReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.SymLinkTargetReplyBody
         * @static
         * @param {fs.ISymLinkTargetReplyBody} message SymLinkTargetReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SymLinkTargetReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a SymLinkTargetReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.SymLinkTargetReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.SymLinkTargetReplyBody} SymLinkTargetReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SymLinkTargetReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SymLinkTargetReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.fs = $root.fs.FS.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.file = $root.file.File.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a SymLinkTargetReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.SymLinkTargetReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.SymLinkTargetReplyBody} SymLinkTargetReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SymLinkTargetReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a SymLinkTargetReplyBody message.
         * @function verify
         * @memberof fs.SymLinkTargetReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        SymLinkTargetReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.fs != null && Object.hasOwnProperty.call(message, "fs")) {
                var error = $root.fs.FS.verify(message.fs, long + 1);
                if (error)
                    return "fs." + error;
            }
            if (message.file != null && Object.hasOwnProperty.call(message, "file")) {
                var error = $root.file.File.verify(message.file, long + 1);
                if (error)
                    return "file." + error;
            }
            return null;
        };

        /**
         * Creates a SymLinkTargetReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.SymLinkTargetReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.SymLinkTargetReplyBody} SymLinkTargetReplyBody
         */
        SymLinkTargetReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.SymLinkTargetReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.SymLinkTargetReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.SymLinkTargetReplyBody();
            if (object.fs != null) {
                if (!$util.isObject(object.fs))
                    throw TypeError(".fs.SymLinkTargetReplyBody.fs: object expected");
                message.fs = $root.fs.FS.fromObject(object.fs, long + 1);
            }
            if (object.file != null) {
                if (!$util.isObject(object.file))
                    throw TypeError(".fs.SymLinkTargetReplyBody.file: object expected");
                message.file = $root.file.File.fromObject(object.file, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a SymLinkTargetReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.SymLinkTargetReplyBody
         * @static
         * @param {fs.SymLinkTargetReplyBody} message SymLinkTargetReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        SymLinkTargetReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.fs = null;
                object.file = null;
            }
            if (message.fs != null && Object.hasOwnProperty.call(message, "fs"))
                object.fs = $root.fs.FS.toObject(message.fs, options, q + 1);
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                object.file = $root.file.File.toObject(message.file, options, q + 1);
            return object;
        };

        /**
         * Converts this SymLinkTargetReplyBody to JSON.
         * @function toJSON
         * @memberof fs.SymLinkTargetReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        SymLinkTargetReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for SymLinkTargetReplyBody
         * @function getTypeUrl
         * @memberof fs.SymLinkTargetReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        SymLinkTargetReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.SymLinkTargetReplyBody";
        };

        return SymLinkTargetReplyBody;
    })();

    fs.WatchTreeRequestBody = (function() {

        /**
         * Properties of a WatchTreeRequestBody.
         * @memberof fs
         * @interface IWatchTreeRequestBody
         * @property {string|null} [path] WatchTreeRequestBody path
         * @property {common.IUInt32Value|null} [depth] WatchTreeRequestBody depth
         */

        /**
         * Constructs a new WatchTreeRequestBody.
         * @memberof fs
         * @classdesc Represents a WatchTreeRequestBody.
         * @implements IWatchTreeRequestBody
         * @constructor
         * @param {fs.IWatchTreeRequestBody=} [properties] Properties to set
         */
        function WatchTreeRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * WatchTreeRequestBody path.
         * @member {string} path
         * @memberof fs.WatchTreeRequestBody
         * @instance
         */
        WatchTreeRequestBody.prototype.path = "";

        /**
         * WatchTreeRequestBody depth.
         * @member {common.IUInt32Value|null|undefined} depth
         * @memberof fs.WatchTreeRequestBody
         * @instance
         */
        WatchTreeRequestBody.prototype.depth = null;

        /**
         * Creates a new WatchTreeRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.WatchTreeRequestBody
         * @static
         * @param {fs.IWatchTreeRequestBody=} [properties] Properties to set
         * @returns {fs.WatchTreeRequestBody} WatchTreeRequestBody instance
         */
        WatchTreeRequestBody.create = function create(properties) {
            return new WatchTreeRequestBody(properties);
        };

        /**
         * Encodes the specified WatchTreeRequestBody message. Does not implicitly {@link fs.WatchTreeRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.WatchTreeRequestBody
         * @static
         * @param {fs.IWatchTreeRequestBody} message WatchTreeRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WatchTreeRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.depth != null && Object.hasOwnProperty.call(message, "depth"))
                $root.common.UInt32Value.encode(message.depth, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified WatchTreeRequestBody message, length delimited. Does not implicitly {@link fs.WatchTreeRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.WatchTreeRequestBody
         * @static
         * @param {fs.IWatchTreeRequestBody} message WatchTreeRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WatchTreeRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a WatchTreeRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.WatchTreeRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.WatchTreeRequestBody} WatchTreeRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WatchTreeRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.WatchTreeRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.depth = $root.common.UInt32Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a WatchTreeRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.WatchTreeRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.WatchTreeRequestBody} WatchTreeRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WatchTreeRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a WatchTreeRequestBody message.
         * @function verify
         * @memberof fs.WatchTreeRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        WatchTreeRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.depth != null && Object.hasOwnProperty.call(message, "depth")) {
                var error = $root.common.UInt32Value.verify(message.depth, long + 1);
                if (error)
                    return "depth." + error;
            }
            return null;
        };

        /**
         * Creates a WatchTreeRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.WatchTreeRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.WatchTreeRequestBody} WatchTreeRequestBody
         */
        WatchTreeRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.WatchTreeRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.WatchTreeRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.WatchTreeRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.depth != null) {
                if (!$util.isObject(object.depth))
                    throw TypeError(".fs.WatchTreeRequestBody.depth: object expected");
                message.depth = $root.common.UInt32Value.fromObject(object.depth, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a WatchTreeRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.WatchTreeRequestBody
         * @static
         * @param {fs.WatchTreeRequestBody} message WatchTreeRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        WatchTreeRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.depth = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.depth != null && Object.hasOwnProperty.call(message, "depth"))
                object.depth = $root.common.UInt32Value.toObject(message.depth, options, q + 1);
            return object;
        };

        /**
         * Converts this WatchTreeRequestBody to JSON.
         * @function toJSON
         * @memberof fs.WatchTreeRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        WatchTreeRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for WatchTreeRequestBody
         * @function getTypeUrl
         * @memberof fs.WatchTreeRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        WatchTreeRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.WatchTreeRequestBody";
        };

        return WatchTreeRequestBody;
    })();

    fs.ListFolderReplyBody = (function() {

        /**
         * Properties of a ListFolderReplyBody.
         * @memberof fs
         * @interface IListFolderReplyBody
         * @property {Array.<fs.IListingEntryMsg>|null} [entries] ListFolderReplyBody entries
         */

        /**
         * Constructs a new ListFolderReplyBody.
         * @memberof fs
         * @classdesc Represents a ListFolderReplyBody.
         * @implements IListFolderReplyBody
         * @constructor
         * @param {fs.IListFolderReplyBody=} [properties] Properties to set
         */
        function ListFolderReplyBody(properties) {
            this.entries = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ListFolderReplyBody entries.
         * @member {Array.<fs.IListingEntryMsg>} entries
         * @memberof fs.ListFolderReplyBody
         * @instance
         */
        ListFolderReplyBody.prototype.entries = $util.emptyArray;

        /**
         * Creates a new ListFolderReplyBody instance using the specified properties.
         * @function create
         * @memberof fs.ListFolderReplyBody
         * @static
         * @param {fs.IListFolderReplyBody=} [properties] Properties to set
         * @returns {fs.ListFolderReplyBody} ListFolderReplyBody instance
         */
        ListFolderReplyBody.create = function create(properties) {
            return new ListFolderReplyBody(properties);
        };

        /**
         * Encodes the specified ListFolderReplyBody message. Does not implicitly {@link fs.ListFolderReplyBody.verify|verify} messages.
         * @function encode
         * @memberof fs.ListFolderReplyBody
         * @static
         * @param {fs.IListFolderReplyBody} message ListFolderReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ListFolderReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.entries != null && message.entries.length)
                for (var i = 0; i < message.entries.length; ++i)
                    $root.fs.ListingEntryMsg.encode(message.entries[i], writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified ListFolderReplyBody message, length delimited. Does not implicitly {@link fs.ListFolderReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.ListFolderReplyBody
         * @static
         * @param {fs.IListFolderReplyBody} message ListFolderReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ListFolderReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a ListFolderReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.ListFolderReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.ListFolderReplyBody} ListFolderReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ListFolderReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.ListFolderReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.entries && message.entries.length))
                            message.entries = [];
                        message.entries.push($root.fs.ListingEntryMsg.decode(reader, reader.uint32(), undefined, long + 1));
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a ListFolderReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.ListFolderReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.ListFolderReplyBody} ListFolderReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ListFolderReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a ListFolderReplyBody message.
         * @function verify
         * @memberof fs.ListFolderReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ListFolderReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.entries != null && Object.hasOwnProperty.call(message, "entries")) {
                if (!Array.isArray(message.entries))
                    return "entries: array expected";
                for (var i = 0; i < message.entries.length; ++i) {
                    var error = $root.fs.ListingEntryMsg.verify(message.entries[i], long + 1);
                    if (error)
                        return "entries." + error;
                }
            }
            return null;
        };

        /**
         * Creates a ListFolderReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.ListFolderReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.ListFolderReplyBody} ListFolderReplyBody
         */
        ListFolderReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.ListFolderReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.ListFolderReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.ListFolderReplyBody();
            if (object.entries) {
                if (!Array.isArray(object.entries))
                    throw TypeError(".fs.ListFolderReplyBody.entries: array expected");
                message.entries = [];
                for (var i = 0; i < object.entries.length; ++i) {
                    if (!$util.isObject(object.entries[i]))
                        throw TypeError(".fs.ListFolderReplyBody.entries: object expected");
                    message.entries[i] = $root.fs.ListingEntryMsg.fromObject(object.entries[i], long + 1);
                }
            }
            return message;
        };

        /**
         * Creates a plain object from a ListFolderReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.ListFolderReplyBody
         * @static
         * @param {fs.ListFolderReplyBody} message ListFolderReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ListFolderReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.entries = [];
            if (message.entries && message.entries.length) {
                object.entries = [];
                for (var j = 0; j < message.entries.length; ++j)
                    object.entries[j] = $root.fs.ListingEntryMsg.toObject(message.entries[j], options, q + 1);
            }
            return object;
        };

        /**
         * Converts this ListFolderReplyBody to JSON.
         * @function toJSON
         * @memberof fs.ListFolderReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ListFolderReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ListFolderReplyBody
         * @function getTypeUrl
         * @memberof fs.ListFolderReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ListFolderReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.ListFolderReplyBody";
        };

        return ListFolderReplyBody;
    })();

    fs.ListingEntryMsg = (function() {

        /**
         * Properties of a ListingEntryMsg.
         * @memberof fs
         * @interface IListingEntryMsg
         * @property {string|null} [name] ListingEntryMsg name
         * @property {common.IBooleanValue|null} [isFile] ListingEntryMsg isFile
         * @property {common.IBooleanValue|null} [isFolder] ListingEntryMsg isFolder
         * @property {common.IBooleanValue|null} [isLink] ListingEntryMsg isLink
         */

        /**
         * Constructs a new ListingEntryMsg.
         * @memberof fs
         * @classdesc Represents a ListingEntryMsg.
         * @implements IListingEntryMsg
         * @constructor
         * @param {fs.IListingEntryMsg=} [properties] Properties to set
         */
        function ListingEntryMsg(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ListingEntryMsg name.
         * @member {string} name
         * @memberof fs.ListingEntryMsg
         * @instance
         */
        ListingEntryMsg.prototype.name = "";

        /**
         * ListingEntryMsg isFile.
         * @member {common.IBooleanValue|null|undefined} isFile
         * @memberof fs.ListingEntryMsg
         * @instance
         */
        ListingEntryMsg.prototype.isFile = null;

        /**
         * ListingEntryMsg isFolder.
         * @member {common.IBooleanValue|null|undefined} isFolder
         * @memberof fs.ListingEntryMsg
         * @instance
         */
        ListingEntryMsg.prototype.isFolder = null;

        /**
         * ListingEntryMsg isLink.
         * @member {common.IBooleanValue|null|undefined} isLink
         * @memberof fs.ListingEntryMsg
         * @instance
         */
        ListingEntryMsg.prototype.isLink = null;

        /**
         * Creates a new ListingEntryMsg instance using the specified properties.
         * @function create
         * @memberof fs.ListingEntryMsg
         * @static
         * @param {fs.IListingEntryMsg=} [properties] Properties to set
         * @returns {fs.ListingEntryMsg} ListingEntryMsg instance
         */
        ListingEntryMsg.create = function create(properties) {
            return new ListingEntryMsg(properties);
        };

        /**
         * Encodes the specified ListingEntryMsg message. Does not implicitly {@link fs.ListingEntryMsg.verify|verify} messages.
         * @function encode
         * @memberof fs.ListingEntryMsg
         * @static
         * @param {fs.IListingEntryMsg} message ListingEntryMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ListingEntryMsg.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                $root.common.BooleanValue.encode(message.isFile, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                $root.common.BooleanValue.encode(message.isFolder, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink"))
                $root.common.BooleanValue.encode(message.isLink, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified ListingEntryMsg message, length delimited. Does not implicitly {@link fs.ListingEntryMsg.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.ListingEntryMsg
         * @static
         * @param {fs.IListingEntryMsg} message ListingEntryMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ListingEntryMsg.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a ListingEntryMsg message from the specified reader or buffer.
         * @function decode
         * @memberof fs.ListingEntryMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.ListingEntryMsg} ListingEntryMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ListingEntryMsg.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.ListingEntryMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.name = reader.string();
                        break;
                    }
                case 2: {
                        message.isFile = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.isFolder = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.isLink = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a ListingEntryMsg message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.ListingEntryMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.ListingEntryMsg} ListingEntryMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ListingEntryMsg.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a ListingEntryMsg message.
         * @function verify
         * @memberof fs.ListingEntryMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ListingEntryMsg.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile")) {
                var error = $root.common.BooleanValue.verify(message.isFile, long + 1);
                if (error)
                    return "isFile." + error;
            }
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder")) {
                var error = $root.common.BooleanValue.verify(message.isFolder, long + 1);
                if (error)
                    return "isFolder." + error;
            }
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink")) {
                var error = $root.common.BooleanValue.verify(message.isLink, long + 1);
                if (error)
                    return "isLink." + error;
            }
            return null;
        };

        /**
         * Creates a ListingEntryMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.ListingEntryMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.ListingEntryMsg} ListingEntryMsg
         */
        ListingEntryMsg.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.ListingEntryMsg)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.ListingEntryMsg: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.ListingEntryMsg();
            if (object.name != null)
                message.name = String(object.name);
            if (object.isFile != null) {
                if (!$util.isObject(object.isFile))
                    throw TypeError(".fs.ListingEntryMsg.isFile: object expected");
                message.isFile = $root.common.BooleanValue.fromObject(object.isFile, long + 1);
            }
            if (object.isFolder != null) {
                if (!$util.isObject(object.isFolder))
                    throw TypeError(".fs.ListingEntryMsg.isFolder: object expected");
                message.isFolder = $root.common.BooleanValue.fromObject(object.isFolder, long + 1);
            }
            if (object.isLink != null) {
                if (!$util.isObject(object.isLink))
                    throw TypeError(".fs.ListingEntryMsg.isLink: object expected");
                message.isLink = $root.common.BooleanValue.fromObject(object.isLink, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a ListingEntryMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.ListingEntryMsg
         * @static
         * @param {fs.ListingEntryMsg} message ListingEntryMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ListingEntryMsg.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.name = "";
                object.isFile = null;
                object.isFolder = null;
                object.isLink = null;
            }
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                object.name = message.name;
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                object.isFile = $root.common.BooleanValue.toObject(message.isFile, options, q + 1);
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                object.isFolder = $root.common.BooleanValue.toObject(message.isFolder, options, q + 1);
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink"))
                object.isLink = $root.common.BooleanValue.toObject(message.isLink, options, q + 1);
            return object;
        };

        /**
         * Converts this ListingEntryMsg to JSON.
         * @function toJSON
         * @memberof fs.ListingEntryMsg
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ListingEntryMsg.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ListingEntryMsg
         * @function getTypeUrl
         * @memberof fs.ListingEntryMsg
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ListingEntryMsg.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.ListingEntryMsg";
        };

        return ListingEntryMsg;
    })();

    fs.ReadBytesRequestBody = (function() {

        /**
         * Properties of a ReadBytesRequestBody.
         * @memberof fs
         * @interface IReadBytesRequestBody
         * @property {string|null} [path] ReadBytesRequestBody path
         * @property {common.IUInt64Value|null} [start] ReadBytesRequestBody start
         * @property {common.IUInt64Value|null} [end] ReadBytesRequestBody end
         */

        /**
         * Constructs a new ReadBytesRequestBody.
         * @memberof fs
         * @classdesc Represents a ReadBytesRequestBody.
         * @implements IReadBytesRequestBody
         * @constructor
         * @param {fs.IReadBytesRequestBody=} [properties] Properties to set
         */
        function ReadBytesRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ReadBytesRequestBody path.
         * @member {string} path
         * @memberof fs.ReadBytesRequestBody
         * @instance
         */
        ReadBytesRequestBody.prototype.path = "";

        /**
         * ReadBytesRequestBody start.
         * @member {common.IUInt64Value|null|undefined} start
         * @memberof fs.ReadBytesRequestBody
         * @instance
         */
        ReadBytesRequestBody.prototype.start = null;

        /**
         * ReadBytesRequestBody end.
         * @member {common.IUInt64Value|null|undefined} end
         * @memberof fs.ReadBytesRequestBody
         * @instance
         */
        ReadBytesRequestBody.prototype.end = null;

        /**
         * Creates a new ReadBytesRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.ReadBytesRequestBody
         * @static
         * @param {fs.IReadBytesRequestBody=} [properties] Properties to set
         * @returns {fs.ReadBytesRequestBody} ReadBytesRequestBody instance
         */
        ReadBytesRequestBody.create = function create(properties) {
            return new ReadBytesRequestBody(properties);
        };

        /**
         * Encodes the specified ReadBytesRequestBody message. Does not implicitly {@link fs.ReadBytesRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.ReadBytesRequestBody
         * @static
         * @param {fs.IReadBytesRequestBody} message ReadBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ReadBytesRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                $root.common.UInt64Value.encode(message.start, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                $root.common.UInt64Value.encode(message.end, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified ReadBytesRequestBody message, length delimited. Does not implicitly {@link fs.ReadBytesRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.ReadBytesRequestBody
         * @static
         * @param {fs.IReadBytesRequestBody} message ReadBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ReadBytesRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a ReadBytesRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.ReadBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.ReadBytesRequestBody} ReadBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ReadBytesRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.ReadBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.start = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.end = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a ReadBytesRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.ReadBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.ReadBytesRequestBody} ReadBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ReadBytesRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a ReadBytesRequestBody message.
         * @function verify
         * @memberof fs.ReadBytesRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ReadBytesRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.start != null && Object.hasOwnProperty.call(message, "start")) {
                var error = $root.common.UInt64Value.verify(message.start, long + 1);
                if (error)
                    return "start." + error;
            }
            if (message.end != null && Object.hasOwnProperty.call(message, "end")) {
                var error = $root.common.UInt64Value.verify(message.end, long + 1);
                if (error)
                    return "end." + error;
            }
            return null;
        };

        /**
         * Creates a ReadBytesRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.ReadBytesRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.ReadBytesRequestBody} ReadBytesRequestBody
         */
        ReadBytesRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.ReadBytesRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.ReadBytesRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.ReadBytesRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.start != null) {
                if (!$util.isObject(object.start))
                    throw TypeError(".fs.ReadBytesRequestBody.start: object expected");
                message.start = $root.common.UInt64Value.fromObject(object.start, long + 1);
            }
            if (object.end != null) {
                if (!$util.isObject(object.end))
                    throw TypeError(".fs.ReadBytesRequestBody.end: object expected");
                message.end = $root.common.UInt64Value.fromObject(object.end, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a ReadBytesRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.ReadBytesRequestBody
         * @static
         * @param {fs.ReadBytesRequestBody} message ReadBytesRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ReadBytesRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.start = null;
                object.end = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                object.start = $root.common.UInt64Value.toObject(message.start, options, q + 1);
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                object.end = $root.common.UInt64Value.toObject(message.end, options, q + 1);
            return object;
        };

        /**
         * Converts this ReadBytesRequestBody to JSON.
         * @function toJSON
         * @memberof fs.ReadBytesRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ReadBytesRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ReadBytesRequestBody
         * @function getTypeUrl
         * @memberof fs.ReadBytesRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ReadBytesRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.ReadBytesRequestBody";
        };

        return ReadBytesRequestBody;
    })();

    fs.SelectRequestBody = (function() {

        /**
         * Properties of a SelectRequestBody.
         * @memberof fs
         * @interface ISelectRequestBody
         * @property {string|null} [path] SelectRequestBody path
         * @property {fs.SelectRequestBody.ISelectCriteria|null} [criteria] SelectRequestBody criteria
         */

        /**
         * Constructs a new SelectRequestBody.
         * @memberof fs
         * @classdesc Represents a SelectRequestBody.
         * @implements ISelectRequestBody
         * @constructor
         * @param {fs.ISelectRequestBody=} [properties] Properties to set
         */
        function SelectRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * SelectRequestBody path.
         * @member {string} path
         * @memberof fs.SelectRequestBody
         * @instance
         */
        SelectRequestBody.prototype.path = "";

        /**
         * SelectRequestBody criteria.
         * @member {fs.SelectRequestBody.ISelectCriteria|null|undefined} criteria
         * @memberof fs.SelectRequestBody
         * @instance
         */
        SelectRequestBody.prototype.criteria = null;

        /**
         * Creates a new SelectRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.SelectRequestBody
         * @static
         * @param {fs.ISelectRequestBody=} [properties] Properties to set
         * @returns {fs.SelectRequestBody} SelectRequestBody instance
         */
        SelectRequestBody.create = function create(properties) {
            return new SelectRequestBody(properties);
        };

        /**
         * Encodes the specified SelectRequestBody message. Does not implicitly {@link fs.SelectRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.SelectRequestBody
         * @static
         * @param {fs.ISelectRequestBody} message SelectRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SelectRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.criteria != null && Object.hasOwnProperty.call(message, "criteria"))
                $root.fs.SelectRequestBody.SelectCriteria.encode(message.criteria, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified SelectRequestBody message, length delimited. Does not implicitly {@link fs.SelectRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.SelectRequestBody
         * @static
         * @param {fs.ISelectRequestBody} message SelectRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SelectRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a SelectRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.SelectRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.SelectRequestBody} SelectRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SelectRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SelectRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.criteria = $root.fs.SelectRequestBody.SelectCriteria.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a SelectRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.SelectRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.SelectRequestBody} SelectRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SelectRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a SelectRequestBody message.
         * @function verify
         * @memberof fs.SelectRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        SelectRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.criteria != null && Object.hasOwnProperty.call(message, "criteria")) {
                var error = $root.fs.SelectRequestBody.SelectCriteria.verify(message.criteria, long + 1);
                if (error)
                    return "criteria." + error;
            }
            return null;
        };

        /**
         * Creates a SelectRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.SelectRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.SelectRequestBody} SelectRequestBody
         */
        SelectRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.SelectRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.SelectRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.SelectRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.criteria != null) {
                if (!$util.isObject(object.criteria))
                    throw TypeError(".fs.SelectRequestBody.criteria: object expected");
                message.criteria = $root.fs.SelectRequestBody.SelectCriteria.fromObject(object.criteria, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a SelectRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.SelectRequestBody
         * @static
         * @param {fs.SelectRequestBody} message SelectRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        SelectRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.criteria = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.criteria != null && Object.hasOwnProperty.call(message, "criteria"))
                object.criteria = $root.fs.SelectRequestBody.SelectCriteria.toObject(message.criteria, options, q + 1);
            return object;
        };

        /**
         * Converts this SelectRequestBody to JSON.
         * @function toJSON
         * @memberof fs.SelectRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        SelectRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for SelectRequestBody
         * @function getTypeUrl
         * @memberof fs.SelectRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        SelectRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.SelectRequestBody";
        };

        SelectRequestBody.SelectCriteria = (function() {

            /**
             * Properties of a SelectCriteria.
             * @memberof fs.SelectRequestBody
             * @interface ISelectCriteria
             * @property {common.IStringValue|null} [exactName] SelectCriteria exactName
             * @property {common.IStringValue|null} [pattern] SelectCriteria pattern
             * @property {common.IStringValue|null} [regexp] SelectCriteria regexp
             * @property {common.IUInt32Value|null} [depth] SelectCriteria depth
             * @property {Array.<string>|null} [type] SelectCriteria type
             * @property {string|null} [action] SelectCriteria action
             */

            /**
             * Constructs a new SelectCriteria.
             * @memberof fs.SelectRequestBody
             * @classdesc Represents a SelectCriteria.
             * @implements ISelectCriteria
             * @constructor
             * @param {fs.SelectRequestBody.ISelectCriteria=} [properties] Properties to set
             */
            function SelectCriteria(properties) {
                this.type = [];
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * SelectCriteria exactName.
             * @member {common.IStringValue|null|undefined} exactName
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @instance
             */
            SelectCriteria.prototype.exactName = null;

            /**
             * SelectCriteria pattern.
             * @member {common.IStringValue|null|undefined} pattern
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @instance
             */
            SelectCriteria.prototype.pattern = null;

            /**
             * SelectCriteria regexp.
             * @member {common.IStringValue|null|undefined} regexp
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @instance
             */
            SelectCriteria.prototype.regexp = null;

            /**
             * SelectCriteria depth.
             * @member {common.IUInt32Value|null|undefined} depth
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @instance
             */
            SelectCriteria.prototype.depth = null;

            /**
             * SelectCriteria type.
             * @member {Array.<string>} type
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @instance
             */
            SelectCriteria.prototype.type = $util.emptyArray;

            /**
             * SelectCriteria action.
             * @member {string} action
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @instance
             */
            SelectCriteria.prototype.action = "";

            /**
             * Creates a new SelectCriteria instance using the specified properties.
             * @function create
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @static
             * @param {fs.SelectRequestBody.ISelectCriteria=} [properties] Properties to set
             * @returns {fs.SelectRequestBody.SelectCriteria} SelectCriteria instance
             */
            SelectCriteria.create = function create(properties) {
                return new SelectCriteria(properties);
            };

            /**
             * Encodes the specified SelectCriteria message. Does not implicitly {@link fs.SelectRequestBody.SelectCriteria.verify|verify} messages.
             * @function encode
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @static
             * @param {fs.SelectRequestBody.ISelectCriteria} message SelectCriteria message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            SelectCriteria.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.exactName != null && Object.hasOwnProperty.call(message, "exactName"))
                    $root.common.StringValue.encode(message.exactName, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
                if (message.pattern != null && Object.hasOwnProperty.call(message, "pattern"))
                    $root.common.StringValue.encode(message.pattern, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
                if (message.regexp != null && Object.hasOwnProperty.call(message, "regexp"))
                    $root.common.StringValue.encode(message.regexp, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
                if (message.depth != null && Object.hasOwnProperty.call(message, "depth"))
                    $root.common.UInt32Value.encode(message.depth, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
                if (message.type != null && message.type.length)
                    for (var i = 0; i < message.type.length; ++i)
                        writer.uint32(/* id 5, wireType 2 =*/42).string(message.type[i]);
                if (message.action != null && Object.hasOwnProperty.call(message, "action"))
                    writer.uint32(/* id 6, wireType 2 =*/50).string(message.action);
                return writer;
            };

            /**
             * Encodes the specified SelectCriteria message, length delimited. Does not implicitly {@link fs.SelectRequestBody.SelectCriteria.verify|verify} messages.
             * @function encodeDelimited
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @static
             * @param {fs.SelectRequestBody.ISelectCriteria} message SelectCriteria message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            SelectCriteria.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes a SelectCriteria message from the specified reader or buffer.
             * @function decode
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {fs.SelectRequestBody.SelectCriteria} SelectCriteria
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            SelectCriteria.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SelectRequestBody.SelectCriteria();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.exactName = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 2: {
                            message.pattern = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 3: {
                            message.regexp = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 4: {
                            message.depth = $root.common.UInt32Value.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 5: {
                            if (!(message.type && message.type.length))
                                message.type = [];
                            message.type.push(reader.string());
                            break;
                        }
                    case 6: {
                            message.action = reader.string();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a SelectCriteria message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {fs.SelectRequestBody.SelectCriteria} SelectCriteria
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            SelectCriteria.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a SelectCriteria message.
             * @function verify
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            SelectCriteria.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.exactName != null && Object.hasOwnProperty.call(message, "exactName")) {
                    var error = $root.common.StringValue.verify(message.exactName, long + 1);
                    if (error)
                        return "exactName." + error;
                }
                if (message.pattern != null && Object.hasOwnProperty.call(message, "pattern")) {
                    var error = $root.common.StringValue.verify(message.pattern, long + 1);
                    if (error)
                        return "pattern." + error;
                }
                if (message.regexp != null && Object.hasOwnProperty.call(message, "regexp")) {
                    var error = $root.common.StringValue.verify(message.regexp, long + 1);
                    if (error)
                        return "regexp." + error;
                }
                if (message.depth != null && Object.hasOwnProperty.call(message, "depth")) {
                    var error = $root.common.UInt32Value.verify(message.depth, long + 1);
                    if (error)
                        return "depth." + error;
                }
                if (message.type != null && Object.hasOwnProperty.call(message, "type")) {
                    if (!Array.isArray(message.type))
                        return "type: array expected";
                    for (var i = 0; i < message.type.length; ++i)
                        if (!$util.isString(message.type[i]))
                            return "type: string[] expected";
                }
                if (message.action != null && Object.hasOwnProperty.call(message, "action"))
                    if (!$util.isString(message.action))
                        return "action: string expected";
                return null;
            };

            /**
             * Creates a SelectCriteria message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {fs.SelectRequestBody.SelectCriteria} SelectCriteria
             */
            SelectCriteria.fromObject = function fromObject(object, long) {
                if (object instanceof $root.fs.SelectRequestBody.SelectCriteria)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".fs.SelectRequestBody.SelectCriteria: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.fs.SelectRequestBody.SelectCriteria();
                if (object.exactName != null) {
                    if (!$util.isObject(object.exactName))
                        throw TypeError(".fs.SelectRequestBody.SelectCriteria.exactName: object expected");
                    message.exactName = $root.common.StringValue.fromObject(object.exactName, long + 1);
                }
                if (object.pattern != null) {
                    if (!$util.isObject(object.pattern))
                        throw TypeError(".fs.SelectRequestBody.SelectCriteria.pattern: object expected");
                    message.pattern = $root.common.StringValue.fromObject(object.pattern, long + 1);
                }
                if (object.regexp != null) {
                    if (!$util.isObject(object.regexp))
                        throw TypeError(".fs.SelectRequestBody.SelectCriteria.regexp: object expected");
                    message.regexp = $root.common.StringValue.fromObject(object.regexp, long + 1);
                }
                if (object.depth != null) {
                    if (!$util.isObject(object.depth))
                        throw TypeError(".fs.SelectRequestBody.SelectCriteria.depth: object expected");
                    message.depth = $root.common.UInt32Value.fromObject(object.depth, long + 1);
                }
                if (object.type) {
                    if (!Array.isArray(object.type))
                        throw TypeError(".fs.SelectRequestBody.SelectCriteria.type: array expected");
                    message.type = [];
                    for (var i = 0; i < object.type.length; ++i)
                        message.type[i] = String(object.type[i]);
                }
                if (object.action != null)
                    message.action = String(object.action);
                return message;
            };

            /**
             * Creates a plain object from a SelectCriteria message. Also converts values to other types if specified.
             * @function toObject
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @static
             * @param {fs.SelectRequestBody.SelectCriteria} message SelectCriteria
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            SelectCriteria.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.arrays || options.defaults)
                    object.type = [];
                if (options.defaults) {
                    object.exactName = null;
                    object.pattern = null;
                    object.regexp = null;
                    object.depth = null;
                    object.action = "";
                }
                if (message.exactName != null && Object.hasOwnProperty.call(message, "exactName"))
                    object.exactName = $root.common.StringValue.toObject(message.exactName, options, q + 1);
                if (message.pattern != null && Object.hasOwnProperty.call(message, "pattern"))
                    object.pattern = $root.common.StringValue.toObject(message.pattern, options, q + 1);
                if (message.regexp != null && Object.hasOwnProperty.call(message, "regexp"))
                    object.regexp = $root.common.StringValue.toObject(message.regexp, options, q + 1);
                if (message.depth != null && Object.hasOwnProperty.call(message, "depth"))
                    object.depth = $root.common.UInt32Value.toObject(message.depth, options, q + 1);
                if (message.type && message.type.length) {
                    object.type = [];
                    for (var j = 0; j < message.type.length; ++j)
                        object.type[j] = message.type[j];
                }
                if (message.action != null && Object.hasOwnProperty.call(message, "action"))
                    object.action = message.action;
                return object;
            };

            /**
             * Converts this SelectCriteria to JSON.
             * @function toJSON
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            SelectCriteria.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for SelectCriteria
             * @function getTypeUrl
             * @memberof fs.SelectRequestBody.SelectCriteria
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            SelectCriteria.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/fs.SelectRequestBody.SelectCriteria";
            };

            return SelectCriteria;
        })();

        return SelectRequestBody;
    })();

    fs.FSCGetRequestBody = (function() {

        /**
         * Properties of a FSCGetRequestBody.
         * @memberof fs
         * @interface IFSCGetRequestBody
         * @property {string|null} [name] FSCGetRequestBody name
         */

        /**
         * Constructs a new FSCGetRequestBody.
         * @memberof fs
         * @classdesc Represents a FSCGetRequestBody.
         * @implements IFSCGetRequestBody
         * @constructor
         * @param {fs.IFSCGetRequestBody=} [properties] Properties to set
         */
        function FSCGetRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FSCGetRequestBody name.
         * @member {string} name
         * @memberof fs.FSCGetRequestBody
         * @instance
         */
        FSCGetRequestBody.prototype.name = "";

        /**
         * Creates a new FSCGetRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.FSCGetRequestBody
         * @static
         * @param {fs.IFSCGetRequestBody=} [properties] Properties to set
         * @returns {fs.FSCGetRequestBody} FSCGetRequestBody instance
         */
        FSCGetRequestBody.create = function create(properties) {
            return new FSCGetRequestBody(properties);
        };

        /**
         * Encodes the specified FSCGetRequestBody message. Does not implicitly {@link fs.FSCGetRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.FSCGetRequestBody
         * @static
         * @param {fs.IFSCGetRequestBody} message FSCGetRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSCGetRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
            return writer;
        };

        /**
         * Encodes the specified FSCGetRequestBody message, length delimited. Does not implicitly {@link fs.FSCGetRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FSCGetRequestBody
         * @static
         * @param {fs.IFSCGetRequestBody} message FSCGetRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSCGetRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FSCGetRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FSCGetRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FSCGetRequestBody} FSCGetRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSCGetRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSCGetRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.name = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FSCGetRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FSCGetRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FSCGetRequestBody} FSCGetRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSCGetRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FSCGetRequestBody message.
         * @function verify
         * @memberof fs.FSCGetRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSCGetRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            return null;
        };

        /**
         * Creates a FSCGetRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSCGetRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSCGetRequestBody} FSCGetRequestBody
         */
        FSCGetRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FSCGetRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FSCGetRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FSCGetRequestBody();
            if (object.name != null)
                message.name = String(object.name);
            return message;
        };

        /**
         * Creates a plain object from a FSCGetRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSCGetRequestBody
         * @static
         * @param {fs.FSCGetRequestBody} message FSCGetRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSCGetRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.name = "";
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                object.name = message.name;
            return object;
        };

        /**
         * Converts this FSCGetRequestBody to JSON.
         * @function toJSON
         * @memberof fs.FSCGetRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FSCGetRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FSCGetRequestBody
         * @function getTypeUrl
         * @memberof fs.FSCGetRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FSCGetRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FSCGetRequestBody";
        };

        return FSCGetRequestBody;
    })();

    fs.FSCGetReplyBody = (function() {

        /**
         * Properties of a FSCGetReplyBody.
         * @memberof fs
         * @interface IFSCGetReplyBody
         * @property {fs.IFSItem|null} [item] FSCGetReplyBody item
         */

        /**
         * Constructs a new FSCGetReplyBody.
         * @memberof fs
         * @classdesc Represents a FSCGetReplyBody.
         * @implements IFSCGetReplyBody
         * @constructor
         * @param {fs.IFSCGetReplyBody=} [properties] Properties to set
         */
        function FSCGetReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FSCGetReplyBody item.
         * @member {fs.IFSItem|null|undefined} item
         * @memberof fs.FSCGetReplyBody
         * @instance
         */
        FSCGetReplyBody.prototype.item = null;

        /**
         * Creates a new FSCGetReplyBody instance using the specified properties.
         * @function create
         * @memberof fs.FSCGetReplyBody
         * @static
         * @param {fs.IFSCGetReplyBody=} [properties] Properties to set
         * @returns {fs.FSCGetReplyBody} FSCGetReplyBody instance
         */
        FSCGetReplyBody.create = function create(properties) {
            return new FSCGetReplyBody(properties);
        };

        /**
         * Encodes the specified FSCGetReplyBody message. Does not implicitly {@link fs.FSCGetReplyBody.verify|verify} messages.
         * @function encode
         * @memberof fs.FSCGetReplyBody
         * @static
         * @param {fs.IFSCGetReplyBody} message FSCGetReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSCGetReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                $root.fs.FSItem.encode(message.item, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FSCGetReplyBody message, length delimited. Does not implicitly {@link fs.FSCGetReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FSCGetReplyBody
         * @static
         * @param {fs.IFSCGetReplyBody} message FSCGetReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSCGetReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FSCGetReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FSCGetReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FSCGetReplyBody} FSCGetReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSCGetReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSCGetReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.item = $root.fs.FSItem.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FSCGetReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FSCGetReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FSCGetReplyBody} FSCGetReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSCGetReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FSCGetReplyBody message.
         * @function verify
         * @memberof fs.FSCGetReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSCGetReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.item != null && Object.hasOwnProperty.call(message, "item")) {
                var error = $root.fs.FSItem.verify(message.item, long + 1);
                if (error)
                    return "item." + error;
            }
            return null;
        };

        /**
         * Creates a FSCGetReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSCGetReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSCGetReplyBody} FSCGetReplyBody
         */
        FSCGetReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FSCGetReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FSCGetReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FSCGetReplyBody();
            if (object.item != null) {
                if (!$util.isObject(object.item))
                    throw TypeError(".fs.FSCGetReplyBody.item: object expected");
                message.item = $root.fs.FSItem.fromObject(object.item, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a FSCGetReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSCGetReplyBody
         * @static
         * @param {fs.FSCGetReplyBody} message FSCGetReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSCGetReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.item = null;
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                object.item = $root.fs.FSItem.toObject(message.item, options, q + 1);
            return object;
        };

        /**
         * Converts this FSCGetReplyBody to JSON.
         * @function toJSON
         * @memberof fs.FSCGetReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FSCGetReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FSCGetReplyBody
         * @function getTypeUrl
         * @memberof fs.FSCGetReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FSCGetReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FSCGetReplyBody";
        };

        return FSCGetReplyBody;
    })();

    fs.FSItem = (function() {

        /**
         * Properties of a FSItem.
         * @memberof fs
         * @interface IFSItem
         * @property {common.IBooleanValue|null} [isFile] FSItem isFile
         * @property {common.IBooleanValue|null} [isFolder] FSItem isFolder
         * @property {common.IBooleanValue|null} [isLink] FSItem isLink
         * @property {common.IBooleanValue|null} [isCollection] FSItem isCollection
         * @property {fs.FSItem.IItem|null} [item] FSItem item
         * @property {fs.FSItem.ILocation|null} [location] FSItem location
         */

        /**
         * Constructs a new FSItem.
         * @memberof fs
         * @classdesc Represents a FSItem.
         * @implements IFSItem
         * @constructor
         * @param {fs.IFSItem=} [properties] Properties to set
         */
        function FSItem(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FSItem isFile.
         * @member {common.IBooleanValue|null|undefined} isFile
         * @memberof fs.FSItem
         * @instance
         */
        FSItem.prototype.isFile = null;

        /**
         * FSItem isFolder.
         * @member {common.IBooleanValue|null|undefined} isFolder
         * @memberof fs.FSItem
         * @instance
         */
        FSItem.prototype.isFolder = null;

        /**
         * FSItem isLink.
         * @member {common.IBooleanValue|null|undefined} isLink
         * @memberof fs.FSItem
         * @instance
         */
        FSItem.prototype.isLink = null;

        /**
         * FSItem isCollection.
         * @member {common.IBooleanValue|null|undefined} isCollection
         * @memberof fs.FSItem
         * @instance
         */
        FSItem.prototype.isCollection = null;

        /**
         * FSItem item.
         * @member {fs.FSItem.IItem|null|undefined} item
         * @memberof fs.FSItem
         * @instance
         */
        FSItem.prototype.item = null;

        /**
         * FSItem location.
         * @member {fs.FSItem.ILocation|null|undefined} location
         * @memberof fs.FSItem
         * @instance
         */
        FSItem.prototype.location = null;

        /**
         * Creates a new FSItem instance using the specified properties.
         * @function create
         * @memberof fs.FSItem
         * @static
         * @param {fs.IFSItem=} [properties] Properties to set
         * @returns {fs.FSItem} FSItem instance
         */
        FSItem.create = function create(properties) {
            return new FSItem(properties);
        };

        /**
         * Encodes the specified FSItem message. Does not implicitly {@link fs.FSItem.verify|verify} messages.
         * @function encode
         * @memberof fs.FSItem
         * @static
         * @param {fs.IFSItem} message FSItem message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSItem.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                $root.common.BooleanValue.encode(message.isFile, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                $root.common.BooleanValue.encode(message.isFolder, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink"))
                $root.common.BooleanValue.encode(message.isLink, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.isCollection != null && Object.hasOwnProperty.call(message, "isCollection"))
                $root.common.BooleanValue.encode(message.isCollection, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                $root.fs.FSItem.Item.encode(message.item, writer.uint32(/* id 5, wireType 2 =*/42).fork(), q + 1).ldelim();
            if (message.location != null && Object.hasOwnProperty.call(message, "location"))
                $root.fs.FSItem.Location.encode(message.location, writer.uint32(/* id 6, wireType 2 =*/50).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FSItem message, length delimited. Does not implicitly {@link fs.FSItem.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FSItem
         * @static
         * @param {fs.IFSItem} message FSItem message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSItem.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FSItem message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FSItem
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FSItem} FSItem
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSItem.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSItem();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.isFile = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.isFolder = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.isLink = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.isCollection = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 5: {
                        message.item = $root.fs.FSItem.Item.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 6: {
                        message.location = $root.fs.FSItem.Location.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FSItem message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FSItem
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FSItem} FSItem
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSItem.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FSItem message.
         * @function verify
         * @memberof fs.FSItem
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSItem.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile")) {
                var error = $root.common.BooleanValue.verify(message.isFile, long + 1);
                if (error)
                    return "isFile." + error;
            }
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder")) {
                var error = $root.common.BooleanValue.verify(message.isFolder, long + 1);
                if (error)
                    return "isFolder." + error;
            }
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink")) {
                var error = $root.common.BooleanValue.verify(message.isLink, long + 1);
                if (error)
                    return "isLink." + error;
            }
            if (message.isCollection != null && Object.hasOwnProperty.call(message, "isCollection")) {
                var error = $root.common.BooleanValue.verify(message.isCollection, long + 1);
                if (error)
                    return "isCollection." + error;
            }
            if (message.item != null && Object.hasOwnProperty.call(message, "item")) {
                var error = $root.fs.FSItem.Item.verify(message.item, long + 1);
                if (error)
                    return "item." + error;
            }
            if (message.location != null && Object.hasOwnProperty.call(message, "location")) {
                var error = $root.fs.FSItem.Location.verify(message.location, long + 1);
                if (error)
                    return "location." + error;
            }
            return null;
        };

        /**
         * Creates a FSItem message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSItem
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSItem} FSItem
         */
        FSItem.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FSItem)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FSItem: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FSItem();
            if (object.isFile != null) {
                if (!$util.isObject(object.isFile))
                    throw TypeError(".fs.FSItem.isFile: object expected");
                message.isFile = $root.common.BooleanValue.fromObject(object.isFile, long + 1);
            }
            if (object.isFolder != null) {
                if (!$util.isObject(object.isFolder))
                    throw TypeError(".fs.FSItem.isFolder: object expected");
                message.isFolder = $root.common.BooleanValue.fromObject(object.isFolder, long + 1);
            }
            if (object.isLink != null) {
                if (!$util.isObject(object.isLink))
                    throw TypeError(".fs.FSItem.isLink: object expected");
                message.isLink = $root.common.BooleanValue.fromObject(object.isLink, long + 1);
            }
            if (object.isCollection != null) {
                if (!$util.isObject(object.isCollection))
                    throw TypeError(".fs.FSItem.isCollection: object expected");
                message.isCollection = $root.common.BooleanValue.fromObject(object.isCollection, long + 1);
            }
            if (object.item != null) {
                if (!$util.isObject(object.item))
                    throw TypeError(".fs.FSItem.item: object expected");
                message.item = $root.fs.FSItem.Item.fromObject(object.item, long + 1);
            }
            if (object.location != null) {
                if (!$util.isObject(object.location))
                    throw TypeError(".fs.FSItem.location: object expected");
                message.location = $root.fs.FSItem.Location.fromObject(object.location, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a FSItem message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSItem
         * @static
         * @param {fs.FSItem} message FSItem
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSItem.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.isFile = null;
                object.isFolder = null;
                object.isLink = null;
                object.isCollection = null;
                object.item = null;
                object.location = null;
            }
            if (message.isFile != null && Object.hasOwnProperty.call(message, "isFile"))
                object.isFile = $root.common.BooleanValue.toObject(message.isFile, options, q + 1);
            if (message.isFolder != null && Object.hasOwnProperty.call(message, "isFolder"))
                object.isFolder = $root.common.BooleanValue.toObject(message.isFolder, options, q + 1);
            if (message.isLink != null && Object.hasOwnProperty.call(message, "isLink"))
                object.isLink = $root.common.BooleanValue.toObject(message.isLink, options, q + 1);
            if (message.isCollection != null && Object.hasOwnProperty.call(message, "isCollection"))
                object.isCollection = $root.common.BooleanValue.toObject(message.isCollection, options, q + 1);
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                object.item = $root.fs.FSItem.Item.toObject(message.item, options, q + 1);
            if (message.location != null && Object.hasOwnProperty.call(message, "location"))
                object.location = $root.fs.FSItem.Location.toObject(message.location, options, q + 1);
            return object;
        };

        /**
         * Converts this FSItem to JSON.
         * @function toJSON
         * @memberof fs.FSItem
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FSItem.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FSItem
         * @function getTypeUrl
         * @memberof fs.FSItem
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FSItem.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FSItem";
        };

        FSItem.Location = (function() {

            /**
             * Properties of a Location.
             * @memberof fs.FSItem
             * @interface ILocation
             * @property {fs.IFS|null} [fs] Location fs
             * @property {string|null} [path] Location path
             * @property {string|null} [storageUse] Location storageUse
             * @property {string|null} [storageType] Location storageType
             */

            /**
             * Constructs a new Location.
             * @memberof fs.FSItem
             * @classdesc Represents a Location.
             * @implements ILocation
             * @constructor
             * @param {fs.FSItem.ILocation=} [properties] Properties to set
             */
            function Location(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * Location fs.
             * @member {fs.IFS|null|undefined} fs
             * @memberof fs.FSItem.Location
             * @instance
             */
            Location.prototype.fs = null;

            /**
             * Location path.
             * @member {string} path
             * @memberof fs.FSItem.Location
             * @instance
             */
            Location.prototype.path = "";

            /**
             * Location storageUse.
             * @member {string} storageUse
             * @memberof fs.FSItem.Location
             * @instance
             */
            Location.prototype.storageUse = "";

            /**
             * Location storageType.
             * @member {string} storageType
             * @memberof fs.FSItem.Location
             * @instance
             */
            Location.prototype.storageType = "";

            /**
             * Creates a new Location instance using the specified properties.
             * @function create
             * @memberof fs.FSItem.Location
             * @static
             * @param {fs.FSItem.ILocation=} [properties] Properties to set
             * @returns {fs.FSItem.Location} Location instance
             */
            Location.create = function create(properties) {
                return new Location(properties);
            };

            /**
             * Encodes the specified Location message. Does not implicitly {@link fs.FSItem.Location.verify|verify} messages.
             * @function encode
             * @memberof fs.FSItem.Location
             * @static
             * @param {fs.FSItem.ILocation} message Location message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Location.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.fs != null && Object.hasOwnProperty.call(message, "fs"))
                    $root.fs.FS.encode(message.fs, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
                if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.path);
                if (message.storageUse != null && Object.hasOwnProperty.call(message, "storageUse"))
                    writer.uint32(/* id 3, wireType 2 =*/26).string(message.storageUse);
                if (message.storageType != null && Object.hasOwnProperty.call(message, "storageType"))
                    writer.uint32(/* id 4, wireType 2 =*/34).string(message.storageType);
                return writer;
            };

            /**
             * Encodes the specified Location message, length delimited. Does not implicitly {@link fs.FSItem.Location.verify|verify} messages.
             * @function encodeDelimited
             * @memberof fs.FSItem.Location
             * @static
             * @param {fs.FSItem.ILocation} message Location message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Location.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes a Location message from the specified reader or buffer.
             * @function decode
             * @memberof fs.FSItem.Location
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {fs.FSItem.Location} Location
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Location.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSItem.Location();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.fs = $root.fs.FS.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 2: {
                            message.path = reader.string();
                            break;
                        }
                    case 3: {
                            message.storageUse = reader.string();
                            break;
                        }
                    case 4: {
                            message.storageType = reader.string();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a Location message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof fs.FSItem.Location
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {fs.FSItem.Location} Location
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Location.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a Location message.
             * @function verify
             * @memberof fs.FSItem.Location
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            Location.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.fs != null && Object.hasOwnProperty.call(message, "fs")) {
                    var error = $root.fs.FS.verify(message.fs, long + 1);
                    if (error)
                        return "fs." + error;
                }
                if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                    if (!$util.isString(message.path))
                        return "path: string expected";
                if (message.storageUse != null && Object.hasOwnProperty.call(message, "storageUse"))
                    if (!$util.isString(message.storageUse))
                        return "storageUse: string expected";
                if (message.storageType != null && Object.hasOwnProperty.call(message, "storageType"))
                    if (!$util.isString(message.storageType))
                        return "storageType: string expected";
                return null;
            };

            /**
             * Creates a Location message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof fs.FSItem.Location
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {fs.FSItem.Location} Location
             */
            Location.fromObject = function fromObject(object, long) {
                if (object instanceof $root.fs.FSItem.Location)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".fs.FSItem.Location: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.fs.FSItem.Location();
                if (object.fs != null) {
                    if (!$util.isObject(object.fs))
                        throw TypeError(".fs.FSItem.Location.fs: object expected");
                    message.fs = $root.fs.FS.fromObject(object.fs, long + 1);
                }
                if (object.path != null)
                    message.path = String(object.path);
                if (object.storageUse != null)
                    message.storageUse = String(object.storageUse);
                if (object.storageType != null)
                    message.storageType = String(object.storageType);
                return message;
            };

            /**
             * Creates a plain object from a Location message. Also converts values to other types if specified.
             * @function toObject
             * @memberof fs.FSItem.Location
             * @static
             * @param {fs.FSItem.Location} message Location
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            Location.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults) {
                    object.fs = null;
                    object.path = "";
                    object.storageUse = "";
                    object.storageType = "";
                }
                if (message.fs != null && Object.hasOwnProperty.call(message, "fs"))
                    object.fs = $root.fs.FS.toObject(message.fs, options, q + 1);
                if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                    object.path = message.path;
                if (message.storageUse != null && Object.hasOwnProperty.call(message, "storageUse"))
                    object.storageUse = message.storageUse;
                if (message.storageType != null && Object.hasOwnProperty.call(message, "storageType"))
                    object.storageType = message.storageType;
                return object;
            };

            /**
             * Converts this Location to JSON.
             * @function toJSON
             * @memberof fs.FSItem.Location
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            Location.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for Location
             * @function getTypeUrl
             * @memberof fs.FSItem.Location
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            Location.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/fs.FSItem.Location";
            };

            return Location;
        })();

        FSItem.Item = (function() {

            /**
             * Properties of an Item.
             * @memberof fs.FSItem
             * @interface IItem
             * @property {fs.IFS|null} [fs] Item fs
             * @property {file.IFile|null} [file] Item file
             * @property {common.IObjectReference|null} [collection] Item collection
             */

            /**
             * Constructs a new Item.
             * @memberof fs.FSItem
             * @classdesc Represents an Item.
             * @implements IItem
             * @constructor
             * @param {fs.FSItem.IItem=} [properties] Properties to set
             */
            function Item(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * Item fs.
             * @member {fs.IFS|null|undefined} fs
             * @memberof fs.FSItem.Item
             * @instance
             */
            Item.prototype.fs = null;

            /**
             * Item file.
             * @member {file.IFile|null|undefined} file
             * @memberof fs.FSItem.Item
             * @instance
             */
            Item.prototype.file = null;

            /**
             * Item collection.
             * @member {common.IObjectReference|null|undefined} collection
             * @memberof fs.FSItem.Item
             * @instance
             */
            Item.prototype.collection = null;

            /**
             * Creates a new Item instance using the specified properties.
             * @function create
             * @memberof fs.FSItem.Item
             * @static
             * @param {fs.FSItem.IItem=} [properties] Properties to set
             * @returns {fs.FSItem.Item} Item instance
             */
            Item.create = function create(properties) {
                return new Item(properties);
            };

            /**
             * Encodes the specified Item message. Does not implicitly {@link fs.FSItem.Item.verify|verify} messages.
             * @function encode
             * @memberof fs.FSItem.Item
             * @static
             * @param {fs.FSItem.IItem} message Item message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Item.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.fs != null && Object.hasOwnProperty.call(message, "fs"))
                    $root.fs.FS.encode(message.fs, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
                if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                    $root.file.File.encode(message.file, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
                if (message.collection != null && Object.hasOwnProperty.call(message, "collection"))
                    $root.common.ObjectReference.encode(message.collection, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
                return writer;
            };

            /**
             * Encodes the specified Item message, length delimited. Does not implicitly {@link fs.FSItem.Item.verify|verify} messages.
             * @function encodeDelimited
             * @memberof fs.FSItem.Item
             * @static
             * @param {fs.FSItem.IItem} message Item message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Item.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes an Item message from the specified reader or buffer.
             * @function decode
             * @memberof fs.FSItem.Item
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {fs.FSItem.Item} Item
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Item.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSItem.Item();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.fs = $root.fs.FS.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 2: {
                            message.file = $root.file.File.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 3: {
                            message.collection = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes an Item message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof fs.FSItem.Item
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {fs.FSItem.Item} Item
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Item.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies an Item message.
             * @function verify
             * @memberof fs.FSItem.Item
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            Item.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.fs != null && Object.hasOwnProperty.call(message, "fs")) {
                    var error = $root.fs.FS.verify(message.fs, long + 1);
                    if (error)
                        return "fs." + error;
                }
                if (message.file != null && Object.hasOwnProperty.call(message, "file")) {
                    var error = $root.file.File.verify(message.file, long + 1);
                    if (error)
                        return "file." + error;
                }
                if (message.collection != null && Object.hasOwnProperty.call(message, "collection")) {
                    var error = $root.common.ObjectReference.verify(message.collection, long + 1);
                    if (error)
                        return "collection." + error;
                }
                return null;
            };

            /**
             * Creates an Item message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof fs.FSItem.Item
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {fs.FSItem.Item} Item
             */
            Item.fromObject = function fromObject(object, long) {
                if (object instanceof $root.fs.FSItem.Item)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".fs.FSItem.Item: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.fs.FSItem.Item();
                if (object.fs != null) {
                    if (!$util.isObject(object.fs))
                        throw TypeError(".fs.FSItem.Item.fs: object expected");
                    message.fs = $root.fs.FS.fromObject(object.fs, long + 1);
                }
                if (object.file != null) {
                    if (!$util.isObject(object.file))
                        throw TypeError(".fs.FSItem.Item.file: object expected");
                    message.file = $root.file.File.fromObject(object.file, long + 1);
                }
                if (object.collection != null) {
                    if (!$util.isObject(object.collection))
                        throw TypeError(".fs.FSItem.Item.collection: object expected");
                    message.collection = $root.common.ObjectReference.fromObject(object.collection, long + 1);
                }
                return message;
            };

            /**
             * Creates a plain object from an Item message. Also converts values to other types if specified.
             * @function toObject
             * @memberof fs.FSItem.Item
             * @static
             * @param {fs.FSItem.Item} message Item
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            Item.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults) {
                    object.fs = null;
                    object.file = null;
                    object.collection = null;
                }
                if (message.fs != null && Object.hasOwnProperty.call(message, "fs"))
                    object.fs = $root.fs.FS.toObject(message.fs, options, q + 1);
                if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                    object.file = $root.file.File.toObject(message.file, options, q + 1);
                if (message.collection != null && Object.hasOwnProperty.call(message, "collection"))
                    object.collection = $root.common.ObjectReference.toObject(message.collection, options, q + 1);
                return object;
            };

            /**
             * Converts this Item to JSON.
             * @function toJSON
             * @memberof fs.FSItem.Item
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            Item.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for Item
             * @function getTypeUrl
             * @memberof fs.FSItem.Item
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            Item.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/fs.FSItem.Item";
            };

            return Item;
        })();

        return FSItem;
    })();

    fs.FSCGetAllReplyBody = (function() {

        /**
         * Properties of a FSCGetAllReplyBody.
         * @memberof fs
         * @interface IFSCGetAllReplyBody
         * @property {Array.<fs.INameAndItem>|null} [items] FSCGetAllReplyBody items
         */

        /**
         * Constructs a new FSCGetAllReplyBody.
         * @memberof fs
         * @classdesc Represents a FSCGetAllReplyBody.
         * @implements IFSCGetAllReplyBody
         * @constructor
         * @param {fs.IFSCGetAllReplyBody=} [properties] Properties to set
         */
        function FSCGetAllReplyBody(properties) {
            this.items = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FSCGetAllReplyBody items.
         * @member {Array.<fs.INameAndItem>} items
         * @memberof fs.FSCGetAllReplyBody
         * @instance
         */
        FSCGetAllReplyBody.prototype.items = $util.emptyArray;

        /**
         * Creates a new FSCGetAllReplyBody instance using the specified properties.
         * @function create
         * @memberof fs.FSCGetAllReplyBody
         * @static
         * @param {fs.IFSCGetAllReplyBody=} [properties] Properties to set
         * @returns {fs.FSCGetAllReplyBody} FSCGetAllReplyBody instance
         */
        FSCGetAllReplyBody.create = function create(properties) {
            return new FSCGetAllReplyBody(properties);
        };

        /**
         * Encodes the specified FSCGetAllReplyBody message. Does not implicitly {@link fs.FSCGetAllReplyBody.verify|verify} messages.
         * @function encode
         * @memberof fs.FSCGetAllReplyBody
         * @static
         * @param {fs.IFSCGetAllReplyBody} message FSCGetAllReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSCGetAllReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.items != null && message.items.length)
                for (var i = 0; i < message.items.length; ++i)
                    $root.fs.NameAndItem.encode(message.items[i], writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FSCGetAllReplyBody message, length delimited. Does not implicitly {@link fs.FSCGetAllReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FSCGetAllReplyBody
         * @static
         * @param {fs.IFSCGetAllReplyBody} message FSCGetAllReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSCGetAllReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FSCGetAllReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FSCGetAllReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FSCGetAllReplyBody} FSCGetAllReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSCGetAllReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSCGetAllReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.items && message.items.length))
                            message.items = [];
                        message.items.push($root.fs.NameAndItem.decode(reader, reader.uint32(), undefined, long + 1));
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FSCGetAllReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FSCGetAllReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FSCGetAllReplyBody} FSCGetAllReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSCGetAllReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FSCGetAllReplyBody message.
         * @function verify
         * @memberof fs.FSCGetAllReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSCGetAllReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.items != null && Object.hasOwnProperty.call(message, "items")) {
                if (!Array.isArray(message.items))
                    return "items: array expected";
                for (var i = 0; i < message.items.length; ++i) {
                    var error = $root.fs.NameAndItem.verify(message.items[i], long + 1);
                    if (error)
                        return "items." + error;
                }
            }
            return null;
        };

        /**
         * Creates a FSCGetAllReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSCGetAllReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSCGetAllReplyBody} FSCGetAllReplyBody
         */
        FSCGetAllReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FSCGetAllReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FSCGetAllReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FSCGetAllReplyBody();
            if (object.items) {
                if (!Array.isArray(object.items))
                    throw TypeError(".fs.FSCGetAllReplyBody.items: array expected");
                message.items = [];
                for (var i = 0; i < object.items.length; ++i) {
                    if (!$util.isObject(object.items[i]))
                        throw TypeError(".fs.FSCGetAllReplyBody.items: object expected");
                    message.items[i] = $root.fs.NameAndItem.fromObject(object.items[i], long + 1);
                }
            }
            return message;
        };

        /**
         * Creates a plain object from a FSCGetAllReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSCGetAllReplyBody
         * @static
         * @param {fs.FSCGetAllReplyBody} message FSCGetAllReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSCGetAllReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.items = [];
            if (message.items && message.items.length) {
                object.items = [];
                for (var j = 0; j < message.items.length; ++j)
                    object.items[j] = $root.fs.NameAndItem.toObject(message.items[j], options, q + 1);
            }
            return object;
        };

        /**
         * Converts this FSCGetAllReplyBody to JSON.
         * @function toJSON
         * @memberof fs.FSCGetAllReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FSCGetAllReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FSCGetAllReplyBody
         * @function getTypeUrl
         * @memberof fs.FSCGetAllReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FSCGetAllReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FSCGetAllReplyBody";
        };

        return FSCGetAllReplyBody;
    })();

    fs.NameAndItem = (function() {

        /**
         * Properties of a NameAndItem.
         * @memberof fs
         * @interface INameAndItem
         * @property {string|null} [name] NameAndItem name
         * @property {fs.IFSItem|null} [item] NameAndItem item
         */

        /**
         * Constructs a new NameAndItem.
         * @memberof fs
         * @classdesc Represents a NameAndItem.
         * @implements INameAndItem
         * @constructor
         * @param {fs.INameAndItem=} [properties] Properties to set
         */
        function NameAndItem(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * NameAndItem name.
         * @member {string} name
         * @memberof fs.NameAndItem
         * @instance
         */
        NameAndItem.prototype.name = "";

        /**
         * NameAndItem item.
         * @member {fs.IFSItem|null|undefined} item
         * @memberof fs.NameAndItem
         * @instance
         */
        NameAndItem.prototype.item = null;

        /**
         * Creates a new NameAndItem instance using the specified properties.
         * @function create
         * @memberof fs.NameAndItem
         * @static
         * @param {fs.INameAndItem=} [properties] Properties to set
         * @returns {fs.NameAndItem} NameAndItem instance
         */
        NameAndItem.create = function create(properties) {
            return new NameAndItem(properties);
        };

        /**
         * Encodes the specified NameAndItem message. Does not implicitly {@link fs.NameAndItem.verify|verify} messages.
         * @function encode
         * @memberof fs.NameAndItem
         * @static
         * @param {fs.INameAndItem} message NameAndItem message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        NameAndItem.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                $root.fs.FSItem.encode(message.item, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified NameAndItem message, length delimited. Does not implicitly {@link fs.NameAndItem.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.NameAndItem
         * @static
         * @param {fs.INameAndItem} message NameAndItem message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        NameAndItem.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a NameAndItem message from the specified reader or buffer.
         * @function decode
         * @memberof fs.NameAndItem
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.NameAndItem} NameAndItem
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        NameAndItem.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.NameAndItem();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.name = reader.string();
                        break;
                    }
                case 2: {
                        message.item = $root.fs.FSItem.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a NameAndItem message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.NameAndItem
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.NameAndItem} NameAndItem
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        NameAndItem.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a NameAndItem message.
         * @function verify
         * @memberof fs.NameAndItem
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        NameAndItem.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                if (!$util.isString(message.name))
                    return "name: string expected";
            if (message.item != null && Object.hasOwnProperty.call(message, "item")) {
                var error = $root.fs.FSItem.verify(message.item, long + 1);
                if (error)
                    return "item." + error;
            }
            return null;
        };

        /**
         * Creates a NameAndItem message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.NameAndItem
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.NameAndItem} NameAndItem
         */
        NameAndItem.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.NameAndItem)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.NameAndItem: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.NameAndItem();
            if (object.name != null)
                message.name = String(object.name);
            if (object.item != null) {
                if (!$util.isObject(object.item))
                    throw TypeError(".fs.NameAndItem.item: object expected");
                message.item = $root.fs.FSItem.fromObject(object.item, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a NameAndItem message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.NameAndItem
         * @static
         * @param {fs.NameAndItem} message NameAndItem
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        NameAndItem.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.name = "";
                object.item = null;
            }
            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
                object.name = message.name;
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                object.item = $root.fs.FSItem.toObject(message.item, options, q + 1);
            return object;
        };

        /**
         * Converts this NameAndItem to JSON.
         * @function toJSON
         * @memberof fs.NameAndItem
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        NameAndItem.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for NameAndItem
         * @function getTypeUrl
         * @memberof fs.NameAndItem
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        NameAndItem.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.NameAndItem";
        };

        return NameAndItem;
    })();

    fs.IterResMsg = (function() {

        /**
         * Properties of an IterResMsg.
         * @memberof fs
         * @interface IIterResMsg
         * @property {common.IBooleanValue|null} [done] IterResMsg done
         * @property {fs.INameAndItem|null} [value] IterResMsg value
         */

        /**
         * Constructs a new IterResMsg.
         * @memberof fs
         * @classdesc Represents an IterResMsg.
         * @implements IIterResMsg
         * @constructor
         * @param {fs.IIterResMsg=} [properties] Properties to set
         */
        function IterResMsg(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * IterResMsg done.
         * @member {common.IBooleanValue|null|undefined} done
         * @memberof fs.IterResMsg
         * @instance
         */
        IterResMsg.prototype.done = null;

        /**
         * IterResMsg value.
         * @member {fs.INameAndItem|null|undefined} value
         * @memberof fs.IterResMsg
         * @instance
         */
        IterResMsg.prototype.value = null;

        /**
         * Creates a new IterResMsg instance using the specified properties.
         * @function create
         * @memberof fs.IterResMsg
         * @static
         * @param {fs.IIterResMsg=} [properties] Properties to set
         * @returns {fs.IterResMsg} IterResMsg instance
         */
        IterResMsg.create = function create(properties) {
            return new IterResMsg(properties);
        };

        /**
         * Encodes the specified IterResMsg message. Does not implicitly {@link fs.IterResMsg.verify|verify} messages.
         * @function encode
         * @memberof fs.IterResMsg
         * @static
         * @param {fs.IIterResMsg} message IterResMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        IterResMsg.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.done != null && Object.hasOwnProperty.call(message, "done"))
                $root.common.BooleanValue.encode(message.done, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                $root.fs.NameAndItem.encode(message.value, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified IterResMsg message, length delimited. Does not implicitly {@link fs.IterResMsg.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.IterResMsg
         * @static
         * @param {fs.IIterResMsg} message IterResMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        IterResMsg.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an IterResMsg message from the specified reader or buffer.
         * @function decode
         * @memberof fs.IterResMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.IterResMsg} IterResMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        IterResMsg.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.IterResMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.done = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.value = $root.fs.NameAndItem.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an IterResMsg message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.IterResMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.IterResMsg} IterResMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        IterResMsg.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an IterResMsg message.
         * @function verify
         * @memberof fs.IterResMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        IterResMsg.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.done != null && Object.hasOwnProperty.call(message, "done")) {
                var error = $root.common.BooleanValue.verify(message.done, long + 1);
                if (error)
                    return "done." + error;
            }
            if (message.value != null && Object.hasOwnProperty.call(message, "value")) {
                var error = $root.fs.NameAndItem.verify(message.value, long + 1);
                if (error)
                    return "value." + error;
            }
            return null;
        };

        /**
         * Creates an IterResMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.IterResMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.IterResMsg} IterResMsg
         */
        IterResMsg.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.IterResMsg)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.IterResMsg: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.IterResMsg();
            if (object.done != null) {
                if (!$util.isObject(object.done))
                    throw TypeError(".fs.IterResMsg.done: object expected");
                message.done = $root.common.BooleanValue.fromObject(object.done, long + 1);
            }
            if (object.value != null) {
                if (!$util.isObject(object.value))
                    throw TypeError(".fs.IterResMsg.value: object expected");
                message.value = $root.fs.NameAndItem.fromObject(object.value, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an IterResMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.IterResMsg
         * @static
         * @param {fs.IterResMsg} message IterResMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        IterResMsg.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.done = null;
                object.value = null;
            }
            if (message.done != null && Object.hasOwnProperty.call(message, "done"))
                object.done = $root.common.BooleanValue.toObject(message.done, options, q + 1);
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = $root.fs.NameAndItem.toObject(message.value, options, q + 1);
            return object;
        };

        /**
         * Converts this IterResMsg to JSON.
         * @function toJSON
         * @memberof fs.IterResMsg
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        IterResMsg.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for IterResMsg
         * @function getTypeUrl
         * @memberof fs.IterResMsg
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        IterResMsg.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.IterResMsg";
        };

        return IterResMsg;
    })();

    fs.CollectionEvent = (function() {

        /**
         * Properties of a CollectionEvent.
         * @memberof fs
         * @interface ICollectionEvent
         * @property {string|null} [type] CollectionEvent type
         * @property {common.IStringValue|null} [path] CollectionEvent path
         * @property {fs.IFSItem|null} [item] CollectionEvent item
         */

        /**
         * Constructs a new CollectionEvent.
         * @memberof fs
         * @classdesc Represents a CollectionEvent.
         * @implements ICollectionEvent
         * @constructor
         * @param {fs.ICollectionEvent=} [properties] Properties to set
         */
        function CollectionEvent(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * CollectionEvent type.
         * @member {string} type
         * @memberof fs.CollectionEvent
         * @instance
         */
        CollectionEvent.prototype.type = "";

        /**
         * CollectionEvent path.
         * @member {common.IStringValue|null|undefined} path
         * @memberof fs.CollectionEvent
         * @instance
         */
        CollectionEvent.prototype.path = null;

        /**
         * CollectionEvent item.
         * @member {fs.IFSItem|null|undefined} item
         * @memberof fs.CollectionEvent
         * @instance
         */
        CollectionEvent.prototype.item = null;

        /**
         * Creates a new CollectionEvent instance using the specified properties.
         * @function create
         * @memberof fs.CollectionEvent
         * @static
         * @param {fs.ICollectionEvent=} [properties] Properties to set
         * @returns {fs.CollectionEvent} CollectionEvent instance
         */
        CollectionEvent.create = function create(properties) {
            return new CollectionEvent(properties);
        };

        /**
         * Encodes the specified CollectionEvent message. Does not implicitly {@link fs.CollectionEvent.verify|verify} messages.
         * @function encode
         * @memberof fs.CollectionEvent
         * @static
         * @param {fs.ICollectionEvent} message CollectionEvent message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CollectionEvent.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.type);
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                $root.common.StringValue.encode(message.path, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                $root.fs.FSItem.encode(message.item, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified CollectionEvent message, length delimited. Does not implicitly {@link fs.CollectionEvent.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.CollectionEvent
         * @static
         * @param {fs.ICollectionEvent} message CollectionEvent message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CollectionEvent.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a CollectionEvent message from the specified reader or buffer.
         * @function decode
         * @memberof fs.CollectionEvent
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.CollectionEvent} CollectionEvent
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CollectionEvent.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.CollectionEvent();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.type = reader.string();
                        break;
                    }
                case 2: {
                        message.path = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.item = $root.fs.FSItem.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a CollectionEvent message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.CollectionEvent
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.CollectionEvent} CollectionEvent
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CollectionEvent.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a CollectionEvent message.
         * @function verify
         * @memberof fs.CollectionEvent
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        CollectionEvent.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.path != null && Object.hasOwnProperty.call(message, "path")) {
                var error = $root.common.StringValue.verify(message.path, long + 1);
                if (error)
                    return "path." + error;
            }
            if (message.item != null && Object.hasOwnProperty.call(message, "item")) {
                var error = $root.fs.FSItem.verify(message.item, long + 1);
                if (error)
                    return "item." + error;
            }
            return null;
        };

        /**
         * Creates a CollectionEvent message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.CollectionEvent
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.CollectionEvent} CollectionEvent
         */
        CollectionEvent.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.CollectionEvent)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.CollectionEvent: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.CollectionEvent();
            if (object.type != null)
                message.type = String(object.type);
            if (object.path != null) {
                if (!$util.isObject(object.path))
                    throw TypeError(".fs.CollectionEvent.path: object expected");
                message.path = $root.common.StringValue.fromObject(object.path, long + 1);
            }
            if (object.item != null) {
                if (!$util.isObject(object.item))
                    throw TypeError(".fs.CollectionEvent.item: object expected");
                message.item = $root.fs.FSItem.fromObject(object.item, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a CollectionEvent message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.CollectionEvent
         * @static
         * @param {fs.CollectionEvent} message CollectionEvent
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        CollectionEvent.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.path = null;
                object.item = null;
            }
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                object.type = message.type;
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = $root.common.StringValue.toObject(message.path, options, q + 1);
            if (message.item != null && Object.hasOwnProperty.call(message, "item"))
                object.item = $root.fs.FSItem.toObject(message.item, options, q + 1);
            return object;
        };

        /**
         * Converts this CollectionEvent to JSON.
         * @function toJSON
         * @memberof fs.CollectionEvent
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        CollectionEvent.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for CollectionEvent
         * @function getTypeUrl
         * @memberof fs.CollectionEvent
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        CollectionEvent.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.CollectionEvent";
        };

        return CollectionEvent;
    })();

    fs.VersionedGetXAttrRequestBody = (function() {

        /**
         * Properties of a VersionedGetXAttrRequestBody.
         * @memberof fs
         * @interface IVersionedGetXAttrRequestBody
         * @property {string|null} [path] VersionedGetXAttrRequestBody path
         * @property {string|null} [xaName] VersionedGetXAttrRequestBody xaName
         * @property {file.IVersionedReadFlags|null} [flags] VersionedGetXAttrRequestBody flags
         */

        /**
         * Constructs a new VersionedGetXAttrRequestBody.
         * @memberof fs
         * @classdesc Represents a VersionedGetXAttrRequestBody.
         * @implements IVersionedGetXAttrRequestBody
         * @constructor
         * @param {fs.IVersionedGetXAttrRequestBody=} [properties] Properties to set
         */
        function VersionedGetXAttrRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedGetXAttrRequestBody path.
         * @member {string} path
         * @memberof fs.VersionedGetXAttrRequestBody
         * @instance
         */
        VersionedGetXAttrRequestBody.prototype.path = "";

        /**
         * VersionedGetXAttrRequestBody xaName.
         * @member {string} xaName
         * @memberof fs.VersionedGetXAttrRequestBody
         * @instance
         */
        VersionedGetXAttrRequestBody.prototype.xaName = "";

        /**
         * VersionedGetXAttrRequestBody flags.
         * @member {file.IVersionedReadFlags|null|undefined} flags
         * @memberof fs.VersionedGetXAttrRequestBody
         * @instance
         */
        VersionedGetXAttrRequestBody.prototype.flags = null;

        /**
         * Creates a new VersionedGetXAttrRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.VersionedGetXAttrRequestBody
         * @static
         * @param {fs.IVersionedGetXAttrRequestBody=} [properties] Properties to set
         * @returns {fs.VersionedGetXAttrRequestBody} VersionedGetXAttrRequestBody instance
         */
        VersionedGetXAttrRequestBody.create = function create(properties) {
            return new VersionedGetXAttrRequestBody(properties);
        };

        /**
         * Encodes the specified VersionedGetXAttrRequestBody message. Does not implicitly {@link fs.VersionedGetXAttrRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.VersionedGetXAttrRequestBody
         * @static
         * @param {fs.IVersionedGetXAttrRequestBody} message VersionedGetXAttrRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetXAttrRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.xaName);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 10, wireType 2 =*/82).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedGetXAttrRequestBody message, length delimited. Does not implicitly {@link fs.VersionedGetXAttrRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.VersionedGetXAttrRequestBody
         * @static
         * @param {fs.IVersionedGetXAttrRequestBody} message VersionedGetXAttrRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetXAttrRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedGetXAttrRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.VersionedGetXAttrRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.VersionedGetXAttrRequestBody} VersionedGetXAttrRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetXAttrRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedGetXAttrRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.xaName = reader.string();
                        break;
                    }
                case 10: {
                        message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedGetXAttrRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.VersionedGetXAttrRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.VersionedGetXAttrRequestBody} VersionedGetXAttrRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetXAttrRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedGetXAttrRequestBody message.
         * @function verify
         * @memberof fs.VersionedGetXAttrRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedGetXAttrRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                if (!$util.isString(message.xaName))
                    return "xaName: string expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedGetXAttrRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.VersionedGetXAttrRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.VersionedGetXAttrRequestBody} VersionedGetXAttrRequestBody
         */
        VersionedGetXAttrRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.VersionedGetXAttrRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.VersionedGetXAttrRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.VersionedGetXAttrRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.xaName != null)
                message.xaName = String(object.xaName);
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.VersionedGetXAttrRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedGetXAttrRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.VersionedGetXAttrRequestBody
         * @static
         * @param {fs.VersionedGetXAttrRequestBody} message VersionedGetXAttrRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedGetXAttrRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.xaName = "";
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.xaName != null && Object.hasOwnProperty.call(message, "xaName"))
                object.xaName = message.xaName;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedGetXAttrRequestBody to JSON.
         * @function toJSON
         * @memberof fs.VersionedGetXAttrRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedGetXAttrRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedGetXAttrRequestBody
         * @function getTypeUrl
         * @memberof fs.VersionedGetXAttrRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedGetXAttrRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.VersionedGetXAttrRequestBody";
        };

        return VersionedGetXAttrRequestBody;
    })();

    fs.PathAndFlagsRequestBody = (function() {

        /**
         * Properties of a PathAndFlagsRequestBody.
         * @memberof fs
         * @interface IPathAndFlagsRequestBody
         * @property {string|null} [path] PathAndFlagsRequestBody path
         * @property {file.IVersionedReadFlags|null} [flags] PathAndFlagsRequestBody flags
         */

        /**
         * Constructs a new PathAndFlagsRequestBody.
         * @memberof fs
         * @classdesc Represents a PathAndFlagsRequestBody.
         * @implements IPathAndFlagsRequestBody
         * @constructor
         * @param {fs.IPathAndFlagsRequestBody=} [properties] Properties to set
         */
        function PathAndFlagsRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * PathAndFlagsRequestBody path.
         * @member {string} path
         * @memberof fs.PathAndFlagsRequestBody
         * @instance
         */
        PathAndFlagsRequestBody.prototype.path = "";

        /**
         * PathAndFlagsRequestBody flags.
         * @member {file.IVersionedReadFlags|null|undefined} flags
         * @memberof fs.PathAndFlagsRequestBody
         * @instance
         */
        PathAndFlagsRequestBody.prototype.flags = null;

        /**
         * Creates a new PathAndFlagsRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.PathAndFlagsRequestBody
         * @static
         * @param {fs.IPathAndFlagsRequestBody=} [properties] Properties to set
         * @returns {fs.PathAndFlagsRequestBody} PathAndFlagsRequestBody instance
         */
        PathAndFlagsRequestBody.create = function create(properties) {
            return new PathAndFlagsRequestBody(properties);
        };

        /**
         * Encodes the specified PathAndFlagsRequestBody message. Does not implicitly {@link fs.PathAndFlagsRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.PathAndFlagsRequestBody
         * @static
         * @param {fs.IPathAndFlagsRequestBody} message PathAndFlagsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        PathAndFlagsRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified PathAndFlagsRequestBody message, length delimited. Does not implicitly {@link fs.PathAndFlagsRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.PathAndFlagsRequestBody
         * @static
         * @param {fs.IPathAndFlagsRequestBody} message PathAndFlagsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        PathAndFlagsRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a PathAndFlagsRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.PathAndFlagsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.PathAndFlagsRequestBody} PathAndFlagsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        PathAndFlagsRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.PathAndFlagsRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a PathAndFlagsRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.PathAndFlagsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.PathAndFlagsRequestBody} PathAndFlagsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        PathAndFlagsRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a PathAndFlagsRequestBody message.
         * @function verify
         * @memberof fs.PathAndFlagsRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        PathAndFlagsRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a PathAndFlagsRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.PathAndFlagsRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.PathAndFlagsRequestBody} PathAndFlagsRequestBody
         */
        PathAndFlagsRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.PathAndFlagsRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.PathAndFlagsRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.PathAndFlagsRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.PathAndFlagsRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a PathAndFlagsRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.PathAndFlagsRequestBody
         * @static
         * @param {fs.PathAndFlagsRequestBody} message PathAndFlagsRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        PathAndFlagsRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this PathAndFlagsRequestBody to JSON.
         * @function toJSON
         * @memberof fs.PathAndFlagsRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        PathAndFlagsRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for PathAndFlagsRequestBody
         * @function getTypeUrl
         * @memberof fs.PathAndFlagsRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        PathAndFlagsRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.PathAndFlagsRequestBody";
        };

        return PathAndFlagsRequestBody;
    })();

    fs.VersionedListFolderReplyBody = (function() {

        /**
         * Properties of a VersionedListFolderReplyBody.
         * @memberof fs
         * @interface IVersionedListFolderReplyBody
         * @property {number|Long|null} [version] VersionedListFolderReplyBody version
         * @property {Array.<fs.IListingEntryMsg>|null} [entries] VersionedListFolderReplyBody entries
         */

        /**
         * Constructs a new VersionedListFolderReplyBody.
         * @memberof fs
         * @classdesc Represents a VersionedListFolderReplyBody.
         * @implements IVersionedListFolderReplyBody
         * @constructor
         * @param {fs.IVersionedListFolderReplyBody=} [properties] Properties to set
         */
        function VersionedListFolderReplyBody(properties) {
            this.entries = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedListFolderReplyBody version.
         * @member {number|Long} version
         * @memberof fs.VersionedListFolderReplyBody
         * @instance
         */
        VersionedListFolderReplyBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * VersionedListFolderReplyBody entries.
         * @member {Array.<fs.IListingEntryMsg>} entries
         * @memberof fs.VersionedListFolderReplyBody
         * @instance
         */
        VersionedListFolderReplyBody.prototype.entries = $util.emptyArray;

        /**
         * Creates a new VersionedListFolderReplyBody instance using the specified properties.
         * @function create
         * @memberof fs.VersionedListFolderReplyBody
         * @static
         * @param {fs.IVersionedListFolderReplyBody=} [properties] Properties to set
         * @returns {fs.VersionedListFolderReplyBody} VersionedListFolderReplyBody instance
         */
        VersionedListFolderReplyBody.create = function create(properties) {
            return new VersionedListFolderReplyBody(properties);
        };

        /**
         * Encodes the specified VersionedListFolderReplyBody message. Does not implicitly {@link fs.VersionedListFolderReplyBody.verify|verify} messages.
         * @function encode
         * @memberof fs.VersionedListFolderReplyBody
         * @static
         * @param {fs.IVersionedListFolderReplyBody} message VersionedListFolderReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedListFolderReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version);
            if (message.entries != null && message.entries.length)
                for (var i = 0; i < message.entries.length; ++i)
                    $root.fs.ListingEntryMsg.encode(message.entries[i], writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedListFolderReplyBody message, length delimited. Does not implicitly {@link fs.VersionedListFolderReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.VersionedListFolderReplyBody
         * @static
         * @param {fs.IVersionedListFolderReplyBody} message VersionedListFolderReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedListFolderReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedListFolderReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.VersionedListFolderReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.VersionedListFolderReplyBody} VersionedListFolderReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedListFolderReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedListFolderReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.version = reader.uint64();
                        break;
                    }
                case 2: {
                        if (!(message.entries && message.entries.length))
                            message.entries = [];
                        message.entries.push($root.fs.ListingEntryMsg.decode(reader, reader.uint32(), undefined, long + 1));
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedListFolderReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.VersionedListFolderReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.VersionedListFolderReplyBody} VersionedListFolderReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedListFolderReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedListFolderReplyBody message.
         * @function verify
         * @memberof fs.VersionedListFolderReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedListFolderReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            if (message.entries != null && Object.hasOwnProperty.call(message, "entries")) {
                if (!Array.isArray(message.entries))
                    return "entries: array expected";
                for (var i = 0; i < message.entries.length; ++i) {
                    var error = $root.fs.ListingEntryMsg.verify(message.entries[i], long + 1);
                    if (error)
                        return "entries." + error;
                }
            }
            return null;
        };

        /**
         * Creates a VersionedListFolderReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.VersionedListFolderReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.VersionedListFolderReplyBody} VersionedListFolderReplyBody
         */
        VersionedListFolderReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.VersionedListFolderReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.VersionedListFolderReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.VersionedListFolderReplyBody();
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            if (object.entries) {
                if (!Array.isArray(object.entries))
                    throw TypeError(".fs.VersionedListFolderReplyBody.entries: array expected");
                message.entries = [];
                for (var i = 0; i < object.entries.length; ++i) {
                    if (!$util.isObject(object.entries[i]))
                        throw TypeError(".fs.VersionedListFolderReplyBody.entries: object expected");
                    message.entries[i] = $root.fs.ListingEntryMsg.fromObject(object.entries[i], long + 1);
                }
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedListFolderReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.VersionedListFolderReplyBody
         * @static
         * @param {fs.VersionedListFolderReplyBody} message VersionedListFolderReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedListFolderReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.entries = [];
            if (options.defaults)
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            if (message.entries && message.entries.length) {
                object.entries = [];
                for (var j = 0; j < message.entries.length; ++j)
                    object.entries[j] = $root.fs.ListingEntryMsg.toObject(message.entries[j], options, q + 1);
            }
            return object;
        };

        /**
         * Converts this VersionedListFolderReplyBody to JSON.
         * @function toJSON
         * @memberof fs.VersionedListFolderReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedListFolderReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedListFolderReplyBody
         * @function getTypeUrl
         * @memberof fs.VersionedListFolderReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedListFolderReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.VersionedListFolderReplyBody";
        };

        return VersionedListFolderReplyBody;
    })();

    fs.VersionedReadBytesRequestBody = (function() {

        /**
         * Properties of a VersionedReadBytesRequestBody.
         * @memberof fs
         * @interface IVersionedReadBytesRequestBody
         * @property {string|null} [path] VersionedReadBytesRequestBody path
         * @property {common.IUInt64Value|null} [start] VersionedReadBytesRequestBody start
         * @property {common.IUInt64Value|null} [end] VersionedReadBytesRequestBody end
         * @property {file.IVersionedReadFlags|null} [flags] VersionedReadBytesRequestBody flags
         */

        /**
         * Constructs a new VersionedReadBytesRequestBody.
         * @memberof fs
         * @classdesc Represents a VersionedReadBytesRequestBody.
         * @implements IVersionedReadBytesRequestBody
         * @constructor
         * @param {fs.IVersionedReadBytesRequestBody=} [properties] Properties to set
         */
        function VersionedReadBytesRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedReadBytesRequestBody path.
         * @member {string} path
         * @memberof fs.VersionedReadBytesRequestBody
         * @instance
         */
        VersionedReadBytesRequestBody.prototype.path = "";

        /**
         * VersionedReadBytesRequestBody start.
         * @member {common.IUInt64Value|null|undefined} start
         * @memberof fs.VersionedReadBytesRequestBody
         * @instance
         */
        VersionedReadBytesRequestBody.prototype.start = null;

        /**
         * VersionedReadBytesRequestBody end.
         * @member {common.IUInt64Value|null|undefined} end
         * @memberof fs.VersionedReadBytesRequestBody
         * @instance
         */
        VersionedReadBytesRequestBody.prototype.end = null;

        /**
         * VersionedReadBytesRequestBody flags.
         * @member {file.IVersionedReadFlags|null|undefined} flags
         * @memberof fs.VersionedReadBytesRequestBody
         * @instance
         */
        VersionedReadBytesRequestBody.prototype.flags = null;

        /**
         * Creates a new VersionedReadBytesRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.VersionedReadBytesRequestBody
         * @static
         * @param {fs.IVersionedReadBytesRequestBody=} [properties] Properties to set
         * @returns {fs.VersionedReadBytesRequestBody} VersionedReadBytesRequestBody instance
         */
        VersionedReadBytesRequestBody.create = function create(properties) {
            return new VersionedReadBytesRequestBody(properties);
        };

        /**
         * Encodes the specified VersionedReadBytesRequestBody message. Does not implicitly {@link fs.VersionedReadBytesRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.VersionedReadBytesRequestBody
         * @static
         * @param {fs.IVersionedReadBytesRequestBody} message VersionedReadBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadBytesRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                $root.common.UInt64Value.encode(message.start, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                $root.common.UInt64Value.encode(message.end, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.file.VersionedReadFlags.encode(message.flags, writer.uint32(/* id 10, wireType 2 =*/82).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedReadBytesRequestBody message, length delimited. Does not implicitly {@link fs.VersionedReadBytesRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.VersionedReadBytesRequestBody
         * @static
         * @param {fs.IVersionedReadBytesRequestBody} message VersionedReadBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedReadBytesRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedReadBytesRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.VersionedReadBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.VersionedReadBytesRequestBody} VersionedReadBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadBytesRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedReadBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.start = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.end = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 10: {
                        message.flags = $root.file.VersionedReadFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedReadBytesRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.VersionedReadBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.VersionedReadBytesRequestBody} VersionedReadBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedReadBytesRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedReadBytesRequestBody message.
         * @function verify
         * @memberof fs.VersionedReadBytesRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedReadBytesRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.start != null && Object.hasOwnProperty.call(message, "start")) {
                var error = $root.common.UInt64Value.verify(message.start, long + 1);
                if (error)
                    return "start." + error;
            }
            if (message.end != null && Object.hasOwnProperty.call(message, "end")) {
                var error = $root.common.UInt64Value.verify(message.end, long + 1);
                if (error)
                    return "end." + error;
            }
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.file.VersionedReadFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedReadBytesRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.VersionedReadBytesRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.VersionedReadBytesRequestBody} VersionedReadBytesRequestBody
         */
        VersionedReadBytesRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.VersionedReadBytesRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.VersionedReadBytesRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.VersionedReadBytesRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.start != null) {
                if (!$util.isObject(object.start))
                    throw TypeError(".fs.VersionedReadBytesRequestBody.start: object expected");
                message.start = $root.common.UInt64Value.fromObject(object.start, long + 1);
            }
            if (object.end != null) {
                if (!$util.isObject(object.end))
                    throw TypeError(".fs.VersionedReadBytesRequestBody.end: object expected");
                message.end = $root.common.UInt64Value.fromObject(object.end, long + 1);
            }
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.VersionedReadBytesRequestBody.flags: object expected");
                message.flags = $root.file.VersionedReadFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedReadBytesRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.VersionedReadBytesRequestBody
         * @static
         * @param {fs.VersionedReadBytesRequestBody} message VersionedReadBytesRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedReadBytesRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.start = null;
                object.end = null;
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.start != null && Object.hasOwnProperty.call(message, "start"))
                object.start = $root.common.UInt64Value.toObject(message.start, options, q + 1);
            if (message.end != null && Object.hasOwnProperty.call(message, "end"))
                object.end = $root.common.UInt64Value.toObject(message.end, options, q + 1);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.file.VersionedReadFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedReadBytesRequestBody to JSON.
         * @function toJSON
         * @memberof fs.VersionedReadBytesRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedReadBytesRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedReadBytesRequestBody
         * @function getTypeUrl
         * @memberof fs.VersionedReadBytesRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedReadBytesRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.VersionedReadBytesRequestBody";
        };

        return VersionedReadBytesRequestBody;
    })();

    fs.UpdateXAttrsRequestBody = (function() {

        /**
         * Properties of an UpdateXAttrsRequestBody.
         * @memberof fs
         * @interface IUpdateXAttrsRequestBody
         * @property {string|null} [path] UpdateXAttrsRequestBody path
         * @property {file.IXAttrsChanges|null} [changes] UpdateXAttrsRequestBody changes
         */

        /**
         * Constructs a new UpdateXAttrsRequestBody.
         * @memberof fs
         * @classdesc Represents an UpdateXAttrsRequestBody.
         * @implements IUpdateXAttrsRequestBody
         * @constructor
         * @param {fs.IUpdateXAttrsRequestBody=} [properties] Properties to set
         */
        function UpdateXAttrsRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * UpdateXAttrsRequestBody path.
         * @member {string} path
         * @memberof fs.UpdateXAttrsRequestBody
         * @instance
         */
        UpdateXAttrsRequestBody.prototype.path = "";

        /**
         * UpdateXAttrsRequestBody changes.
         * @member {file.IXAttrsChanges|null|undefined} changes
         * @memberof fs.UpdateXAttrsRequestBody
         * @instance
         */
        UpdateXAttrsRequestBody.prototype.changes = null;

        /**
         * Creates a new UpdateXAttrsRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.UpdateXAttrsRequestBody
         * @static
         * @param {fs.IUpdateXAttrsRequestBody=} [properties] Properties to set
         * @returns {fs.UpdateXAttrsRequestBody} UpdateXAttrsRequestBody instance
         */
        UpdateXAttrsRequestBody.create = function create(properties) {
            return new UpdateXAttrsRequestBody(properties);
        };

        /**
         * Encodes the specified UpdateXAttrsRequestBody message. Does not implicitly {@link fs.UpdateXAttrsRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.UpdateXAttrsRequestBody
         * @static
         * @param {fs.IUpdateXAttrsRequestBody} message UpdateXAttrsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UpdateXAttrsRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.changes != null && Object.hasOwnProperty.call(message, "changes"))
                $root.file.XAttrsChanges.encode(message.changes, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified UpdateXAttrsRequestBody message, length delimited. Does not implicitly {@link fs.UpdateXAttrsRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.UpdateXAttrsRequestBody
         * @static
         * @param {fs.IUpdateXAttrsRequestBody} message UpdateXAttrsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UpdateXAttrsRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an UpdateXAttrsRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.UpdateXAttrsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.UpdateXAttrsRequestBody} UpdateXAttrsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UpdateXAttrsRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.UpdateXAttrsRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.changes = $root.file.XAttrsChanges.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an UpdateXAttrsRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.UpdateXAttrsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.UpdateXAttrsRequestBody} UpdateXAttrsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UpdateXAttrsRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an UpdateXAttrsRequestBody message.
         * @function verify
         * @memberof fs.UpdateXAttrsRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        UpdateXAttrsRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.changes != null && Object.hasOwnProperty.call(message, "changes")) {
                var error = $root.file.XAttrsChanges.verify(message.changes, long + 1);
                if (error)
                    return "changes." + error;
            }
            return null;
        };

        /**
         * Creates an UpdateXAttrsRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.UpdateXAttrsRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.UpdateXAttrsRequestBody} UpdateXAttrsRequestBody
         */
        UpdateXAttrsRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.UpdateXAttrsRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.UpdateXAttrsRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.UpdateXAttrsRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.changes != null) {
                if (!$util.isObject(object.changes))
                    throw TypeError(".fs.UpdateXAttrsRequestBody.changes: object expected");
                message.changes = $root.file.XAttrsChanges.fromObject(object.changes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an UpdateXAttrsRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.UpdateXAttrsRequestBody
         * @static
         * @param {fs.UpdateXAttrsRequestBody} message UpdateXAttrsRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        UpdateXAttrsRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.changes = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.changes != null && Object.hasOwnProperty.call(message, "changes"))
                object.changes = $root.file.XAttrsChanges.toObject(message.changes, options, q + 1);
            return object;
        };

        /**
         * Converts this UpdateXAttrsRequestBody to JSON.
         * @function toJSON
         * @memberof fs.UpdateXAttrsRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        UpdateXAttrsRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for UpdateXAttrsRequestBody
         * @function getTypeUrl
         * @memberof fs.UpdateXAttrsRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        UpdateXAttrsRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.UpdateXAttrsRequestBody";
        };

        return UpdateXAttrsRequestBody;
    })();

    fs.MakeFolderRequestBody = (function() {

        /**
         * Properties of a MakeFolderRequestBody.
         * @memberof fs
         * @interface IMakeFolderRequestBody
         * @property {string|null} [path] MakeFolderRequestBody path
         * @property {common.IBooleanValue|null} [exclusive] MakeFolderRequestBody exclusive
         */

        /**
         * Constructs a new MakeFolderRequestBody.
         * @memberof fs
         * @classdesc Represents a MakeFolderRequestBody.
         * @implements IMakeFolderRequestBody
         * @constructor
         * @param {fs.IMakeFolderRequestBody=} [properties] Properties to set
         */
        function MakeFolderRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * MakeFolderRequestBody path.
         * @member {string} path
         * @memberof fs.MakeFolderRequestBody
         * @instance
         */
        MakeFolderRequestBody.prototype.path = "";

        /**
         * MakeFolderRequestBody exclusive.
         * @member {common.IBooleanValue|null|undefined} exclusive
         * @memberof fs.MakeFolderRequestBody
         * @instance
         */
        MakeFolderRequestBody.prototype.exclusive = null;

        /**
         * Creates a new MakeFolderRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.MakeFolderRequestBody
         * @static
         * @param {fs.IMakeFolderRequestBody=} [properties] Properties to set
         * @returns {fs.MakeFolderRequestBody} MakeFolderRequestBody instance
         */
        MakeFolderRequestBody.create = function create(properties) {
            return new MakeFolderRequestBody(properties);
        };

        /**
         * Encodes the specified MakeFolderRequestBody message. Does not implicitly {@link fs.MakeFolderRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.MakeFolderRequestBody
         * @static
         * @param {fs.IMakeFolderRequestBody} message MakeFolderRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        MakeFolderRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive"))
                $root.common.BooleanValue.encode(message.exclusive, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified MakeFolderRequestBody message, length delimited. Does not implicitly {@link fs.MakeFolderRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.MakeFolderRequestBody
         * @static
         * @param {fs.IMakeFolderRequestBody} message MakeFolderRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        MakeFolderRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a MakeFolderRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.MakeFolderRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.MakeFolderRequestBody} MakeFolderRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        MakeFolderRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.MakeFolderRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.exclusive = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a MakeFolderRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.MakeFolderRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.MakeFolderRequestBody} MakeFolderRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        MakeFolderRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a MakeFolderRequestBody message.
         * @function verify
         * @memberof fs.MakeFolderRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        MakeFolderRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive")) {
                var error = $root.common.BooleanValue.verify(message.exclusive, long + 1);
                if (error)
                    return "exclusive." + error;
            }
            return null;
        };

        /**
         * Creates a MakeFolderRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.MakeFolderRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.MakeFolderRequestBody} MakeFolderRequestBody
         */
        MakeFolderRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.MakeFolderRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.MakeFolderRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.MakeFolderRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.exclusive != null) {
                if (!$util.isObject(object.exclusive))
                    throw TypeError(".fs.MakeFolderRequestBody.exclusive: object expected");
                message.exclusive = $root.common.BooleanValue.fromObject(object.exclusive, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a MakeFolderRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.MakeFolderRequestBody
         * @static
         * @param {fs.MakeFolderRequestBody} message MakeFolderRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        MakeFolderRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.exclusive = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive"))
                object.exclusive = $root.common.BooleanValue.toObject(message.exclusive, options, q + 1);
            return object;
        };

        /**
         * Converts this MakeFolderRequestBody to JSON.
         * @function toJSON
         * @memberof fs.MakeFolderRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        MakeFolderRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for MakeFolderRequestBody
         * @function getTypeUrl
         * @memberof fs.MakeFolderRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        MakeFolderRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.MakeFolderRequestBody";
        };

        return MakeFolderRequestBody;
    })();

    fs.DeleteFolderRequestBody = (function() {

        /**
         * Properties of a DeleteFolderRequestBody.
         * @memberof fs
         * @interface IDeleteFolderRequestBody
         * @property {string|null} [path] DeleteFolderRequestBody path
         * @property {common.IBooleanValue|null} [removeContent] DeleteFolderRequestBody removeContent
         */

        /**
         * Constructs a new DeleteFolderRequestBody.
         * @memberof fs
         * @classdesc Represents a DeleteFolderRequestBody.
         * @implements IDeleteFolderRequestBody
         * @constructor
         * @param {fs.IDeleteFolderRequestBody=} [properties] Properties to set
         */
        function DeleteFolderRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * DeleteFolderRequestBody path.
         * @member {string} path
         * @memberof fs.DeleteFolderRequestBody
         * @instance
         */
        DeleteFolderRequestBody.prototype.path = "";

        /**
         * DeleteFolderRequestBody removeContent.
         * @member {common.IBooleanValue|null|undefined} removeContent
         * @memberof fs.DeleteFolderRequestBody
         * @instance
         */
        DeleteFolderRequestBody.prototype.removeContent = null;

        /**
         * Creates a new DeleteFolderRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.DeleteFolderRequestBody
         * @static
         * @param {fs.IDeleteFolderRequestBody=} [properties] Properties to set
         * @returns {fs.DeleteFolderRequestBody} DeleteFolderRequestBody instance
         */
        DeleteFolderRequestBody.create = function create(properties) {
            return new DeleteFolderRequestBody(properties);
        };

        /**
         * Encodes the specified DeleteFolderRequestBody message. Does not implicitly {@link fs.DeleteFolderRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.DeleteFolderRequestBody
         * @static
         * @param {fs.IDeleteFolderRequestBody} message DeleteFolderRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DeleteFolderRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.removeContent != null && Object.hasOwnProperty.call(message, "removeContent"))
                $root.common.BooleanValue.encode(message.removeContent, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified DeleteFolderRequestBody message, length delimited. Does not implicitly {@link fs.DeleteFolderRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.DeleteFolderRequestBody
         * @static
         * @param {fs.IDeleteFolderRequestBody} message DeleteFolderRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DeleteFolderRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a DeleteFolderRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.DeleteFolderRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.DeleteFolderRequestBody} DeleteFolderRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DeleteFolderRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.DeleteFolderRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.removeContent = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a DeleteFolderRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.DeleteFolderRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.DeleteFolderRequestBody} DeleteFolderRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DeleteFolderRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a DeleteFolderRequestBody message.
         * @function verify
         * @memberof fs.DeleteFolderRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        DeleteFolderRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.removeContent != null && Object.hasOwnProperty.call(message, "removeContent")) {
                var error = $root.common.BooleanValue.verify(message.removeContent, long + 1);
                if (error)
                    return "removeContent." + error;
            }
            return null;
        };

        /**
         * Creates a DeleteFolderRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.DeleteFolderRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.DeleteFolderRequestBody} DeleteFolderRequestBody
         */
        DeleteFolderRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.DeleteFolderRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.DeleteFolderRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.DeleteFolderRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.removeContent != null) {
                if (!$util.isObject(object.removeContent))
                    throw TypeError(".fs.DeleteFolderRequestBody.removeContent: object expected");
                message.removeContent = $root.common.BooleanValue.fromObject(object.removeContent, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a DeleteFolderRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.DeleteFolderRequestBody
         * @static
         * @param {fs.DeleteFolderRequestBody} message DeleteFolderRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        DeleteFolderRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.removeContent = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.removeContent != null && Object.hasOwnProperty.call(message, "removeContent"))
                object.removeContent = $root.common.BooleanValue.toObject(message.removeContent, options, q + 1);
            return object;
        };

        /**
         * Converts this DeleteFolderRequestBody to JSON.
         * @function toJSON
         * @memberof fs.DeleteFolderRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        DeleteFolderRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for DeleteFolderRequestBody
         * @function getTypeUrl
         * @memberof fs.DeleteFolderRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        DeleteFolderRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.DeleteFolderRequestBody";
        };

        return DeleteFolderRequestBody;
    })();

    fs.MoveRequestBody = (function() {

        /**
         * Properties of a MoveRequestBody.
         * @memberof fs
         * @interface IMoveRequestBody
         * @property {string|null} [src] MoveRequestBody src
         * @property {string|null} [dst] MoveRequestBody dst
         */

        /**
         * Constructs a new MoveRequestBody.
         * @memberof fs
         * @classdesc Represents a MoveRequestBody.
         * @implements IMoveRequestBody
         * @constructor
         * @param {fs.IMoveRequestBody=} [properties] Properties to set
         */
        function MoveRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * MoveRequestBody src.
         * @member {string} src
         * @memberof fs.MoveRequestBody
         * @instance
         */
        MoveRequestBody.prototype.src = "";

        /**
         * MoveRequestBody dst.
         * @member {string} dst
         * @memberof fs.MoveRequestBody
         * @instance
         */
        MoveRequestBody.prototype.dst = "";

        /**
         * Creates a new MoveRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.MoveRequestBody
         * @static
         * @param {fs.IMoveRequestBody=} [properties] Properties to set
         * @returns {fs.MoveRequestBody} MoveRequestBody instance
         */
        MoveRequestBody.create = function create(properties) {
            return new MoveRequestBody(properties);
        };

        /**
         * Encodes the specified MoveRequestBody message. Does not implicitly {@link fs.MoveRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.MoveRequestBody
         * @static
         * @param {fs.IMoveRequestBody} message MoveRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        MoveRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.src);
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.dst);
            return writer;
        };

        /**
         * Encodes the specified MoveRequestBody message, length delimited. Does not implicitly {@link fs.MoveRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.MoveRequestBody
         * @static
         * @param {fs.IMoveRequestBody} message MoveRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        MoveRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a MoveRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.MoveRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.MoveRequestBody} MoveRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        MoveRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.MoveRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.src = reader.string();
                        break;
                    }
                case 2: {
                        message.dst = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a MoveRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.MoveRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.MoveRequestBody} MoveRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        MoveRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a MoveRequestBody message.
         * @function verify
         * @memberof fs.MoveRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        MoveRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                if (!$util.isString(message.src))
                    return "src: string expected";
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                if (!$util.isString(message.dst))
                    return "dst: string expected";
            return null;
        };

        /**
         * Creates a MoveRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.MoveRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.MoveRequestBody} MoveRequestBody
         */
        MoveRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.MoveRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.MoveRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.MoveRequestBody();
            if (object.src != null)
                message.src = String(object.src);
            if (object.dst != null)
                message.dst = String(object.dst);
            return message;
        };

        /**
         * Creates a plain object from a MoveRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.MoveRequestBody
         * @static
         * @param {fs.MoveRequestBody} message MoveRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        MoveRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.src = "";
                object.dst = "";
            }
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                object.src = message.src;
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                object.dst = message.dst;
            return object;
        };

        /**
         * Converts this MoveRequestBody to JSON.
         * @function toJSON
         * @memberof fs.MoveRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        MoveRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for MoveRequestBody
         * @function getTypeUrl
         * @memberof fs.MoveRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        MoveRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.MoveRequestBody";
        };

        return MoveRequestBody;
    })();

    fs.CopyFileRequestBody = (function() {

        /**
         * Properties of a CopyFileRequestBody.
         * @memberof fs
         * @interface ICopyFileRequestBody
         * @property {string|null} [src] CopyFileRequestBody src
         * @property {string|null} [dst] CopyFileRequestBody dst
         * @property {common.IBooleanValue|null} [overwrite] CopyFileRequestBody overwrite
         */

        /**
         * Constructs a new CopyFileRequestBody.
         * @memberof fs
         * @classdesc Represents a CopyFileRequestBody.
         * @implements ICopyFileRequestBody
         * @constructor
         * @param {fs.ICopyFileRequestBody=} [properties] Properties to set
         */
        function CopyFileRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * CopyFileRequestBody src.
         * @member {string} src
         * @memberof fs.CopyFileRequestBody
         * @instance
         */
        CopyFileRequestBody.prototype.src = "";

        /**
         * CopyFileRequestBody dst.
         * @member {string} dst
         * @memberof fs.CopyFileRequestBody
         * @instance
         */
        CopyFileRequestBody.prototype.dst = "";

        /**
         * CopyFileRequestBody overwrite.
         * @member {common.IBooleanValue|null|undefined} overwrite
         * @memberof fs.CopyFileRequestBody
         * @instance
         */
        CopyFileRequestBody.prototype.overwrite = null;

        /**
         * Creates a new CopyFileRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.CopyFileRequestBody
         * @static
         * @param {fs.ICopyFileRequestBody=} [properties] Properties to set
         * @returns {fs.CopyFileRequestBody} CopyFileRequestBody instance
         */
        CopyFileRequestBody.create = function create(properties) {
            return new CopyFileRequestBody(properties);
        };

        /**
         * Encodes the specified CopyFileRequestBody message. Does not implicitly {@link fs.CopyFileRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.CopyFileRequestBody
         * @static
         * @param {fs.ICopyFileRequestBody} message CopyFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CopyFileRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.src);
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.dst);
            if (message.overwrite != null && Object.hasOwnProperty.call(message, "overwrite"))
                $root.common.BooleanValue.encode(message.overwrite, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified CopyFileRequestBody message, length delimited. Does not implicitly {@link fs.CopyFileRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.CopyFileRequestBody
         * @static
         * @param {fs.ICopyFileRequestBody} message CopyFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CopyFileRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a CopyFileRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.CopyFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.CopyFileRequestBody} CopyFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CopyFileRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.CopyFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.src = reader.string();
                        break;
                    }
                case 2: {
                        message.dst = reader.string();
                        break;
                    }
                case 3: {
                        message.overwrite = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a CopyFileRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.CopyFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.CopyFileRequestBody} CopyFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CopyFileRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a CopyFileRequestBody message.
         * @function verify
         * @memberof fs.CopyFileRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        CopyFileRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                if (!$util.isString(message.src))
                    return "src: string expected";
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                if (!$util.isString(message.dst))
                    return "dst: string expected";
            if (message.overwrite != null && Object.hasOwnProperty.call(message, "overwrite")) {
                var error = $root.common.BooleanValue.verify(message.overwrite, long + 1);
                if (error)
                    return "overwrite." + error;
            }
            return null;
        };

        /**
         * Creates a CopyFileRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.CopyFileRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.CopyFileRequestBody} CopyFileRequestBody
         */
        CopyFileRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.CopyFileRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.CopyFileRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.CopyFileRequestBody();
            if (object.src != null)
                message.src = String(object.src);
            if (object.dst != null)
                message.dst = String(object.dst);
            if (object.overwrite != null) {
                if (!$util.isObject(object.overwrite))
                    throw TypeError(".fs.CopyFileRequestBody.overwrite: object expected");
                message.overwrite = $root.common.BooleanValue.fromObject(object.overwrite, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a CopyFileRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.CopyFileRequestBody
         * @static
         * @param {fs.CopyFileRequestBody} message CopyFileRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        CopyFileRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.src = "";
                object.dst = "";
                object.overwrite = null;
            }
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                object.src = message.src;
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                object.dst = message.dst;
            if (message.overwrite != null && Object.hasOwnProperty.call(message, "overwrite"))
                object.overwrite = $root.common.BooleanValue.toObject(message.overwrite, options, q + 1);
            return object;
        };

        /**
         * Converts this CopyFileRequestBody to JSON.
         * @function toJSON
         * @memberof fs.CopyFileRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        CopyFileRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for CopyFileRequestBody
         * @function getTypeUrl
         * @memberof fs.CopyFileRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        CopyFileRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.CopyFileRequestBody";
        };

        return CopyFileRequestBody;
    })();

    fs.CopyFolderRequestBody = (function() {

        /**
         * Properties of a CopyFolderRequestBody.
         * @memberof fs
         * @interface ICopyFolderRequestBody
         * @property {string|null} [src] CopyFolderRequestBody src
         * @property {string|null} [dst] CopyFolderRequestBody dst
         * @property {common.IBooleanValue|null} [mergeAndOverwrite] CopyFolderRequestBody mergeAndOverwrite
         */

        /**
         * Constructs a new CopyFolderRequestBody.
         * @memberof fs
         * @classdesc Represents a CopyFolderRequestBody.
         * @implements ICopyFolderRequestBody
         * @constructor
         * @param {fs.ICopyFolderRequestBody=} [properties] Properties to set
         */
        function CopyFolderRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * CopyFolderRequestBody src.
         * @member {string} src
         * @memberof fs.CopyFolderRequestBody
         * @instance
         */
        CopyFolderRequestBody.prototype.src = "";

        /**
         * CopyFolderRequestBody dst.
         * @member {string} dst
         * @memberof fs.CopyFolderRequestBody
         * @instance
         */
        CopyFolderRequestBody.prototype.dst = "";

        /**
         * CopyFolderRequestBody mergeAndOverwrite.
         * @member {common.IBooleanValue|null|undefined} mergeAndOverwrite
         * @memberof fs.CopyFolderRequestBody
         * @instance
         */
        CopyFolderRequestBody.prototype.mergeAndOverwrite = null;

        /**
         * Creates a new CopyFolderRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.CopyFolderRequestBody
         * @static
         * @param {fs.ICopyFolderRequestBody=} [properties] Properties to set
         * @returns {fs.CopyFolderRequestBody} CopyFolderRequestBody instance
         */
        CopyFolderRequestBody.create = function create(properties) {
            return new CopyFolderRequestBody(properties);
        };

        /**
         * Encodes the specified CopyFolderRequestBody message. Does not implicitly {@link fs.CopyFolderRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.CopyFolderRequestBody
         * @static
         * @param {fs.ICopyFolderRequestBody} message CopyFolderRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CopyFolderRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.src);
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.dst);
            if (message.mergeAndOverwrite != null && Object.hasOwnProperty.call(message, "mergeAndOverwrite"))
                $root.common.BooleanValue.encode(message.mergeAndOverwrite, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified CopyFolderRequestBody message, length delimited. Does not implicitly {@link fs.CopyFolderRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.CopyFolderRequestBody
         * @static
         * @param {fs.ICopyFolderRequestBody} message CopyFolderRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        CopyFolderRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a CopyFolderRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.CopyFolderRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.CopyFolderRequestBody} CopyFolderRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CopyFolderRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.CopyFolderRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.src = reader.string();
                        break;
                    }
                case 2: {
                        message.dst = reader.string();
                        break;
                    }
                case 3: {
                        message.mergeAndOverwrite = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a CopyFolderRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.CopyFolderRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.CopyFolderRequestBody} CopyFolderRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        CopyFolderRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a CopyFolderRequestBody message.
         * @function verify
         * @memberof fs.CopyFolderRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        CopyFolderRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                if (!$util.isString(message.src))
                    return "src: string expected";
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                if (!$util.isString(message.dst))
                    return "dst: string expected";
            if (message.mergeAndOverwrite != null && Object.hasOwnProperty.call(message, "mergeAndOverwrite")) {
                var error = $root.common.BooleanValue.verify(message.mergeAndOverwrite, long + 1);
                if (error)
                    return "mergeAndOverwrite." + error;
            }
            return null;
        };

        /**
         * Creates a CopyFolderRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.CopyFolderRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.CopyFolderRequestBody} CopyFolderRequestBody
         */
        CopyFolderRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.CopyFolderRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.CopyFolderRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.CopyFolderRequestBody();
            if (object.src != null)
                message.src = String(object.src);
            if (object.dst != null)
                message.dst = String(object.dst);
            if (object.mergeAndOverwrite != null) {
                if (!$util.isObject(object.mergeAndOverwrite))
                    throw TypeError(".fs.CopyFolderRequestBody.mergeAndOverwrite: object expected");
                message.mergeAndOverwrite = $root.common.BooleanValue.fromObject(object.mergeAndOverwrite, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a CopyFolderRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.CopyFolderRequestBody
         * @static
         * @param {fs.CopyFolderRequestBody} message CopyFolderRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        CopyFolderRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.src = "";
                object.dst = "";
                object.mergeAndOverwrite = null;
            }
            if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                object.src = message.src;
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                object.dst = message.dst;
            if (message.mergeAndOverwrite != null && Object.hasOwnProperty.call(message, "mergeAndOverwrite"))
                object.mergeAndOverwrite = $root.common.BooleanValue.toObject(message.mergeAndOverwrite, options, q + 1);
            return object;
        };

        /**
         * Converts this CopyFolderRequestBody to JSON.
         * @function toJSON
         * @memberof fs.CopyFolderRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        CopyFolderRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for CopyFolderRequestBody
         * @function getTypeUrl
         * @memberof fs.CopyFolderRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        CopyFolderRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.CopyFolderRequestBody";
        };

        return CopyFolderRequestBody;
    })();

    fs.SaveFileRequestBody = (function() {

        /**
         * Properties of a SaveFileRequestBody.
         * @memberof fs
         * @interface ISaveFileRequestBody
         * @property {common.IObjectReference|null} [file] SaveFileRequestBody file
         * @property {string|null} [dst] SaveFileRequestBody dst
         * @property {common.IBooleanValue|null} [overwrite] SaveFileRequestBody overwrite
         */

        /**
         * Constructs a new SaveFileRequestBody.
         * @memberof fs
         * @classdesc Represents a SaveFileRequestBody.
         * @implements ISaveFileRequestBody
         * @constructor
         * @param {fs.ISaveFileRequestBody=} [properties] Properties to set
         */
        function SaveFileRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * SaveFileRequestBody file.
         * @member {common.IObjectReference|null|undefined} file
         * @memberof fs.SaveFileRequestBody
         * @instance
         */
        SaveFileRequestBody.prototype.file = null;

        /**
         * SaveFileRequestBody dst.
         * @member {string} dst
         * @memberof fs.SaveFileRequestBody
         * @instance
         */
        SaveFileRequestBody.prototype.dst = "";

        /**
         * SaveFileRequestBody overwrite.
         * @member {common.IBooleanValue|null|undefined} overwrite
         * @memberof fs.SaveFileRequestBody
         * @instance
         */
        SaveFileRequestBody.prototype.overwrite = null;

        /**
         * Creates a new SaveFileRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.SaveFileRequestBody
         * @static
         * @param {fs.ISaveFileRequestBody=} [properties] Properties to set
         * @returns {fs.SaveFileRequestBody} SaveFileRequestBody instance
         */
        SaveFileRequestBody.create = function create(properties) {
            return new SaveFileRequestBody(properties);
        };

        /**
         * Encodes the specified SaveFileRequestBody message. Does not implicitly {@link fs.SaveFileRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.SaveFileRequestBody
         * @static
         * @param {fs.ISaveFileRequestBody} message SaveFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SaveFileRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                $root.common.ObjectReference.encode(message.file, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.dst);
            if (message.overwrite != null && Object.hasOwnProperty.call(message, "overwrite"))
                $root.common.BooleanValue.encode(message.overwrite, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified SaveFileRequestBody message, length delimited. Does not implicitly {@link fs.SaveFileRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.SaveFileRequestBody
         * @static
         * @param {fs.ISaveFileRequestBody} message SaveFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SaveFileRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a SaveFileRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.SaveFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.SaveFileRequestBody} SaveFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SaveFileRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SaveFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.file = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.dst = reader.string();
                        break;
                    }
                case 3: {
                        message.overwrite = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a SaveFileRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.SaveFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.SaveFileRequestBody} SaveFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SaveFileRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a SaveFileRequestBody message.
         * @function verify
         * @memberof fs.SaveFileRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        SaveFileRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.file != null && Object.hasOwnProperty.call(message, "file")) {
                var error = $root.common.ObjectReference.verify(message.file, long + 1);
                if (error)
                    return "file." + error;
            }
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                if (!$util.isString(message.dst))
                    return "dst: string expected";
            if (message.overwrite != null && Object.hasOwnProperty.call(message, "overwrite")) {
                var error = $root.common.BooleanValue.verify(message.overwrite, long + 1);
                if (error)
                    return "overwrite." + error;
            }
            return null;
        };

        /**
         * Creates a SaveFileRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.SaveFileRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.SaveFileRequestBody} SaveFileRequestBody
         */
        SaveFileRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.SaveFileRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.SaveFileRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.SaveFileRequestBody();
            if (object.file != null) {
                if (!$util.isObject(object.file))
                    throw TypeError(".fs.SaveFileRequestBody.file: object expected");
                message.file = $root.common.ObjectReference.fromObject(object.file, long + 1);
            }
            if (object.dst != null)
                message.dst = String(object.dst);
            if (object.overwrite != null) {
                if (!$util.isObject(object.overwrite))
                    throw TypeError(".fs.SaveFileRequestBody.overwrite: object expected");
                message.overwrite = $root.common.BooleanValue.fromObject(object.overwrite, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a SaveFileRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.SaveFileRequestBody
         * @static
         * @param {fs.SaveFileRequestBody} message SaveFileRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        SaveFileRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.file = null;
                object.dst = "";
                object.overwrite = null;
            }
            if (message.file != null && Object.hasOwnProperty.call(message, "file"))
                object.file = $root.common.ObjectReference.toObject(message.file, options, q + 1);
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                object.dst = message.dst;
            if (message.overwrite != null && Object.hasOwnProperty.call(message, "overwrite"))
                object.overwrite = $root.common.BooleanValue.toObject(message.overwrite, options, q + 1);
            return object;
        };

        /**
         * Converts this SaveFileRequestBody to JSON.
         * @function toJSON
         * @memberof fs.SaveFileRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        SaveFileRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for SaveFileRequestBody
         * @function getTypeUrl
         * @memberof fs.SaveFileRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        SaveFileRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.SaveFileRequestBody";
        };

        return SaveFileRequestBody;
    })();

    fs.SaveFolderRequestBody = (function() {

        /**
         * Properties of a SaveFolderRequestBody.
         * @memberof fs
         * @interface ISaveFolderRequestBody
         * @property {common.IObjectReference|null} [folder] SaveFolderRequestBody folder
         * @property {string|null} [dst] SaveFolderRequestBody dst
         * @property {common.IBooleanValue|null} [mergeAndOverwrite] SaveFolderRequestBody mergeAndOverwrite
         */

        /**
         * Constructs a new SaveFolderRequestBody.
         * @memberof fs
         * @classdesc Represents a SaveFolderRequestBody.
         * @implements ISaveFolderRequestBody
         * @constructor
         * @param {fs.ISaveFolderRequestBody=} [properties] Properties to set
         */
        function SaveFolderRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * SaveFolderRequestBody folder.
         * @member {common.IObjectReference|null|undefined} folder
         * @memberof fs.SaveFolderRequestBody
         * @instance
         */
        SaveFolderRequestBody.prototype.folder = null;

        /**
         * SaveFolderRequestBody dst.
         * @member {string} dst
         * @memberof fs.SaveFolderRequestBody
         * @instance
         */
        SaveFolderRequestBody.prototype.dst = "";

        /**
         * SaveFolderRequestBody mergeAndOverwrite.
         * @member {common.IBooleanValue|null|undefined} mergeAndOverwrite
         * @memberof fs.SaveFolderRequestBody
         * @instance
         */
        SaveFolderRequestBody.prototype.mergeAndOverwrite = null;

        /**
         * Creates a new SaveFolderRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.SaveFolderRequestBody
         * @static
         * @param {fs.ISaveFolderRequestBody=} [properties] Properties to set
         * @returns {fs.SaveFolderRequestBody} SaveFolderRequestBody instance
         */
        SaveFolderRequestBody.create = function create(properties) {
            return new SaveFolderRequestBody(properties);
        };

        /**
         * Encodes the specified SaveFolderRequestBody message. Does not implicitly {@link fs.SaveFolderRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.SaveFolderRequestBody
         * @static
         * @param {fs.ISaveFolderRequestBody} message SaveFolderRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SaveFolderRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.folder != null && Object.hasOwnProperty.call(message, "folder"))
                $root.common.ObjectReference.encode(message.folder, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.dst);
            if (message.mergeAndOverwrite != null && Object.hasOwnProperty.call(message, "mergeAndOverwrite"))
                $root.common.BooleanValue.encode(message.mergeAndOverwrite, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified SaveFolderRequestBody message, length delimited. Does not implicitly {@link fs.SaveFolderRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.SaveFolderRequestBody
         * @static
         * @param {fs.ISaveFolderRequestBody} message SaveFolderRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SaveFolderRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a SaveFolderRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.SaveFolderRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.SaveFolderRequestBody} SaveFolderRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SaveFolderRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.SaveFolderRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.folder = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.dst = reader.string();
                        break;
                    }
                case 3: {
                        message.mergeAndOverwrite = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a SaveFolderRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.SaveFolderRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.SaveFolderRequestBody} SaveFolderRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SaveFolderRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a SaveFolderRequestBody message.
         * @function verify
         * @memberof fs.SaveFolderRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        SaveFolderRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.folder != null && Object.hasOwnProperty.call(message, "folder")) {
                var error = $root.common.ObjectReference.verify(message.folder, long + 1);
                if (error)
                    return "folder." + error;
            }
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                if (!$util.isString(message.dst))
                    return "dst: string expected";
            if (message.mergeAndOverwrite != null && Object.hasOwnProperty.call(message, "mergeAndOverwrite")) {
                var error = $root.common.BooleanValue.verify(message.mergeAndOverwrite, long + 1);
                if (error)
                    return "mergeAndOverwrite." + error;
            }
            return null;
        };

        /**
         * Creates a SaveFolderRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.SaveFolderRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.SaveFolderRequestBody} SaveFolderRequestBody
         */
        SaveFolderRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.SaveFolderRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.SaveFolderRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.SaveFolderRequestBody();
            if (object.folder != null) {
                if (!$util.isObject(object.folder))
                    throw TypeError(".fs.SaveFolderRequestBody.folder: object expected");
                message.folder = $root.common.ObjectReference.fromObject(object.folder, long + 1);
            }
            if (object.dst != null)
                message.dst = String(object.dst);
            if (object.mergeAndOverwrite != null) {
                if (!$util.isObject(object.mergeAndOverwrite))
                    throw TypeError(".fs.SaveFolderRequestBody.mergeAndOverwrite: object expected");
                message.mergeAndOverwrite = $root.common.BooleanValue.fromObject(object.mergeAndOverwrite, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a SaveFolderRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.SaveFolderRequestBody
         * @static
         * @param {fs.SaveFolderRequestBody} message SaveFolderRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        SaveFolderRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.folder = null;
                object.dst = "";
                object.mergeAndOverwrite = null;
            }
            if (message.folder != null && Object.hasOwnProperty.call(message, "folder"))
                object.folder = $root.common.ObjectReference.toObject(message.folder, options, q + 1);
            if (message.dst != null && Object.hasOwnProperty.call(message, "dst"))
                object.dst = message.dst;
            if (message.mergeAndOverwrite != null && Object.hasOwnProperty.call(message, "mergeAndOverwrite"))
                object.mergeAndOverwrite = $root.common.BooleanValue.toObject(message.mergeAndOverwrite, options, q + 1);
            return object;
        };

        /**
         * Converts this SaveFolderRequestBody to JSON.
         * @function toJSON
         * @memberof fs.SaveFolderRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        SaveFolderRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for SaveFolderRequestBody
         * @function getTypeUrl
         * @memberof fs.SaveFolderRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        SaveFolderRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.SaveFolderRequestBody";
        };

        return SaveFolderRequestBody;
    })();

    fs.LinkRequestBody = (function() {

        /**
         * Properties of a LinkRequestBody.
         * @memberof fs
         * @interface ILinkRequestBody
         * @property {string|null} [path] LinkRequestBody path
         * @property {common.IObjectReference|null} [target] LinkRequestBody target
         */

        /**
         * Constructs a new LinkRequestBody.
         * @memberof fs
         * @classdesc Represents a LinkRequestBody.
         * @implements ILinkRequestBody
         * @constructor
         * @param {fs.ILinkRequestBody=} [properties] Properties to set
         */
        function LinkRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * LinkRequestBody path.
         * @member {string} path
         * @memberof fs.LinkRequestBody
         * @instance
         */
        LinkRequestBody.prototype.path = "";

        /**
         * LinkRequestBody target.
         * @member {common.IObjectReference|null|undefined} target
         * @memberof fs.LinkRequestBody
         * @instance
         */
        LinkRequestBody.prototype.target = null;

        /**
         * Creates a new LinkRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.LinkRequestBody
         * @static
         * @param {fs.ILinkRequestBody=} [properties] Properties to set
         * @returns {fs.LinkRequestBody} LinkRequestBody instance
         */
        LinkRequestBody.create = function create(properties) {
            return new LinkRequestBody(properties);
        };

        /**
         * Encodes the specified LinkRequestBody message. Does not implicitly {@link fs.LinkRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.LinkRequestBody
         * @static
         * @param {fs.ILinkRequestBody} message LinkRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        LinkRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.target != null && Object.hasOwnProperty.call(message, "target"))
                $root.common.ObjectReference.encode(message.target, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified LinkRequestBody message, length delimited. Does not implicitly {@link fs.LinkRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.LinkRequestBody
         * @static
         * @param {fs.ILinkRequestBody} message LinkRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        LinkRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a LinkRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.LinkRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.LinkRequestBody} LinkRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        LinkRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.LinkRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.target = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a LinkRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.LinkRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.LinkRequestBody} LinkRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        LinkRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a LinkRequestBody message.
         * @function verify
         * @memberof fs.LinkRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        LinkRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.target != null && Object.hasOwnProperty.call(message, "target")) {
                var error = $root.common.ObjectReference.verify(message.target, long + 1);
                if (error)
                    return "target." + error;
            }
            return null;
        };

        /**
         * Creates a LinkRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.LinkRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.LinkRequestBody} LinkRequestBody
         */
        LinkRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.LinkRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.LinkRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.LinkRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.target != null) {
                if (!$util.isObject(object.target))
                    throw TypeError(".fs.LinkRequestBody.target: object expected");
                message.target = $root.common.ObjectReference.fromObject(object.target, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a LinkRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.LinkRequestBody
         * @static
         * @param {fs.LinkRequestBody} message LinkRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        LinkRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.target = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.target != null && Object.hasOwnProperty.call(message, "target"))
                object.target = $root.common.ObjectReference.toObject(message.target, options, q + 1);
            return object;
        };

        /**
         * Converts this LinkRequestBody to JSON.
         * @function toJSON
         * @memberof fs.LinkRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        LinkRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for LinkRequestBody
         * @function getTypeUrl
         * @memberof fs.LinkRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        LinkRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.LinkRequestBody";
        };

        return LinkRequestBody;
    })();

    fs.PathAndOptFileFlags = (function() {

        /**
         * Properties of a PathAndOptFileFlags.
         * @memberof fs
         * @interface IPathAndOptFileFlags
         * @property {string|null} [path] PathAndOptFileFlags path
         * @property {fs.IFileFlags|null} [flags] PathAndOptFileFlags flags
         */

        /**
         * Constructs a new PathAndOptFileFlags.
         * @memberof fs
         * @classdesc Represents a PathAndOptFileFlags.
         * @implements IPathAndOptFileFlags
         * @constructor
         * @param {fs.IPathAndOptFileFlags=} [properties] Properties to set
         */
        function PathAndOptFileFlags(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * PathAndOptFileFlags path.
         * @member {string} path
         * @memberof fs.PathAndOptFileFlags
         * @instance
         */
        PathAndOptFileFlags.prototype.path = "";

        /**
         * PathAndOptFileFlags flags.
         * @member {fs.IFileFlags|null|undefined} flags
         * @memberof fs.PathAndOptFileFlags
         * @instance
         */
        PathAndOptFileFlags.prototype.flags = null;

        /**
         * Creates a new PathAndOptFileFlags instance using the specified properties.
         * @function create
         * @memberof fs.PathAndOptFileFlags
         * @static
         * @param {fs.IPathAndOptFileFlags=} [properties] Properties to set
         * @returns {fs.PathAndOptFileFlags} PathAndOptFileFlags instance
         */
        PathAndOptFileFlags.create = function create(properties) {
            return new PathAndOptFileFlags(properties);
        };

        /**
         * Encodes the specified PathAndOptFileFlags message. Does not implicitly {@link fs.PathAndOptFileFlags.verify|verify} messages.
         * @function encode
         * @memberof fs.PathAndOptFileFlags
         * @static
         * @param {fs.IPathAndOptFileFlags} message PathAndOptFileFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        PathAndOptFileFlags.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.fs.FileFlags.encode(message.flags, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified PathAndOptFileFlags message, length delimited. Does not implicitly {@link fs.PathAndOptFileFlags.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.PathAndOptFileFlags
         * @static
         * @param {fs.IPathAndOptFileFlags} message PathAndOptFileFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        PathAndOptFileFlags.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a PathAndOptFileFlags message from the specified reader or buffer.
         * @function decode
         * @memberof fs.PathAndOptFileFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.PathAndOptFileFlags} PathAndOptFileFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        PathAndOptFileFlags.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.PathAndOptFileFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.flags = $root.fs.FileFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a PathAndOptFileFlags message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.PathAndOptFileFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.PathAndOptFileFlags} PathAndOptFileFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        PathAndOptFileFlags.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a PathAndOptFileFlags message.
         * @function verify
         * @memberof fs.PathAndOptFileFlags
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        PathAndOptFileFlags.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.fs.FileFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a PathAndOptFileFlags message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.PathAndOptFileFlags
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.PathAndOptFileFlags} PathAndOptFileFlags
         */
        PathAndOptFileFlags.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.PathAndOptFileFlags)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.PathAndOptFileFlags: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.PathAndOptFileFlags();
            if (object.path != null)
                message.path = String(object.path);
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.PathAndOptFileFlags.flags: object expected");
                message.flags = $root.fs.FileFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a PathAndOptFileFlags message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.PathAndOptFileFlags
         * @static
         * @param {fs.PathAndOptFileFlags} message PathAndOptFileFlags
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        PathAndOptFileFlags.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.fs.FileFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this PathAndOptFileFlags to JSON.
         * @function toJSON
         * @memberof fs.PathAndOptFileFlags
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        PathAndOptFileFlags.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for PathAndOptFileFlags
         * @function getTypeUrl
         * @memberof fs.PathAndOptFileFlags
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        PathAndOptFileFlags.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.PathAndOptFileFlags";
        };

        return PathAndOptFileFlags;
    })();

    fs.FileFlags = (function() {

        /**
         * Properties of a FileFlags.
         * @memberof fs
         * @interface IFileFlags
         * @property {common.IBooleanValue|null} [truncate] FileFlags truncate
         * @property {common.IBooleanValue|null} [create] FileFlags create
         * @property {common.IBooleanValue|null} [exclusive] FileFlags exclusive
         */

        /**
         * Constructs a new FileFlags.
         * @memberof fs
         * @classdesc Represents a FileFlags.
         * @implements IFileFlags
         * @constructor
         * @param {fs.IFileFlags=} [properties] Properties to set
         */
        function FileFlags(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileFlags truncate.
         * @member {common.IBooleanValue|null|undefined} truncate
         * @memberof fs.FileFlags
         * @instance
         */
        FileFlags.prototype.truncate = null;

        /**
         * FileFlags create.
         * @member {common.IBooleanValue|null|undefined} create
         * @memberof fs.FileFlags
         * @instance
         */
        FileFlags.prototype.create = null;

        /**
         * FileFlags exclusive.
         * @member {common.IBooleanValue|null|undefined} exclusive
         * @memberof fs.FileFlags
         * @instance
         */
        FileFlags.prototype.exclusive = null;

        /**
         * Creates a new FileFlags instance using the specified properties.
         * @function create
         * @memberof fs.FileFlags
         * @static
         * @param {fs.IFileFlags=} [properties] Properties to set
         * @returns {fs.FileFlags} FileFlags instance
         */
        FileFlags.create = function create(properties) {
            return new FileFlags(properties);
        };

        /**
         * Encodes the specified FileFlags message. Does not implicitly {@link fs.FileFlags.verify|verify} messages.
         * @function encode
         * @memberof fs.FileFlags
         * @static
         * @param {fs.IFileFlags} message FileFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileFlags.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.truncate != null && Object.hasOwnProperty.call(message, "truncate"))
                $root.common.BooleanValue.encode(message.truncate, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.create != null && Object.hasOwnProperty.call(message, "create"))
                $root.common.BooleanValue.encode(message.create, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive"))
                $root.common.BooleanValue.encode(message.exclusive, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FileFlags message, length delimited. Does not implicitly {@link fs.FileFlags.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FileFlags
         * @static
         * @param {fs.IFileFlags} message FileFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileFlags.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileFlags message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FileFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FileFlags} FileFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileFlags.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FileFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.truncate = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.create = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.exclusive = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileFlags message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FileFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FileFlags} FileFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileFlags.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileFlags message.
         * @function verify
         * @memberof fs.FileFlags
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileFlags.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.truncate != null && Object.hasOwnProperty.call(message, "truncate")) {
                var error = $root.common.BooleanValue.verify(message.truncate, long + 1);
                if (error)
                    return "truncate." + error;
            }
            if (message.create != null && Object.hasOwnProperty.call(message, "create")) {
                var error = $root.common.BooleanValue.verify(message.create, long + 1);
                if (error)
                    return "create." + error;
            }
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive")) {
                var error = $root.common.BooleanValue.verify(message.exclusive, long + 1);
                if (error)
                    return "exclusive." + error;
            }
            return null;
        };

        /**
         * Creates a FileFlags message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FileFlags
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FileFlags} FileFlags
         */
        FileFlags.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FileFlags)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FileFlags: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FileFlags();
            if (object.truncate != null) {
                if (!$util.isObject(object.truncate))
                    throw TypeError(".fs.FileFlags.truncate: object expected");
                message.truncate = $root.common.BooleanValue.fromObject(object.truncate, long + 1);
            }
            if (object.create != null) {
                if (!$util.isObject(object.create))
                    throw TypeError(".fs.FileFlags.create: object expected");
                message.create = $root.common.BooleanValue.fromObject(object.create, long + 1);
            }
            if (object.exclusive != null) {
                if (!$util.isObject(object.exclusive))
                    throw TypeError(".fs.FileFlags.exclusive: object expected");
                message.exclusive = $root.common.BooleanValue.fromObject(object.exclusive, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a FileFlags message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FileFlags
         * @static
         * @param {fs.FileFlags} message FileFlags
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileFlags.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.truncate = null;
                object.create = null;
                object.exclusive = null;
            }
            if (message.truncate != null && Object.hasOwnProperty.call(message, "truncate"))
                object.truncate = $root.common.BooleanValue.toObject(message.truncate, options, q + 1);
            if (message.create != null && Object.hasOwnProperty.call(message, "create"))
                object.create = $root.common.BooleanValue.toObject(message.create, options, q + 1);
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive"))
                object.exclusive = $root.common.BooleanValue.toObject(message.exclusive, options, q + 1);
            return object;
        };

        /**
         * Converts this FileFlags to JSON.
         * @function toJSON
         * @memberof fs.FileFlags
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileFlags.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileFlags
         * @function getTypeUrl
         * @memberof fs.FileFlags
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileFlags.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FileFlags";
        };

        return FileFlags;
    })();

    fs.WriteJsonFileRequestBody = (function() {

        /**
         * Properties of a WriteJsonFileRequestBody.
         * @memberof fs
         * @interface IWriteJsonFileRequestBody
         * @property {string|null} [path] WriteJsonFileRequestBody path
         * @property {string|null} [json] WriteJsonFileRequestBody json
         * @property {fs.IFileFlags|null} [flags] WriteJsonFileRequestBody flags
         */

        /**
         * Constructs a new WriteJsonFileRequestBody.
         * @memberof fs
         * @classdesc Represents a WriteJsonFileRequestBody.
         * @implements IWriteJsonFileRequestBody
         * @constructor
         * @param {fs.IWriteJsonFileRequestBody=} [properties] Properties to set
         */
        function WriteJsonFileRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * WriteJsonFileRequestBody path.
         * @member {string} path
         * @memberof fs.WriteJsonFileRequestBody
         * @instance
         */
        WriteJsonFileRequestBody.prototype.path = "";

        /**
         * WriteJsonFileRequestBody json.
         * @member {string} json
         * @memberof fs.WriteJsonFileRequestBody
         * @instance
         */
        WriteJsonFileRequestBody.prototype.json = "";

        /**
         * WriteJsonFileRequestBody flags.
         * @member {fs.IFileFlags|null|undefined} flags
         * @memberof fs.WriteJsonFileRequestBody
         * @instance
         */
        WriteJsonFileRequestBody.prototype.flags = null;

        /**
         * Creates a new WriteJsonFileRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.WriteJsonFileRequestBody
         * @static
         * @param {fs.IWriteJsonFileRequestBody=} [properties] Properties to set
         * @returns {fs.WriteJsonFileRequestBody} WriteJsonFileRequestBody instance
         */
        WriteJsonFileRequestBody.create = function create(properties) {
            return new WriteJsonFileRequestBody(properties);
        };

        /**
         * Encodes the specified WriteJsonFileRequestBody message. Does not implicitly {@link fs.WriteJsonFileRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.WriteJsonFileRequestBody
         * @static
         * @param {fs.IWriteJsonFileRequestBody} message WriteJsonFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteJsonFileRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.json);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.fs.FileFlags.encode(message.flags, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified WriteJsonFileRequestBody message, length delimited. Does not implicitly {@link fs.WriteJsonFileRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.WriteJsonFileRequestBody
         * @static
         * @param {fs.IWriteJsonFileRequestBody} message WriteJsonFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteJsonFileRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a WriteJsonFileRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.WriteJsonFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.WriteJsonFileRequestBody} WriteJsonFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteJsonFileRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.WriteJsonFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.json = reader.string();
                        break;
                    }
                case 3: {
                        message.flags = $root.fs.FileFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a WriteJsonFileRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.WriteJsonFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.WriteJsonFileRequestBody} WriteJsonFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteJsonFileRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a WriteJsonFileRequestBody message.
         * @function verify
         * @memberof fs.WriteJsonFileRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        WriteJsonFileRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                if (!$util.isString(message.json))
                    return "json: string expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.fs.FileFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a WriteJsonFileRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.WriteJsonFileRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.WriteJsonFileRequestBody} WriteJsonFileRequestBody
         */
        WriteJsonFileRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.WriteJsonFileRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.WriteJsonFileRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.WriteJsonFileRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.json != null)
                message.json = String(object.json);
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.WriteJsonFileRequestBody.flags: object expected");
                message.flags = $root.fs.FileFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a WriteJsonFileRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.WriteJsonFileRequestBody
         * @static
         * @param {fs.WriteJsonFileRequestBody} message WriteJsonFileRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        WriteJsonFileRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.json = "";
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = message.json;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.fs.FileFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this WriteJsonFileRequestBody to JSON.
         * @function toJSON
         * @memberof fs.WriteJsonFileRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        WriteJsonFileRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for WriteJsonFileRequestBody
         * @function getTypeUrl
         * @memberof fs.WriteJsonFileRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        WriteJsonFileRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.WriteJsonFileRequestBody";
        };

        return WriteJsonFileRequestBody;
    })();

    fs.WriteTxtFileRequestBody = (function() {

        /**
         * Properties of a WriteTxtFileRequestBody.
         * @memberof fs
         * @interface IWriteTxtFileRequestBody
         * @property {string|null} [path] WriteTxtFileRequestBody path
         * @property {string|null} [txt] WriteTxtFileRequestBody txt
         * @property {fs.IFileFlags|null} [flags] WriteTxtFileRequestBody flags
         */

        /**
         * Constructs a new WriteTxtFileRequestBody.
         * @memberof fs
         * @classdesc Represents a WriteTxtFileRequestBody.
         * @implements IWriteTxtFileRequestBody
         * @constructor
         * @param {fs.IWriteTxtFileRequestBody=} [properties] Properties to set
         */
        function WriteTxtFileRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * WriteTxtFileRequestBody path.
         * @member {string} path
         * @memberof fs.WriteTxtFileRequestBody
         * @instance
         */
        WriteTxtFileRequestBody.prototype.path = "";

        /**
         * WriteTxtFileRequestBody txt.
         * @member {string} txt
         * @memberof fs.WriteTxtFileRequestBody
         * @instance
         */
        WriteTxtFileRequestBody.prototype.txt = "";

        /**
         * WriteTxtFileRequestBody flags.
         * @member {fs.IFileFlags|null|undefined} flags
         * @memberof fs.WriteTxtFileRequestBody
         * @instance
         */
        WriteTxtFileRequestBody.prototype.flags = null;

        /**
         * Creates a new WriteTxtFileRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.WriteTxtFileRequestBody
         * @static
         * @param {fs.IWriteTxtFileRequestBody=} [properties] Properties to set
         * @returns {fs.WriteTxtFileRequestBody} WriteTxtFileRequestBody instance
         */
        WriteTxtFileRequestBody.create = function create(properties) {
            return new WriteTxtFileRequestBody(properties);
        };

        /**
         * Encodes the specified WriteTxtFileRequestBody message. Does not implicitly {@link fs.WriteTxtFileRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.WriteTxtFileRequestBody
         * @static
         * @param {fs.IWriteTxtFileRequestBody} message WriteTxtFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteTxtFileRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.txt);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.fs.FileFlags.encode(message.flags, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified WriteTxtFileRequestBody message, length delimited. Does not implicitly {@link fs.WriteTxtFileRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.WriteTxtFileRequestBody
         * @static
         * @param {fs.IWriteTxtFileRequestBody} message WriteTxtFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteTxtFileRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a WriteTxtFileRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.WriteTxtFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.WriteTxtFileRequestBody} WriteTxtFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteTxtFileRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.WriteTxtFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.txt = reader.string();
                        break;
                    }
                case 3: {
                        message.flags = $root.fs.FileFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a WriteTxtFileRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.WriteTxtFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.WriteTxtFileRequestBody} WriteTxtFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteTxtFileRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a WriteTxtFileRequestBody message.
         * @function verify
         * @memberof fs.WriteTxtFileRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        WriteTxtFileRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                if (!$util.isString(message.txt))
                    return "txt: string expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.fs.FileFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a WriteTxtFileRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.WriteTxtFileRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.WriteTxtFileRequestBody} WriteTxtFileRequestBody
         */
        WriteTxtFileRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.WriteTxtFileRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.WriteTxtFileRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.WriteTxtFileRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.txt != null)
                message.txt = String(object.txt);
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.WriteTxtFileRequestBody.flags: object expected");
                message.flags = $root.fs.FileFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a WriteTxtFileRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.WriteTxtFileRequestBody
         * @static
         * @param {fs.WriteTxtFileRequestBody} message WriteTxtFileRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        WriteTxtFileRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.txt = "";
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                object.txt = message.txt;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.fs.FileFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this WriteTxtFileRequestBody to JSON.
         * @function toJSON
         * @memberof fs.WriteTxtFileRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        WriteTxtFileRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for WriteTxtFileRequestBody
         * @function getTypeUrl
         * @memberof fs.WriteTxtFileRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        WriteTxtFileRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.WriteTxtFileRequestBody";
        };

        return WriteTxtFileRequestBody;
    })();

    fs.WriteBytesRequestBody = (function() {

        /**
         * Properties of a WriteBytesRequestBody.
         * @memberof fs
         * @interface IWriteBytesRequestBody
         * @property {string|null} [path] WriteBytesRequestBody path
         * @property {Uint8Array|null} [bytes] WriteBytesRequestBody bytes
         * @property {fs.IFileFlags|null} [flags] WriteBytesRequestBody flags
         */

        /**
         * Constructs a new WriteBytesRequestBody.
         * @memberof fs
         * @classdesc Represents a WriteBytesRequestBody.
         * @implements IWriteBytesRequestBody
         * @constructor
         * @param {fs.IWriteBytesRequestBody=} [properties] Properties to set
         */
        function WriteBytesRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * WriteBytesRequestBody path.
         * @member {string} path
         * @memberof fs.WriteBytesRequestBody
         * @instance
         */
        WriteBytesRequestBody.prototype.path = "";

        /**
         * WriteBytesRequestBody bytes.
         * @member {Uint8Array} bytes
         * @memberof fs.WriteBytesRequestBody
         * @instance
         */
        WriteBytesRequestBody.prototype.bytes = $util.newBuffer([]);

        /**
         * WriteBytesRequestBody flags.
         * @member {fs.IFileFlags|null|undefined} flags
         * @memberof fs.WriteBytesRequestBody
         * @instance
         */
        WriteBytesRequestBody.prototype.flags = null;

        /**
         * Creates a new WriteBytesRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.WriteBytesRequestBody
         * @static
         * @param {fs.IWriteBytesRequestBody=} [properties] Properties to set
         * @returns {fs.WriteBytesRequestBody} WriteBytesRequestBody instance
         */
        WriteBytesRequestBody.create = function create(properties) {
            return new WriteBytesRequestBody(properties);
        };

        /**
         * Encodes the specified WriteBytesRequestBody message. Does not implicitly {@link fs.WriteBytesRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.WriteBytesRequestBody
         * @static
         * @param {fs.IWriteBytesRequestBody} message WriteBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteBytesRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.bytes);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.fs.FileFlags.encode(message.flags, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified WriteBytesRequestBody message, length delimited. Does not implicitly {@link fs.WriteBytesRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.WriteBytesRequestBody
         * @static
         * @param {fs.IWriteBytesRequestBody} message WriteBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        WriteBytesRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a WriteBytesRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.WriteBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.WriteBytesRequestBody} WriteBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteBytesRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.WriteBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.bytes = reader.bytes();
                        break;
                    }
                case 3: {
                        message.flags = $root.fs.FileFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a WriteBytesRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.WriteBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.WriteBytesRequestBody} WriteBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        WriteBytesRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a WriteBytesRequestBody message.
         * @function verify
         * @memberof fs.WriteBytesRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        WriteBytesRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                if (!(message.bytes && typeof message.bytes.length === "number" || $util.isString(message.bytes)))
                    return "bytes: buffer expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.fs.FileFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a WriteBytesRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.WriteBytesRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.WriteBytesRequestBody} WriteBytesRequestBody
         */
        WriteBytesRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.WriteBytesRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.WriteBytesRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.WriteBytesRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.bytes != null)
                if (typeof object.bytes === "string")
                    $util.base64.decode(object.bytes, message.bytes = $util.newBuffer($util.base64.length(object.bytes)), 0);
                else if (object.bytes.length >= 0)
                    message.bytes = object.bytes;
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.WriteBytesRequestBody.flags: object expected");
                message.flags = $root.fs.FileFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a WriteBytesRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.WriteBytesRequestBody
         * @static
         * @param {fs.WriteBytesRequestBody} message WriteBytesRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        WriteBytesRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                if (options.bytes === String)
                    object.bytes = "";
                else {
                    object.bytes = [];
                    if (options.bytes !== Array)
                        object.bytes = $util.newBuffer(object.bytes);
                }
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = options.bytes === String ? $util.base64.encode(message.bytes, 0, message.bytes.length) : options.bytes === Array ? Array.prototype.slice.call(message.bytes) : message.bytes;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.fs.FileFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this WriteBytesRequestBody to JSON.
         * @function toJSON
         * @memberof fs.WriteBytesRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        WriteBytesRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for WriteBytesRequestBody
         * @function getTypeUrl
         * @memberof fs.WriteBytesRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        WriteBytesRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.WriteBytesRequestBody";
        };

        return WriteBytesRequestBody;
    })();

    fs.VersionedWriteJsonFileRequestBody = (function() {

        /**
         * Properties of a VersionedWriteJsonFileRequestBody.
         * @memberof fs
         * @interface IVersionedWriteJsonFileRequestBody
         * @property {string|null} [path] VersionedWriteJsonFileRequestBody path
         * @property {string|null} [json] VersionedWriteJsonFileRequestBody json
         * @property {fs.IVersionedFileWriteFlags|null} [flags] VersionedWriteJsonFileRequestBody flags
         */

        /**
         * Constructs a new VersionedWriteJsonFileRequestBody.
         * @memberof fs
         * @classdesc Represents a VersionedWriteJsonFileRequestBody.
         * @implements IVersionedWriteJsonFileRequestBody
         * @constructor
         * @param {fs.IVersionedWriteJsonFileRequestBody=} [properties] Properties to set
         */
        function VersionedWriteJsonFileRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedWriteJsonFileRequestBody path.
         * @member {string} path
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @instance
         */
        VersionedWriteJsonFileRequestBody.prototype.path = "";

        /**
         * VersionedWriteJsonFileRequestBody json.
         * @member {string} json
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @instance
         */
        VersionedWriteJsonFileRequestBody.prototype.json = "";

        /**
         * VersionedWriteJsonFileRequestBody flags.
         * @member {fs.IVersionedFileWriteFlags|null|undefined} flags
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @instance
         */
        VersionedWriteJsonFileRequestBody.prototype.flags = null;

        /**
         * Creates a new VersionedWriteJsonFileRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @static
         * @param {fs.IVersionedWriteJsonFileRequestBody=} [properties] Properties to set
         * @returns {fs.VersionedWriteJsonFileRequestBody} VersionedWriteJsonFileRequestBody instance
         */
        VersionedWriteJsonFileRequestBody.create = function create(properties) {
            return new VersionedWriteJsonFileRequestBody(properties);
        };

        /**
         * Encodes the specified VersionedWriteJsonFileRequestBody message. Does not implicitly {@link fs.VersionedWriteJsonFileRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @static
         * @param {fs.IVersionedWriteJsonFileRequestBody} message VersionedWriteJsonFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedWriteJsonFileRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.json);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.fs.VersionedFileWriteFlags.encode(message.flags, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedWriteJsonFileRequestBody message, length delimited. Does not implicitly {@link fs.VersionedWriteJsonFileRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @static
         * @param {fs.IVersionedWriteJsonFileRequestBody} message VersionedWriteJsonFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedWriteJsonFileRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedWriteJsonFileRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.VersionedWriteJsonFileRequestBody} VersionedWriteJsonFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedWriteJsonFileRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedWriteJsonFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.json = reader.string();
                        break;
                    }
                case 3: {
                        message.flags = $root.fs.VersionedFileWriteFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedWriteJsonFileRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.VersionedWriteJsonFileRequestBody} VersionedWriteJsonFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedWriteJsonFileRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedWriteJsonFileRequestBody message.
         * @function verify
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedWriteJsonFileRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                if (!$util.isString(message.json))
                    return "json: string expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.fs.VersionedFileWriteFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedWriteJsonFileRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.VersionedWriteJsonFileRequestBody} VersionedWriteJsonFileRequestBody
         */
        VersionedWriteJsonFileRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.VersionedWriteJsonFileRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.VersionedWriteJsonFileRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.VersionedWriteJsonFileRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.json != null)
                message.json = String(object.json);
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.VersionedWriteJsonFileRequestBody.flags: object expected");
                message.flags = $root.fs.VersionedFileWriteFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedWriteJsonFileRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @static
         * @param {fs.VersionedWriteJsonFileRequestBody} message VersionedWriteJsonFileRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedWriteJsonFileRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.json = "";
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = message.json;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.fs.VersionedFileWriteFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedWriteJsonFileRequestBody to JSON.
         * @function toJSON
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedWriteJsonFileRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedWriteJsonFileRequestBody
         * @function getTypeUrl
         * @memberof fs.VersionedWriteJsonFileRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedWriteJsonFileRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.VersionedWriteJsonFileRequestBody";
        };

        return VersionedWriteJsonFileRequestBody;
    })();

    fs.VersionedFileWriteFlags = (function() {

        /**
         * Properties of a VersionedFileWriteFlags.
         * @memberof fs
         * @interface IVersionedFileWriteFlags
         * @property {common.IBooleanValue|null} [truncate] VersionedFileWriteFlags truncate
         * @property {common.IBooleanValue|null} [create] VersionedFileWriteFlags create
         * @property {common.IBooleanValue|null} [exclusive] VersionedFileWriteFlags exclusive
         * @property {common.IUInt64Value|null} [currentVersion] VersionedFileWriteFlags currentVersion
         */

        /**
         * Constructs a new VersionedFileWriteFlags.
         * @memberof fs
         * @classdesc Represents a VersionedFileWriteFlags.
         * @implements IVersionedFileWriteFlags
         * @constructor
         * @param {fs.IVersionedFileWriteFlags=} [properties] Properties to set
         */
        function VersionedFileWriteFlags(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedFileWriteFlags truncate.
         * @member {common.IBooleanValue|null|undefined} truncate
         * @memberof fs.VersionedFileWriteFlags
         * @instance
         */
        VersionedFileWriteFlags.prototype.truncate = null;

        /**
         * VersionedFileWriteFlags create.
         * @member {common.IBooleanValue|null|undefined} create
         * @memberof fs.VersionedFileWriteFlags
         * @instance
         */
        VersionedFileWriteFlags.prototype.create = null;

        /**
         * VersionedFileWriteFlags exclusive.
         * @member {common.IBooleanValue|null|undefined} exclusive
         * @memberof fs.VersionedFileWriteFlags
         * @instance
         */
        VersionedFileWriteFlags.prototype.exclusive = null;

        /**
         * VersionedFileWriteFlags currentVersion.
         * @member {common.IUInt64Value|null|undefined} currentVersion
         * @memberof fs.VersionedFileWriteFlags
         * @instance
         */
        VersionedFileWriteFlags.prototype.currentVersion = null;

        /**
         * Creates a new VersionedFileWriteFlags instance using the specified properties.
         * @function create
         * @memberof fs.VersionedFileWriteFlags
         * @static
         * @param {fs.IVersionedFileWriteFlags=} [properties] Properties to set
         * @returns {fs.VersionedFileWriteFlags} VersionedFileWriteFlags instance
         */
        VersionedFileWriteFlags.create = function create(properties) {
            return new VersionedFileWriteFlags(properties);
        };

        /**
         * Encodes the specified VersionedFileWriteFlags message. Does not implicitly {@link fs.VersionedFileWriteFlags.verify|verify} messages.
         * @function encode
         * @memberof fs.VersionedFileWriteFlags
         * @static
         * @param {fs.IVersionedFileWriteFlags} message VersionedFileWriteFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedFileWriteFlags.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.truncate != null && Object.hasOwnProperty.call(message, "truncate"))
                $root.common.BooleanValue.encode(message.truncate, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.create != null && Object.hasOwnProperty.call(message, "create"))
                $root.common.BooleanValue.encode(message.create, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive"))
                $root.common.BooleanValue.encode(message.exclusive, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                $root.common.UInt64Value.encode(message.currentVersion, writer.uint32(/* id 10, wireType 2 =*/82).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedFileWriteFlags message, length delimited. Does not implicitly {@link fs.VersionedFileWriteFlags.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.VersionedFileWriteFlags
         * @static
         * @param {fs.IVersionedFileWriteFlags} message VersionedFileWriteFlags message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedFileWriteFlags.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedFileWriteFlags message from the specified reader or buffer.
         * @function decode
         * @memberof fs.VersionedFileWriteFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.VersionedFileWriteFlags} VersionedFileWriteFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedFileWriteFlags.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedFileWriteFlags();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.truncate = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.create = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.exclusive = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 10: {
                        message.currentVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedFileWriteFlags message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.VersionedFileWriteFlags
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.VersionedFileWriteFlags} VersionedFileWriteFlags
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedFileWriteFlags.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedFileWriteFlags message.
         * @function verify
         * @memberof fs.VersionedFileWriteFlags
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedFileWriteFlags.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.truncate != null && Object.hasOwnProperty.call(message, "truncate")) {
                var error = $root.common.BooleanValue.verify(message.truncate, long + 1);
                if (error)
                    return "truncate." + error;
            }
            if (message.create != null && Object.hasOwnProperty.call(message, "create")) {
                var error = $root.common.BooleanValue.verify(message.create, long + 1);
                if (error)
                    return "create." + error;
            }
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive")) {
                var error = $root.common.BooleanValue.verify(message.exclusive, long + 1);
                if (error)
                    return "exclusive." + error;
            }
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion")) {
                var error = $root.common.UInt64Value.verify(message.currentVersion, long + 1);
                if (error)
                    return "currentVersion." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedFileWriteFlags message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.VersionedFileWriteFlags
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.VersionedFileWriteFlags} VersionedFileWriteFlags
         */
        VersionedFileWriteFlags.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.VersionedFileWriteFlags)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.VersionedFileWriteFlags: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.VersionedFileWriteFlags();
            if (object.truncate != null) {
                if (!$util.isObject(object.truncate))
                    throw TypeError(".fs.VersionedFileWriteFlags.truncate: object expected");
                message.truncate = $root.common.BooleanValue.fromObject(object.truncate, long + 1);
            }
            if (object.create != null) {
                if (!$util.isObject(object.create))
                    throw TypeError(".fs.VersionedFileWriteFlags.create: object expected");
                message.create = $root.common.BooleanValue.fromObject(object.create, long + 1);
            }
            if (object.exclusive != null) {
                if (!$util.isObject(object.exclusive))
                    throw TypeError(".fs.VersionedFileWriteFlags.exclusive: object expected");
                message.exclusive = $root.common.BooleanValue.fromObject(object.exclusive, long + 1);
            }
            if (object.currentVersion != null) {
                if (!$util.isObject(object.currentVersion))
                    throw TypeError(".fs.VersionedFileWriteFlags.currentVersion: object expected");
                message.currentVersion = $root.common.UInt64Value.fromObject(object.currentVersion, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedFileWriteFlags message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.VersionedFileWriteFlags
         * @static
         * @param {fs.VersionedFileWriteFlags} message VersionedFileWriteFlags
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedFileWriteFlags.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.truncate = null;
                object.create = null;
                object.exclusive = null;
                object.currentVersion = null;
            }
            if (message.truncate != null && Object.hasOwnProperty.call(message, "truncate"))
                object.truncate = $root.common.BooleanValue.toObject(message.truncate, options, q + 1);
            if (message.create != null && Object.hasOwnProperty.call(message, "create"))
                object.create = $root.common.BooleanValue.toObject(message.create, options, q + 1);
            if (message.exclusive != null && Object.hasOwnProperty.call(message, "exclusive"))
                object.exclusive = $root.common.BooleanValue.toObject(message.exclusive, options, q + 1);
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                object.currentVersion = $root.common.UInt64Value.toObject(message.currentVersion, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedFileWriteFlags to JSON.
         * @function toJSON
         * @memberof fs.VersionedFileWriteFlags
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedFileWriteFlags.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedFileWriteFlags
         * @function getTypeUrl
         * @memberof fs.VersionedFileWriteFlags
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedFileWriteFlags.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.VersionedFileWriteFlags";
        };

        return VersionedFileWriteFlags;
    })();

    fs.VersionedWriteTxtFileRequestBody = (function() {

        /**
         * Properties of a VersionedWriteTxtFileRequestBody.
         * @memberof fs
         * @interface IVersionedWriteTxtFileRequestBody
         * @property {string|null} [path] VersionedWriteTxtFileRequestBody path
         * @property {string|null} [txt] VersionedWriteTxtFileRequestBody txt
         * @property {fs.IVersionedFileWriteFlags|null} [flags] VersionedWriteTxtFileRequestBody flags
         */

        /**
         * Constructs a new VersionedWriteTxtFileRequestBody.
         * @memberof fs
         * @classdesc Represents a VersionedWriteTxtFileRequestBody.
         * @implements IVersionedWriteTxtFileRequestBody
         * @constructor
         * @param {fs.IVersionedWriteTxtFileRequestBody=} [properties] Properties to set
         */
        function VersionedWriteTxtFileRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedWriteTxtFileRequestBody path.
         * @member {string} path
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @instance
         */
        VersionedWriteTxtFileRequestBody.prototype.path = "";

        /**
         * VersionedWriteTxtFileRequestBody txt.
         * @member {string} txt
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @instance
         */
        VersionedWriteTxtFileRequestBody.prototype.txt = "";

        /**
         * VersionedWriteTxtFileRequestBody flags.
         * @member {fs.IVersionedFileWriteFlags|null|undefined} flags
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @instance
         */
        VersionedWriteTxtFileRequestBody.prototype.flags = null;

        /**
         * Creates a new VersionedWriteTxtFileRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @static
         * @param {fs.IVersionedWriteTxtFileRequestBody=} [properties] Properties to set
         * @returns {fs.VersionedWriteTxtFileRequestBody} VersionedWriteTxtFileRequestBody instance
         */
        VersionedWriteTxtFileRequestBody.create = function create(properties) {
            return new VersionedWriteTxtFileRequestBody(properties);
        };

        /**
         * Encodes the specified VersionedWriteTxtFileRequestBody message. Does not implicitly {@link fs.VersionedWriteTxtFileRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @static
         * @param {fs.IVersionedWriteTxtFileRequestBody} message VersionedWriteTxtFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedWriteTxtFileRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.txt);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.fs.VersionedFileWriteFlags.encode(message.flags, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedWriteTxtFileRequestBody message, length delimited. Does not implicitly {@link fs.VersionedWriteTxtFileRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @static
         * @param {fs.IVersionedWriteTxtFileRequestBody} message VersionedWriteTxtFileRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedWriteTxtFileRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedWriteTxtFileRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.VersionedWriteTxtFileRequestBody} VersionedWriteTxtFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedWriteTxtFileRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedWriteTxtFileRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.txt = reader.string();
                        break;
                    }
                case 3: {
                        message.flags = $root.fs.VersionedFileWriteFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedWriteTxtFileRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.VersionedWriteTxtFileRequestBody} VersionedWriteTxtFileRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedWriteTxtFileRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedWriteTxtFileRequestBody message.
         * @function verify
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedWriteTxtFileRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                if (!$util.isString(message.txt))
                    return "txt: string expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.fs.VersionedFileWriteFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedWriteTxtFileRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.VersionedWriteTxtFileRequestBody} VersionedWriteTxtFileRequestBody
         */
        VersionedWriteTxtFileRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.VersionedWriteTxtFileRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.VersionedWriteTxtFileRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.VersionedWriteTxtFileRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.txt != null)
                message.txt = String(object.txt);
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.VersionedWriteTxtFileRequestBody.flags: object expected");
                message.flags = $root.fs.VersionedFileWriteFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedWriteTxtFileRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @static
         * @param {fs.VersionedWriteTxtFileRequestBody} message VersionedWriteTxtFileRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedWriteTxtFileRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.txt = "";
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.txt != null && Object.hasOwnProperty.call(message, "txt"))
                object.txt = message.txt;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.fs.VersionedFileWriteFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedWriteTxtFileRequestBody to JSON.
         * @function toJSON
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedWriteTxtFileRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedWriteTxtFileRequestBody
         * @function getTypeUrl
         * @memberof fs.VersionedWriteTxtFileRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedWriteTxtFileRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.VersionedWriteTxtFileRequestBody";
        };

        return VersionedWriteTxtFileRequestBody;
    })();

    fs.VersionedWriteBytesRequestBody = (function() {

        /**
         * Properties of a VersionedWriteBytesRequestBody.
         * @memberof fs
         * @interface IVersionedWriteBytesRequestBody
         * @property {string|null} [path] VersionedWriteBytesRequestBody path
         * @property {Uint8Array|null} [bytes] VersionedWriteBytesRequestBody bytes
         * @property {fs.IVersionedFileWriteFlags|null} [flags] VersionedWriteBytesRequestBody flags
         */

        /**
         * Constructs a new VersionedWriteBytesRequestBody.
         * @memberof fs
         * @classdesc Represents a VersionedWriteBytesRequestBody.
         * @implements IVersionedWriteBytesRequestBody
         * @constructor
         * @param {fs.IVersionedWriteBytesRequestBody=} [properties] Properties to set
         */
        function VersionedWriteBytesRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedWriteBytesRequestBody path.
         * @member {string} path
         * @memberof fs.VersionedWriteBytesRequestBody
         * @instance
         */
        VersionedWriteBytesRequestBody.prototype.path = "";

        /**
         * VersionedWriteBytesRequestBody bytes.
         * @member {Uint8Array} bytes
         * @memberof fs.VersionedWriteBytesRequestBody
         * @instance
         */
        VersionedWriteBytesRequestBody.prototype.bytes = $util.newBuffer([]);

        /**
         * VersionedWriteBytesRequestBody flags.
         * @member {fs.IVersionedFileWriteFlags|null|undefined} flags
         * @memberof fs.VersionedWriteBytesRequestBody
         * @instance
         */
        VersionedWriteBytesRequestBody.prototype.flags = null;

        /**
         * Creates a new VersionedWriteBytesRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.VersionedWriteBytesRequestBody
         * @static
         * @param {fs.IVersionedWriteBytesRequestBody=} [properties] Properties to set
         * @returns {fs.VersionedWriteBytesRequestBody} VersionedWriteBytesRequestBody instance
         */
        VersionedWriteBytesRequestBody.create = function create(properties) {
            return new VersionedWriteBytesRequestBody(properties);
        };

        /**
         * Encodes the specified VersionedWriteBytesRequestBody message. Does not implicitly {@link fs.VersionedWriteBytesRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.VersionedWriteBytesRequestBody
         * @static
         * @param {fs.IVersionedWriteBytesRequestBody} message VersionedWriteBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedWriteBytesRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.bytes);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.fs.VersionedFileWriteFlags.encode(message.flags, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedWriteBytesRequestBody message, length delimited. Does not implicitly {@link fs.VersionedWriteBytesRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.VersionedWriteBytesRequestBody
         * @static
         * @param {fs.IVersionedWriteBytesRequestBody} message VersionedWriteBytesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedWriteBytesRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedWriteBytesRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.VersionedWriteBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.VersionedWriteBytesRequestBody} VersionedWriteBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedWriteBytesRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedWriteBytesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.bytes = reader.bytes();
                        break;
                    }
                case 3: {
                        message.flags = $root.fs.VersionedFileWriteFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedWriteBytesRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.VersionedWriteBytesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.VersionedWriteBytesRequestBody} VersionedWriteBytesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedWriteBytesRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedWriteBytesRequestBody message.
         * @function verify
         * @memberof fs.VersionedWriteBytesRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedWriteBytesRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                if (!(message.bytes && typeof message.bytes.length === "number" || $util.isString(message.bytes)))
                    return "bytes: buffer expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.fs.VersionedFileWriteFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedWriteBytesRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.VersionedWriteBytesRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.VersionedWriteBytesRequestBody} VersionedWriteBytesRequestBody
         */
        VersionedWriteBytesRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.VersionedWriteBytesRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.VersionedWriteBytesRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.VersionedWriteBytesRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.bytes != null)
                if (typeof object.bytes === "string")
                    $util.base64.decode(object.bytes, message.bytes = $util.newBuffer($util.base64.length(object.bytes)), 0);
                else if (object.bytes.length >= 0)
                    message.bytes = object.bytes;
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.VersionedWriteBytesRequestBody.flags: object expected");
                message.flags = $root.fs.VersionedFileWriteFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedWriteBytesRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.VersionedWriteBytesRequestBody
         * @static
         * @param {fs.VersionedWriteBytesRequestBody} message VersionedWriteBytesRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedWriteBytesRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                if (options.bytes === String)
                    object.bytes = "";
                else {
                    object.bytes = [];
                    if (options.bytes !== Array)
                        object.bytes = $util.newBuffer(object.bytes);
                }
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = options.bytes === String ? $util.base64.encode(message.bytes, 0, message.bytes.length) : options.bytes === Array ? Array.prototype.slice.call(message.bytes) : message.bytes;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.fs.VersionedFileWriteFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedWriteBytesRequestBody to JSON.
         * @function toJSON
         * @memberof fs.VersionedWriteBytesRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedWriteBytesRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedWriteBytesRequestBody
         * @function getTypeUrl
         * @memberof fs.VersionedWriteBytesRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedWriteBytesRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.VersionedWriteBytesRequestBody";
        };

        return VersionedWriteBytesRequestBody;
    })();

    fs.VersionedGetByteSinkRequestBody = (function() {

        /**
         * Properties of a VersionedGetByteSinkRequestBody.
         * @memberof fs
         * @interface IVersionedGetByteSinkRequestBody
         * @property {string|null} [path] VersionedGetByteSinkRequestBody path
         * @property {fs.IVersionedFileWriteFlags|null} [flags] VersionedGetByteSinkRequestBody flags
         */

        /**
         * Constructs a new VersionedGetByteSinkRequestBody.
         * @memberof fs
         * @classdesc Represents a VersionedGetByteSinkRequestBody.
         * @implements IVersionedGetByteSinkRequestBody
         * @constructor
         * @param {fs.IVersionedGetByteSinkRequestBody=} [properties] Properties to set
         */
        function VersionedGetByteSinkRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * VersionedGetByteSinkRequestBody path.
         * @member {string} path
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @instance
         */
        VersionedGetByteSinkRequestBody.prototype.path = "";

        /**
         * VersionedGetByteSinkRequestBody flags.
         * @member {fs.IVersionedFileWriteFlags|null|undefined} flags
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @instance
         */
        VersionedGetByteSinkRequestBody.prototype.flags = null;

        /**
         * Creates a new VersionedGetByteSinkRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @static
         * @param {fs.IVersionedGetByteSinkRequestBody=} [properties] Properties to set
         * @returns {fs.VersionedGetByteSinkRequestBody} VersionedGetByteSinkRequestBody instance
         */
        VersionedGetByteSinkRequestBody.create = function create(properties) {
            return new VersionedGetByteSinkRequestBody(properties);
        };

        /**
         * Encodes the specified VersionedGetByteSinkRequestBody message. Does not implicitly {@link fs.VersionedGetByteSinkRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @static
         * @param {fs.IVersionedGetByteSinkRequestBody} message VersionedGetByteSinkRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetByteSinkRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                $root.fs.VersionedFileWriteFlags.encode(message.flags, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified VersionedGetByteSinkRequestBody message, length delimited. Does not implicitly {@link fs.VersionedGetByteSinkRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @static
         * @param {fs.IVersionedGetByteSinkRequestBody} message VersionedGetByteSinkRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        VersionedGetByteSinkRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a VersionedGetByteSinkRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.VersionedGetByteSinkRequestBody} VersionedGetByteSinkRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetByteSinkRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.VersionedGetByteSinkRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.flags = $root.fs.VersionedFileWriteFlags.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a VersionedGetByteSinkRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.VersionedGetByteSinkRequestBody} VersionedGetByteSinkRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        VersionedGetByteSinkRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a VersionedGetByteSinkRequestBody message.
         * @function verify
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        VersionedGetByteSinkRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags")) {
                var error = $root.fs.VersionedFileWriteFlags.verify(message.flags, long + 1);
                if (error)
                    return "flags." + error;
            }
            return null;
        };

        /**
         * Creates a VersionedGetByteSinkRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.VersionedGetByteSinkRequestBody} VersionedGetByteSinkRequestBody
         */
        VersionedGetByteSinkRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.VersionedGetByteSinkRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.VersionedGetByteSinkRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.VersionedGetByteSinkRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.flags != null) {
                if (!$util.isObject(object.flags))
                    throw TypeError(".fs.VersionedGetByteSinkRequestBody.flags: object expected");
                message.flags = $root.fs.VersionedFileWriteFlags.fromObject(object.flags, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a VersionedGetByteSinkRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @static
         * @param {fs.VersionedGetByteSinkRequestBody} message VersionedGetByteSinkRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        VersionedGetByteSinkRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.flags = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.flags != null && Object.hasOwnProperty.call(message, "flags"))
                object.flags = $root.fs.VersionedFileWriteFlags.toObject(message.flags, options, q + 1);
            return object;
        };

        /**
         * Converts this VersionedGetByteSinkRequestBody to JSON.
         * @function toJSON
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        VersionedGetByteSinkRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for VersionedGetByteSinkRequestBody
         * @function getTypeUrl
         * @memberof fs.VersionedGetByteSinkRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        VersionedGetByteSinkRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.VersionedGetByteSinkRequestBody";
        };

        return VersionedGetByteSinkRequestBody;
    })();

    fs.ArchiveCurrentRequestBody = (function() {

        /**
         * Properties of an ArchiveCurrentRequestBody.
         * @memberof fs
         * @interface IArchiveCurrentRequestBody
         * @property {string|null} [path] ArchiveCurrentRequestBody path
         * @property {common.IUInt64Value|null} [version] ArchiveCurrentRequestBody version
         */

        /**
         * Constructs a new ArchiveCurrentRequestBody.
         * @memberof fs
         * @classdesc Represents an ArchiveCurrentRequestBody.
         * @implements IArchiveCurrentRequestBody
         * @constructor
         * @param {fs.IArchiveCurrentRequestBody=} [properties] Properties to set
         */
        function ArchiveCurrentRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ArchiveCurrentRequestBody path.
         * @member {string} path
         * @memberof fs.ArchiveCurrentRequestBody
         * @instance
         */
        ArchiveCurrentRequestBody.prototype.path = "";

        /**
         * ArchiveCurrentRequestBody version.
         * @member {common.IUInt64Value|null|undefined} version
         * @memberof fs.ArchiveCurrentRequestBody
         * @instance
         */
        ArchiveCurrentRequestBody.prototype.version = null;

        /**
         * Creates a new ArchiveCurrentRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.ArchiveCurrentRequestBody
         * @static
         * @param {fs.IArchiveCurrentRequestBody=} [properties] Properties to set
         * @returns {fs.ArchiveCurrentRequestBody} ArchiveCurrentRequestBody instance
         */
        ArchiveCurrentRequestBody.create = function create(properties) {
            return new ArchiveCurrentRequestBody(properties);
        };

        /**
         * Encodes the specified ArchiveCurrentRequestBody message. Does not implicitly {@link fs.ArchiveCurrentRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.ArchiveCurrentRequestBody
         * @static
         * @param {fs.IArchiveCurrentRequestBody} message ArchiveCurrentRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ArchiveCurrentRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                $root.common.UInt64Value.encode(message.version, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified ArchiveCurrentRequestBody message, length delimited. Does not implicitly {@link fs.ArchiveCurrentRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.ArchiveCurrentRequestBody
         * @static
         * @param {fs.IArchiveCurrentRequestBody} message ArchiveCurrentRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ArchiveCurrentRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an ArchiveCurrentRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.ArchiveCurrentRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.ArchiveCurrentRequestBody} ArchiveCurrentRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ArchiveCurrentRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.ArchiveCurrentRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.version = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an ArchiveCurrentRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.ArchiveCurrentRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.ArchiveCurrentRequestBody} ArchiveCurrentRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ArchiveCurrentRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an ArchiveCurrentRequestBody message.
         * @function verify
         * @memberof fs.ArchiveCurrentRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ArchiveCurrentRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.version != null && Object.hasOwnProperty.call(message, "version")) {
                var error = $root.common.UInt64Value.verify(message.version, long + 1);
                if (error)
                    return "version." + error;
            }
            return null;
        };

        /**
         * Creates an ArchiveCurrentRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.ArchiveCurrentRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.ArchiveCurrentRequestBody} ArchiveCurrentRequestBody
         */
        ArchiveCurrentRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.ArchiveCurrentRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.ArchiveCurrentRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.ArchiveCurrentRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.version != null) {
                if (!$util.isObject(object.version))
                    throw TypeError(".fs.ArchiveCurrentRequestBody.version: object expected");
                message.version = $root.common.UInt64Value.fromObject(object.version, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an ArchiveCurrentRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.ArchiveCurrentRequestBody
         * @static
         * @param {fs.ArchiveCurrentRequestBody} message ArchiveCurrentRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ArchiveCurrentRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.version = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                object.version = $root.common.UInt64Value.toObject(message.version, options, q + 1);
            return object;
        };

        /**
         * Converts this ArchiveCurrentRequestBody to JSON.
         * @function toJSON
         * @memberof fs.ArchiveCurrentRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ArchiveCurrentRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ArchiveCurrentRequestBody
         * @function getTypeUrl
         * @memberof fs.ArchiveCurrentRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ArchiveCurrentRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.ArchiveCurrentRequestBody";
        };

        return ArchiveCurrentRequestBody;
    })();

    fs.FSSyncStatusRequestBody = (function() {

        /**
         * Properties of a FSSyncStatusRequestBody.
         * @memberof fs
         * @interface IFSSyncStatusRequestBody
         * @property {string|null} [path] FSSyncStatusRequestBody path
         * @property {boolean|null} [skipServerCheck] FSSyncStatusRequestBody skipServerCheck
         */

        /**
         * Constructs a new FSSyncStatusRequestBody.
         * @memberof fs
         * @classdesc Represents a FSSyncStatusRequestBody.
         * @implements IFSSyncStatusRequestBody
         * @constructor
         * @param {fs.IFSSyncStatusRequestBody=} [properties] Properties to set
         */
        function FSSyncStatusRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FSSyncStatusRequestBody path.
         * @member {string} path
         * @memberof fs.FSSyncStatusRequestBody
         * @instance
         */
        FSSyncStatusRequestBody.prototype.path = "";

        /**
         * FSSyncStatusRequestBody skipServerCheck.
         * @member {boolean} skipServerCheck
         * @memberof fs.FSSyncStatusRequestBody
         * @instance
         */
        FSSyncStatusRequestBody.prototype.skipServerCheck = false;

        /**
         * Creates a new FSSyncStatusRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.FSSyncStatusRequestBody
         * @static
         * @param {fs.IFSSyncStatusRequestBody=} [properties] Properties to set
         * @returns {fs.FSSyncStatusRequestBody} FSSyncStatusRequestBody instance
         */
        FSSyncStatusRequestBody.create = function create(properties) {
            return new FSSyncStatusRequestBody(properties);
        };

        /**
         * Encodes the specified FSSyncStatusRequestBody message. Does not implicitly {@link fs.FSSyncStatusRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.FSSyncStatusRequestBody
         * @static
         * @param {fs.IFSSyncStatusRequestBody} message FSSyncStatusRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncStatusRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.skipServerCheck != null && Object.hasOwnProperty.call(message, "skipServerCheck"))
                writer.uint32(/* id 2, wireType 0 =*/16).bool(message.skipServerCheck);
            return writer;
        };

        /**
         * Encodes the specified FSSyncStatusRequestBody message, length delimited. Does not implicitly {@link fs.FSSyncStatusRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FSSyncStatusRequestBody
         * @static
         * @param {fs.IFSSyncStatusRequestBody} message FSSyncStatusRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncStatusRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FSSyncStatusRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FSSyncStatusRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FSSyncStatusRequestBody} FSSyncStatusRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSSyncStatusRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSSyncStatusRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.skipServerCheck = reader.bool();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FSSyncStatusRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FSSyncStatusRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FSSyncStatusRequestBody} FSSyncStatusRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSSyncStatusRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FSSyncStatusRequestBody message.
         * @function verify
         * @memberof fs.FSSyncStatusRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSSyncStatusRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.skipServerCheck != null && Object.hasOwnProperty.call(message, "skipServerCheck"))
                if (typeof message.skipServerCheck !== "boolean")
                    return "skipServerCheck: boolean expected";
            return null;
        };

        /**
         * Creates a FSSyncStatusRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSSyncStatusRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSSyncStatusRequestBody} FSSyncStatusRequestBody
         */
        FSSyncStatusRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FSSyncStatusRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FSSyncStatusRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FSSyncStatusRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.skipServerCheck != null)
                message.skipServerCheck = Boolean(object.skipServerCheck);
            return message;
        };

        /**
         * Creates a plain object from a FSSyncStatusRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSSyncStatusRequestBody
         * @static
         * @param {fs.FSSyncStatusRequestBody} message FSSyncStatusRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSSyncStatusRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.skipServerCheck = false;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.skipServerCheck != null && Object.hasOwnProperty.call(message, "skipServerCheck"))
                object.skipServerCheck = message.skipServerCheck;
            return object;
        };

        /**
         * Converts this FSSyncStatusRequestBody to JSON.
         * @function toJSON
         * @memberof fs.FSSyncStatusRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FSSyncStatusRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FSSyncStatusRequestBody
         * @function getTypeUrl
         * @memberof fs.FSSyncStatusRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FSSyncStatusRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FSSyncStatusRequestBody";
        };

        return FSSyncStatusRequestBody;
    })();

    fs.FSSyncIsOnDiskRequestBody = (function() {

        /**
         * Properties of a FSSyncIsOnDiskRequestBody.
         * @memberof fs
         * @interface IFSSyncIsOnDiskRequestBody
         * @property {string|null} [path] FSSyncIsOnDiskRequestBody path
         * @property {number|Long|null} [version] FSSyncIsOnDiskRequestBody version
         */

        /**
         * Constructs a new FSSyncIsOnDiskRequestBody.
         * @memberof fs
         * @classdesc Represents a FSSyncIsOnDiskRequestBody.
         * @implements IFSSyncIsOnDiskRequestBody
         * @constructor
         * @param {fs.IFSSyncIsOnDiskRequestBody=} [properties] Properties to set
         */
        function FSSyncIsOnDiskRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FSSyncIsOnDiskRequestBody path.
         * @member {string} path
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @instance
         */
        FSSyncIsOnDiskRequestBody.prototype.path = "";

        /**
         * FSSyncIsOnDiskRequestBody version.
         * @member {number|Long} version
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @instance
         */
        FSSyncIsOnDiskRequestBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new FSSyncIsOnDiskRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @static
         * @param {fs.IFSSyncIsOnDiskRequestBody=} [properties] Properties to set
         * @returns {fs.FSSyncIsOnDiskRequestBody} FSSyncIsOnDiskRequestBody instance
         */
        FSSyncIsOnDiskRequestBody.create = function create(properties) {
            return new FSSyncIsOnDiskRequestBody(properties);
        };

        /**
         * Encodes the specified FSSyncIsOnDiskRequestBody message. Does not implicitly {@link fs.FSSyncIsOnDiskRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @static
         * @param {fs.IFSSyncIsOnDiskRequestBody} message FSSyncIsOnDiskRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncIsOnDiskRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.version);
            return writer;
        };

        /**
         * Encodes the specified FSSyncIsOnDiskRequestBody message, length delimited. Does not implicitly {@link fs.FSSyncIsOnDiskRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @static
         * @param {fs.IFSSyncIsOnDiskRequestBody} message FSSyncIsOnDiskRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncIsOnDiskRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FSSyncIsOnDiskRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FSSyncIsOnDiskRequestBody} FSSyncIsOnDiskRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSSyncIsOnDiskRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSSyncIsOnDiskRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.version = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FSSyncIsOnDiskRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FSSyncIsOnDiskRequestBody} FSSyncIsOnDiskRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSSyncIsOnDiskRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FSSyncIsOnDiskRequestBody message.
         * @function verify
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSSyncIsOnDiskRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            return null;
        };

        /**
         * Creates a FSSyncIsOnDiskRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSSyncIsOnDiskRequestBody} FSSyncIsOnDiskRequestBody
         */
        FSSyncIsOnDiskRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FSSyncIsOnDiskRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FSSyncIsOnDiskRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FSSyncIsOnDiskRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from a FSSyncIsOnDiskRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @static
         * @param {fs.FSSyncIsOnDiskRequestBody} message FSSyncIsOnDiskRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSSyncIsOnDiskRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            return object;
        };

        /**
         * Converts this FSSyncIsOnDiskRequestBody to JSON.
         * @function toJSON
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FSSyncIsOnDiskRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FSSyncIsOnDiskRequestBody
         * @function getTypeUrl
         * @memberof fs.FSSyncIsOnDiskRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FSSyncIsOnDiskRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FSSyncIsOnDiskRequestBody";
        };

        return FSSyncIsOnDiskRequestBody;
    })();

    fs.FSSyncIsOnDiskReplyBody = (function() {

        /**
         * Properties of a FSSyncIsOnDiskReplyBody.
         * @memberof fs
         * @interface IFSSyncIsOnDiskReplyBody
         * @property {string|null} [status] FSSyncIsOnDiskReplyBody status
         */

        /**
         * Constructs a new FSSyncIsOnDiskReplyBody.
         * @memberof fs
         * @classdesc Represents a FSSyncIsOnDiskReplyBody.
         * @implements IFSSyncIsOnDiskReplyBody
         * @constructor
         * @param {fs.IFSSyncIsOnDiskReplyBody=} [properties] Properties to set
         */
        function FSSyncIsOnDiskReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FSSyncIsOnDiskReplyBody status.
         * @member {string} status
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @instance
         */
        FSSyncIsOnDiskReplyBody.prototype.status = "";

        /**
         * Creates a new FSSyncIsOnDiskReplyBody instance using the specified properties.
         * @function create
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @static
         * @param {fs.IFSSyncIsOnDiskReplyBody=} [properties] Properties to set
         * @returns {fs.FSSyncIsOnDiskReplyBody} FSSyncIsOnDiskReplyBody instance
         */
        FSSyncIsOnDiskReplyBody.create = function create(properties) {
            return new FSSyncIsOnDiskReplyBody(properties);
        };

        /**
         * Encodes the specified FSSyncIsOnDiskReplyBody message. Does not implicitly {@link fs.FSSyncIsOnDiskReplyBody.verify|verify} messages.
         * @function encode
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @static
         * @param {fs.IFSSyncIsOnDiskReplyBody} message FSSyncIsOnDiskReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncIsOnDiskReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.status != null && Object.hasOwnProperty.call(message, "status"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.status);
            return writer;
        };

        /**
         * Encodes the specified FSSyncIsOnDiskReplyBody message, length delimited. Does not implicitly {@link fs.FSSyncIsOnDiskReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @static
         * @param {fs.IFSSyncIsOnDiskReplyBody} message FSSyncIsOnDiskReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncIsOnDiskReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FSSyncIsOnDiskReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FSSyncIsOnDiskReplyBody} FSSyncIsOnDiskReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSSyncIsOnDiskReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSSyncIsOnDiskReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.status = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FSSyncIsOnDiskReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FSSyncIsOnDiskReplyBody} FSSyncIsOnDiskReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSSyncIsOnDiskReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FSSyncIsOnDiskReplyBody message.
         * @function verify
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSSyncIsOnDiskReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.status != null && Object.hasOwnProperty.call(message, "status"))
                if (!$util.isString(message.status))
                    return "status: string expected";
            return null;
        };

        /**
         * Creates a FSSyncIsOnDiskReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSSyncIsOnDiskReplyBody} FSSyncIsOnDiskReplyBody
         */
        FSSyncIsOnDiskReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FSSyncIsOnDiskReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FSSyncIsOnDiskReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FSSyncIsOnDiskReplyBody();
            if (object.status != null)
                message.status = String(object.status);
            return message;
        };

        /**
         * Creates a plain object from a FSSyncIsOnDiskReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @static
         * @param {fs.FSSyncIsOnDiskReplyBody} message FSSyncIsOnDiskReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSSyncIsOnDiskReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.status = "";
            if (message.status != null && Object.hasOwnProperty.call(message, "status"))
                object.status = message.status;
            return object;
        };

        /**
         * Converts this FSSyncIsOnDiskReplyBody to JSON.
         * @function toJSON
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FSSyncIsOnDiskReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FSSyncIsOnDiskReplyBody
         * @function getTypeUrl
         * @memberof fs.FSSyncIsOnDiskReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FSSyncIsOnDiskReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FSSyncIsOnDiskReplyBody";
        };

        return FSSyncIsOnDiskReplyBody;
    })();

    fs.FSSyncStartDownloadRequestBody = (function() {

        /**
         * Properties of a FSSyncStartDownloadRequestBody.
         * @memberof fs
         * @interface IFSSyncStartDownloadRequestBody
         * @property {string|null} [path] FSSyncStartDownloadRequestBody path
         * @property {number|Long|null} [version] FSSyncStartDownloadRequestBody version
         */

        /**
         * Constructs a new FSSyncStartDownloadRequestBody.
         * @memberof fs
         * @classdesc Represents a FSSyncStartDownloadRequestBody.
         * @implements IFSSyncStartDownloadRequestBody
         * @constructor
         * @param {fs.IFSSyncStartDownloadRequestBody=} [properties] Properties to set
         */
        function FSSyncStartDownloadRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FSSyncStartDownloadRequestBody path.
         * @member {string} path
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @instance
         */
        FSSyncStartDownloadRequestBody.prototype.path = "";

        /**
         * FSSyncStartDownloadRequestBody version.
         * @member {number|Long} version
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @instance
         */
        FSSyncStartDownloadRequestBody.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new FSSyncStartDownloadRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @static
         * @param {fs.IFSSyncStartDownloadRequestBody=} [properties] Properties to set
         * @returns {fs.FSSyncStartDownloadRequestBody} FSSyncStartDownloadRequestBody instance
         */
        FSSyncStartDownloadRequestBody.create = function create(properties) {
            return new FSSyncStartDownloadRequestBody(properties);
        };

        /**
         * Encodes the specified FSSyncStartDownloadRequestBody message. Does not implicitly {@link fs.FSSyncStartDownloadRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @static
         * @param {fs.IFSSyncStartDownloadRequestBody} message FSSyncStartDownloadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncStartDownloadRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.version);
            return writer;
        };

        /**
         * Encodes the specified FSSyncStartDownloadRequestBody message, length delimited. Does not implicitly {@link fs.FSSyncStartDownloadRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @static
         * @param {fs.IFSSyncStartDownloadRequestBody} message FSSyncStartDownloadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncStartDownloadRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FSSyncStartDownloadRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FSSyncStartDownloadRequestBody} FSSyncStartDownloadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSSyncStartDownloadRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSSyncStartDownloadRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.version = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FSSyncStartDownloadRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FSSyncStartDownloadRequestBody} FSSyncStartDownloadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSSyncStartDownloadRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FSSyncStartDownloadRequestBody message.
         * @function verify
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSSyncStartDownloadRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))
                    return "version: integer|Long expected";
            return null;
        };

        /**
         * Creates a FSSyncStartDownloadRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSSyncStartDownloadRequestBody} FSSyncStartDownloadRequestBody
         */
        FSSyncStartDownloadRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FSSyncStartDownloadRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FSSyncStartDownloadRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FSSyncStartDownloadRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.version != null)
                if ($util.Long)
                    message.version = $util.Long.fromValue(object.version, true);
                else if (typeof object.version === "string")
                    message.version = parseInt(object.version, 10);
                else if (typeof object.version === "number")
                    message.version = object.version;
                else if (typeof object.version === "object")
                    message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from a FSSyncStartDownloadRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @static
         * @param {fs.FSSyncStartDownloadRequestBody} message FSSyncStartDownloadRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSSyncStartDownloadRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.version = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.version != null && Object.hasOwnProperty.call(message, "version"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.version = typeof message.version === "number" ? BigInt(message.version) : $util.Long.fromBits(message.version.low >>> 0, message.version.high >>> 0, true).toBigInt();
                else if (typeof message.version === "number")
                    object.version = options.longs === String ? String(message.version) : message.version;
                else
                    object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version;
            return object;
        };

        /**
         * Converts this FSSyncStartDownloadRequestBody to JSON.
         * @function toJSON
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FSSyncStartDownloadRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FSSyncStartDownloadRequestBody
         * @function getTypeUrl
         * @memberof fs.FSSyncStartDownloadRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FSSyncStartDownloadRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FSSyncStartDownloadRequestBody";
        };

        return FSSyncStartDownloadRequestBody;
    })();

    fs.AdoptRemoteRequestBody = (function() {

        /**
         * Properties of an AdoptRemoteRequestBody.
         * @memberof fs
         * @interface IAdoptRemoteRequestBody
         * @property {string|null} [path] AdoptRemoteRequestBody path
         * @property {file.IOptionsToAdopteRemote|null} [opts] AdoptRemoteRequestBody opts
         */

        /**
         * Constructs a new AdoptRemoteRequestBody.
         * @memberof fs
         * @classdesc Represents an AdoptRemoteRequestBody.
         * @implements IAdoptRemoteRequestBody
         * @constructor
         * @param {fs.IAdoptRemoteRequestBody=} [properties] Properties to set
         */
        function AdoptRemoteRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * AdoptRemoteRequestBody path.
         * @member {string} path
         * @memberof fs.AdoptRemoteRequestBody
         * @instance
         */
        AdoptRemoteRequestBody.prototype.path = "";

        /**
         * AdoptRemoteRequestBody opts.
         * @member {file.IOptionsToAdopteRemote|null|undefined} opts
         * @memberof fs.AdoptRemoteRequestBody
         * @instance
         */
        AdoptRemoteRequestBody.prototype.opts = null;

        /**
         * Creates a new AdoptRemoteRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.AdoptRemoteRequestBody
         * @static
         * @param {fs.IAdoptRemoteRequestBody=} [properties] Properties to set
         * @returns {fs.AdoptRemoteRequestBody} AdoptRemoteRequestBody instance
         */
        AdoptRemoteRequestBody.create = function create(properties) {
            return new AdoptRemoteRequestBody(properties);
        };

        /**
         * Encodes the specified AdoptRemoteRequestBody message. Does not implicitly {@link fs.AdoptRemoteRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.AdoptRemoteRequestBody
         * @static
         * @param {fs.IAdoptRemoteRequestBody} message AdoptRemoteRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AdoptRemoteRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.file.OptionsToAdopteRemote.encode(message.opts, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified AdoptRemoteRequestBody message, length delimited. Does not implicitly {@link fs.AdoptRemoteRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.AdoptRemoteRequestBody
         * @static
         * @param {fs.IAdoptRemoteRequestBody} message AdoptRemoteRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AdoptRemoteRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an AdoptRemoteRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.AdoptRemoteRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.AdoptRemoteRequestBody} AdoptRemoteRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AdoptRemoteRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.AdoptRemoteRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.opts = $root.file.OptionsToAdopteRemote.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an AdoptRemoteRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.AdoptRemoteRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.AdoptRemoteRequestBody} AdoptRemoteRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AdoptRemoteRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an AdoptRemoteRequestBody message.
         * @function verify
         * @memberof fs.AdoptRemoteRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        AdoptRemoteRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts")) {
                var error = $root.file.OptionsToAdopteRemote.verify(message.opts, long + 1);
                if (error)
                    return "opts." + error;
            }
            return null;
        };

        /**
         * Creates an AdoptRemoteRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.AdoptRemoteRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.AdoptRemoteRequestBody} AdoptRemoteRequestBody
         */
        AdoptRemoteRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.AdoptRemoteRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.AdoptRemoteRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.AdoptRemoteRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.opts != null) {
                if (!$util.isObject(object.opts))
                    throw TypeError(".fs.AdoptRemoteRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToAdopteRemote.fromObject(object.opts, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an AdoptRemoteRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.AdoptRemoteRequestBody
         * @static
         * @param {fs.AdoptRemoteRequestBody} message AdoptRemoteRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        AdoptRemoteRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.opts = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                object.opts = $root.file.OptionsToAdopteRemote.toObject(message.opts, options, q + 1);
            return object;
        };

        /**
         * Converts this AdoptRemoteRequestBody to JSON.
         * @function toJSON
         * @memberof fs.AdoptRemoteRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        AdoptRemoteRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for AdoptRemoteRequestBody
         * @function getTypeUrl
         * @memberof fs.AdoptRemoteRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        AdoptRemoteRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.AdoptRemoteRequestBody";
        };

        return AdoptRemoteRequestBody;
    })();

    fs.DiffCurrentAndRemoteFileVersionsRequestBody = (function() {

        /**
         * Properties of a DiffCurrentAndRemoteFileVersionsRequestBody.
         * @memberof fs
         * @interface IDiffCurrentAndRemoteFileVersionsRequestBody
         * @property {string|null} [path] DiffCurrentAndRemoteFileVersionsRequestBody path
         * @property {file.IOptionsToDiffFileVersions|null} [opts] DiffCurrentAndRemoteFileVersionsRequestBody opts
         */

        /**
         * Constructs a new DiffCurrentAndRemoteFileVersionsRequestBody.
         * @memberof fs
         * @classdesc Represents a DiffCurrentAndRemoteFileVersionsRequestBody.
         * @implements IDiffCurrentAndRemoteFileVersionsRequestBody
         * @constructor
         * @param {fs.IDiffCurrentAndRemoteFileVersionsRequestBody=} [properties] Properties to set
         */
        function DiffCurrentAndRemoteFileVersionsRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * DiffCurrentAndRemoteFileVersionsRequestBody path.
         * @member {string} path
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @instance
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.prototype.path = "";

        /**
         * DiffCurrentAndRemoteFileVersionsRequestBody opts.
         * @member {file.IOptionsToDiffFileVersions|null|undefined} opts
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @instance
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.prototype.opts = null;

        /**
         * Creates a new DiffCurrentAndRemoteFileVersionsRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @static
         * @param {fs.IDiffCurrentAndRemoteFileVersionsRequestBody=} [properties] Properties to set
         * @returns {fs.DiffCurrentAndRemoteFileVersionsRequestBody} DiffCurrentAndRemoteFileVersionsRequestBody instance
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.create = function create(properties) {
            return new DiffCurrentAndRemoteFileVersionsRequestBody(properties);
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteFileVersionsRequestBody message. Does not implicitly {@link fs.DiffCurrentAndRemoteFileVersionsRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @static
         * @param {fs.IDiffCurrentAndRemoteFileVersionsRequestBody} message DiffCurrentAndRemoteFileVersionsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.file.OptionsToDiffFileVersions.encode(message.opts, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteFileVersionsRequestBody message, length delimited. Does not implicitly {@link fs.DiffCurrentAndRemoteFileVersionsRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @static
         * @param {fs.IDiffCurrentAndRemoteFileVersionsRequestBody} message DiffCurrentAndRemoteFileVersionsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a DiffCurrentAndRemoteFileVersionsRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.DiffCurrentAndRemoteFileVersionsRequestBody} DiffCurrentAndRemoteFileVersionsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.DiffCurrentAndRemoteFileVersionsRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.opts = $root.file.OptionsToDiffFileVersions.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a DiffCurrentAndRemoteFileVersionsRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.DiffCurrentAndRemoteFileVersionsRequestBody} DiffCurrentAndRemoteFileVersionsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a DiffCurrentAndRemoteFileVersionsRequestBody message.
         * @function verify
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts")) {
                var error = $root.file.OptionsToDiffFileVersions.verify(message.opts, long + 1);
                if (error)
                    return "opts." + error;
            }
            return null;
        };

        /**
         * Creates a DiffCurrentAndRemoteFileVersionsRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.DiffCurrentAndRemoteFileVersionsRequestBody} DiffCurrentAndRemoteFileVersionsRequestBody
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.DiffCurrentAndRemoteFileVersionsRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.DiffCurrentAndRemoteFileVersionsRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.DiffCurrentAndRemoteFileVersionsRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.opts != null) {
                if (!$util.isObject(object.opts))
                    throw TypeError(".fs.DiffCurrentAndRemoteFileVersionsRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToDiffFileVersions.fromObject(object.opts, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a DiffCurrentAndRemoteFileVersionsRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @static
         * @param {fs.DiffCurrentAndRemoteFileVersionsRequestBody} message DiffCurrentAndRemoteFileVersionsRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.opts = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                object.opts = $root.file.OptionsToDiffFileVersions.toObject(message.opts, options, q + 1);
            return object;
        };

        /**
         * Converts this DiffCurrentAndRemoteFileVersionsRequestBody to JSON.
         * @function toJSON
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for DiffCurrentAndRemoteFileVersionsRequestBody
         * @function getTypeUrl
         * @memberof fs.DiffCurrentAndRemoteFileVersionsRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        DiffCurrentAndRemoteFileVersionsRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.DiffCurrentAndRemoteFileVersionsRequestBody";
        };

        return DiffCurrentAndRemoteFileVersionsRequestBody;
    })();

    fs.DiffCurrentAndRemoteFolderVersionsRequestBody = (function() {

        /**
         * Properties of a DiffCurrentAndRemoteFolderVersionsRequestBody.
         * @memberof fs
         * @interface IDiffCurrentAndRemoteFolderVersionsRequestBody
         * @property {string|null} [path] DiffCurrentAndRemoteFolderVersionsRequestBody path
         * @property {common.IUInt64Value|null} [remoteVersion] DiffCurrentAndRemoteFolderVersionsRequestBody remoteVersion
         */

        /**
         * Constructs a new DiffCurrentAndRemoteFolderVersionsRequestBody.
         * @memberof fs
         * @classdesc Represents a DiffCurrentAndRemoteFolderVersionsRequestBody.
         * @implements IDiffCurrentAndRemoteFolderVersionsRequestBody
         * @constructor
         * @param {fs.IDiffCurrentAndRemoteFolderVersionsRequestBody=} [properties] Properties to set
         */
        function DiffCurrentAndRemoteFolderVersionsRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * DiffCurrentAndRemoteFolderVersionsRequestBody path.
         * @member {string} path
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @instance
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.prototype.path = "";

        /**
         * DiffCurrentAndRemoteFolderVersionsRequestBody remoteVersion.
         * @member {common.IUInt64Value|null|undefined} remoteVersion
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @instance
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.prototype.remoteVersion = null;

        /**
         * Creates a new DiffCurrentAndRemoteFolderVersionsRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @static
         * @param {fs.IDiffCurrentAndRemoteFolderVersionsRequestBody=} [properties] Properties to set
         * @returns {fs.DiffCurrentAndRemoteFolderVersionsRequestBody} DiffCurrentAndRemoteFolderVersionsRequestBody instance
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.create = function create(properties) {
            return new DiffCurrentAndRemoteFolderVersionsRequestBody(properties);
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteFolderVersionsRequestBody message. Does not implicitly {@link fs.DiffCurrentAndRemoteFolderVersionsRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @static
         * @param {fs.IDiffCurrentAndRemoteFolderVersionsRequestBody} message DiffCurrentAndRemoteFolderVersionsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteFolderVersionsRequestBody message, length delimited. Does not implicitly {@link fs.DiffCurrentAndRemoteFolderVersionsRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @static
         * @param {fs.IDiffCurrentAndRemoteFolderVersionsRequestBody} message DiffCurrentAndRemoteFolderVersionsRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a DiffCurrentAndRemoteFolderVersionsRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.DiffCurrentAndRemoteFolderVersionsRequestBody} DiffCurrentAndRemoteFolderVersionsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.DiffCurrentAndRemoteFolderVersionsRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a DiffCurrentAndRemoteFolderVersionsRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.DiffCurrentAndRemoteFolderVersionsRequestBody} DiffCurrentAndRemoteFolderVersionsRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a DiffCurrentAndRemoteFolderVersionsRequestBody message.
         * @function verify
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion, long + 1);
                if (error)
                    return "remoteVersion." + error;
            }
            return null;
        };

        /**
         * Creates a DiffCurrentAndRemoteFolderVersionsRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.DiffCurrentAndRemoteFolderVersionsRequestBody} DiffCurrentAndRemoteFolderVersionsRequestBody
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.DiffCurrentAndRemoteFolderVersionsRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.DiffCurrentAndRemoteFolderVersionsRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.DiffCurrentAndRemoteFolderVersionsRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.remoteVersion != null) {
                if (!$util.isObject(object.remoteVersion))
                    throw TypeError(".fs.DiffCurrentAndRemoteFolderVersionsRequestBody.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a DiffCurrentAndRemoteFolderVersionsRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @static
         * @param {fs.DiffCurrentAndRemoteFolderVersionsRequestBody} message DiffCurrentAndRemoteFolderVersionsRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.remoteVersion = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options, q + 1);
            return object;
        };

        /**
         * Converts this DiffCurrentAndRemoteFolderVersionsRequestBody to JSON.
         * @function toJSON
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for DiffCurrentAndRemoteFolderVersionsRequestBody
         * @function getTypeUrl
         * @memberof fs.DiffCurrentAndRemoteFolderVersionsRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        DiffCurrentAndRemoteFolderVersionsRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.DiffCurrentAndRemoteFolderVersionsRequestBody";
        };

        return DiffCurrentAndRemoteFolderVersionsRequestBody;
    })();

    fs.DiffCurrentAndRemoteReplyBody = (function() {

        /**
         * Properties of a DiffCurrentAndRemoteReplyBody.
         * @memberof fs
         * @interface IDiffCurrentAndRemoteReplyBody
         * @property {fs.IFolderDiff|null} [diff] DiffCurrentAndRemoteReplyBody diff
         */

        /**
         * Constructs a new DiffCurrentAndRemoteReplyBody.
         * @memberof fs
         * @classdesc Represents a DiffCurrentAndRemoteReplyBody.
         * @implements IDiffCurrentAndRemoteReplyBody
         * @constructor
         * @param {fs.IDiffCurrentAndRemoteReplyBody=} [properties] Properties to set
         */
        function DiffCurrentAndRemoteReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * DiffCurrentAndRemoteReplyBody diff.
         * @member {fs.IFolderDiff|null|undefined} diff
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @instance
         */
        DiffCurrentAndRemoteReplyBody.prototype.diff = null;

        /**
         * Creates a new DiffCurrentAndRemoteReplyBody instance using the specified properties.
         * @function create
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {fs.IDiffCurrentAndRemoteReplyBody=} [properties] Properties to set
         * @returns {fs.DiffCurrentAndRemoteReplyBody} DiffCurrentAndRemoteReplyBody instance
         */
        DiffCurrentAndRemoteReplyBody.create = function create(properties) {
            return new DiffCurrentAndRemoteReplyBody(properties);
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteReplyBody message. Does not implicitly {@link fs.DiffCurrentAndRemoteReplyBody.verify|verify} messages.
         * @function encode
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {fs.IDiffCurrentAndRemoteReplyBody} message DiffCurrentAndRemoteReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.diff != null && Object.hasOwnProperty.call(message, "diff"))
                $root.fs.FolderDiff.encode(message.diff, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified DiffCurrentAndRemoteReplyBody message, length delimited. Does not implicitly {@link fs.DiffCurrentAndRemoteReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {fs.IDiffCurrentAndRemoteReplyBody} message DiffCurrentAndRemoteReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DiffCurrentAndRemoteReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a DiffCurrentAndRemoteReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.DiffCurrentAndRemoteReplyBody} DiffCurrentAndRemoteReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.DiffCurrentAndRemoteReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.diff = $root.fs.FolderDiff.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a DiffCurrentAndRemoteReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.DiffCurrentAndRemoteReplyBody} DiffCurrentAndRemoteReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DiffCurrentAndRemoteReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a DiffCurrentAndRemoteReplyBody message.
         * @function verify
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        DiffCurrentAndRemoteReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.diff != null && Object.hasOwnProperty.call(message, "diff")) {
                var error = $root.fs.FolderDiff.verify(message.diff, long + 1);
                if (error)
                    return "diff." + error;
            }
            return null;
        };

        /**
         * Creates a DiffCurrentAndRemoteReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.DiffCurrentAndRemoteReplyBody} DiffCurrentAndRemoteReplyBody
         */
        DiffCurrentAndRemoteReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.DiffCurrentAndRemoteReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.DiffCurrentAndRemoteReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.DiffCurrentAndRemoteReplyBody();
            if (object.diff != null) {
                if (!$util.isObject(object.diff))
                    throw TypeError(".fs.DiffCurrentAndRemoteReplyBody.diff: object expected");
                message.diff = $root.fs.FolderDiff.fromObject(object.diff, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a DiffCurrentAndRemoteReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {fs.DiffCurrentAndRemoteReplyBody} message DiffCurrentAndRemoteReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        DiffCurrentAndRemoteReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.diff = null;
            if (message.diff != null && Object.hasOwnProperty.call(message, "diff"))
                object.diff = $root.fs.FolderDiff.toObject(message.diff, options, q + 1);
            return object;
        };

        /**
         * Converts this DiffCurrentAndRemoteReplyBody to JSON.
         * @function toJSON
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        DiffCurrentAndRemoteReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for DiffCurrentAndRemoteReplyBody
         * @function getTypeUrl
         * @memberof fs.DiffCurrentAndRemoteReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        DiffCurrentAndRemoteReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.DiffCurrentAndRemoteReplyBody";
        };

        return DiffCurrentAndRemoteReplyBody;
    })();

    fs.FolderDiff = (function() {

        /**
         * Properties of a FolderDiff.
         * @memberof fs
         * @interface IFolderDiff
         * @property {number|Long|null} [currentVersion] FolderDiff currentVersion
         * @property {boolean|null} [isCurrentLocal] FolderDiff isCurrentLocal
         * @property {common.IUInt64Value|null} [remoteVersion] FolderDiff remoteVersion
         * @property {common.IUInt64Value|null} [syncedVersion] FolderDiff syncedVersion
         * @property {boolean|null} [isRemoteRemoved] FolderDiff isRemoteRemoved
         * @property {file.ITimeStampsDiff|null} [ctime] FolderDiff ctime
         * @property {file.ITimeStampsDiff|null} [mtime] FolderDiff mtime
         * @property {Array.<file.IXAttrDiff>|null} [xattrs] FolderDiff xattrs
         * @property {fs.FolderDiff.IItemsByBranches|null} [removed] FolderDiff removed
         * @property {Array.<fs.FolderDiff.IRenamed>|null} [renamed] FolderDiff renamed
         * @property {fs.FolderDiff.IItemsByBranches|null} [added] FolderDiff added
         * @property {Array.<fs.FolderDiff.IRekeyed>|null} [rekeyed] FolderDiff rekeyed
         * @property {Array.<string>|null} [nameOverlaps] FolderDiff nameOverlaps
         */

        /**
         * Constructs a new FolderDiff.
         * @memberof fs
         * @classdesc Represents a FolderDiff.
         * @implements IFolderDiff
         * @constructor
         * @param {fs.IFolderDiff=} [properties] Properties to set
         */
        function FolderDiff(properties) {
            this.xattrs = [];
            this.renamed = [];
            this.rekeyed = [];
            this.nameOverlaps = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FolderDiff currentVersion.
         * @member {number|Long} currentVersion
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.currentVersion = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * FolderDiff isCurrentLocal.
         * @member {boolean} isCurrentLocal
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.isCurrentLocal = false;

        /**
         * FolderDiff remoteVersion.
         * @member {common.IUInt64Value|null|undefined} remoteVersion
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.remoteVersion = null;

        /**
         * FolderDiff syncedVersion.
         * @member {common.IUInt64Value|null|undefined} syncedVersion
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.syncedVersion = null;

        /**
         * FolderDiff isRemoteRemoved.
         * @member {boolean} isRemoteRemoved
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.isRemoteRemoved = false;

        /**
         * FolderDiff ctime.
         * @member {file.ITimeStampsDiff|null|undefined} ctime
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.ctime = null;

        /**
         * FolderDiff mtime.
         * @member {file.ITimeStampsDiff|null|undefined} mtime
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.mtime = null;

        /**
         * FolderDiff xattrs.
         * @member {Array.<file.IXAttrDiff>} xattrs
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.xattrs = $util.emptyArray;

        /**
         * FolderDiff removed.
         * @member {fs.FolderDiff.IItemsByBranches|null|undefined} removed
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.removed = null;

        /**
         * FolderDiff renamed.
         * @member {Array.<fs.FolderDiff.IRenamed>} renamed
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.renamed = $util.emptyArray;

        /**
         * FolderDiff added.
         * @member {fs.FolderDiff.IItemsByBranches|null|undefined} added
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.added = null;

        /**
         * FolderDiff rekeyed.
         * @member {Array.<fs.FolderDiff.IRekeyed>} rekeyed
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.rekeyed = $util.emptyArray;

        /**
         * FolderDiff nameOverlaps.
         * @member {Array.<string>} nameOverlaps
         * @memberof fs.FolderDiff
         * @instance
         */
        FolderDiff.prototype.nameOverlaps = $util.emptyArray;

        /**
         * Creates a new FolderDiff instance using the specified properties.
         * @function create
         * @memberof fs.FolderDiff
         * @static
         * @param {fs.IFolderDiff=} [properties] Properties to set
         * @returns {fs.FolderDiff} FolderDiff instance
         */
        FolderDiff.create = function create(properties) {
            return new FolderDiff(properties);
        };

        /**
         * Encodes the specified FolderDiff message. Does not implicitly {@link fs.FolderDiff.verify|verify} messages.
         * @function encode
         * @memberof fs.FolderDiff
         * @static
         * @param {fs.IFolderDiff} message FolderDiff message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FolderDiff.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.currentVersion);
            if (message.isCurrentLocal != null && Object.hasOwnProperty.call(message, "isCurrentLocal"))
                writer.uint32(/* id 2, wireType 0 =*/16).bool(message.isCurrentLocal);
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            if (message.syncedVersion != null && Object.hasOwnProperty.call(message, "syncedVersion"))
                $root.common.UInt64Value.encode(message.syncedVersion, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
            if (message.isRemoteRemoved != null && Object.hasOwnProperty.call(message, "isRemoteRemoved"))
                writer.uint32(/* id 5, wireType 0 =*/40).bool(message.isRemoteRemoved);
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime"))
                $root.file.TimeStampsDiff.encode(message.ctime, writer.uint32(/* id 6, wireType 2 =*/50).fork(), q + 1).ldelim();
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime"))
                $root.file.TimeStampsDiff.encode(message.mtime, writer.uint32(/* id 7, wireType 2 =*/58).fork(), q + 1).ldelim();
            if (message.xattrs != null && message.xattrs.length)
                for (var i = 0; i < message.xattrs.length; ++i)
                    $root.file.XAttrDiff.encode(message.xattrs[i], writer.uint32(/* id 8, wireType 2 =*/66).fork(), q + 1).ldelim();
            if (message.removed != null && Object.hasOwnProperty.call(message, "removed"))
                $root.fs.FolderDiff.ItemsByBranches.encode(message.removed, writer.uint32(/* id 11, wireType 2 =*/90).fork(), q + 1).ldelim();
            if (message.renamed != null && message.renamed.length)
                for (var i = 0; i < message.renamed.length; ++i)
                    $root.fs.FolderDiff.Renamed.encode(message.renamed[i], writer.uint32(/* id 12, wireType 2 =*/98).fork(), q + 1).ldelim();
            if (message.added != null && Object.hasOwnProperty.call(message, "added"))
                $root.fs.FolderDiff.ItemsByBranches.encode(message.added, writer.uint32(/* id 13, wireType 2 =*/106).fork(), q + 1).ldelim();
            if (message.rekeyed != null && message.rekeyed.length)
                for (var i = 0; i < message.rekeyed.length; ++i)
                    $root.fs.FolderDiff.Rekeyed.encode(message.rekeyed[i], writer.uint32(/* id 14, wireType 2 =*/114).fork(), q + 1).ldelim();
            if (message.nameOverlaps != null && message.nameOverlaps.length)
                for (var i = 0; i < message.nameOverlaps.length; ++i)
                    writer.uint32(/* id 15, wireType 2 =*/122).string(message.nameOverlaps[i]);
            return writer;
        };

        /**
         * Encodes the specified FolderDiff message, length delimited. Does not implicitly {@link fs.FolderDiff.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FolderDiff
         * @static
         * @param {fs.IFolderDiff} message FolderDiff message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FolderDiff.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FolderDiff message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FolderDiff
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FolderDiff} FolderDiff
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FolderDiff.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FolderDiff();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.currentVersion = reader.uint64();
                        break;
                    }
                case 2: {
                        message.isCurrentLocal = reader.bool();
                        break;
                    }
                case 3: {
                        message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 4: {
                        message.syncedVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 5: {
                        message.isRemoteRemoved = reader.bool();
                        break;
                    }
                case 6: {
                        message.ctime = $root.file.TimeStampsDiff.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 7: {
                        message.mtime = $root.file.TimeStampsDiff.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 8: {
                        if (!(message.xattrs && message.xattrs.length))
                            message.xattrs = [];
                        message.xattrs.push($root.file.XAttrDiff.decode(reader, reader.uint32(), undefined, long + 1));
                        break;
                    }
                case 11: {
                        message.removed = $root.fs.FolderDiff.ItemsByBranches.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 12: {
                        if (!(message.renamed && message.renamed.length))
                            message.renamed = [];
                        message.renamed.push($root.fs.FolderDiff.Renamed.decode(reader, reader.uint32(), undefined, long + 1));
                        break;
                    }
                case 13: {
                        message.added = $root.fs.FolderDiff.ItemsByBranches.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 14: {
                        if (!(message.rekeyed && message.rekeyed.length))
                            message.rekeyed = [];
                        message.rekeyed.push($root.fs.FolderDiff.Rekeyed.decode(reader, reader.uint32(), undefined, long + 1));
                        break;
                    }
                case 15: {
                        if (!(message.nameOverlaps && message.nameOverlaps.length))
                            message.nameOverlaps = [];
                        message.nameOverlaps.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FolderDiff message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FolderDiff
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FolderDiff} FolderDiff
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FolderDiff.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FolderDiff message.
         * @function verify
         * @memberof fs.FolderDiff
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FolderDiff.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                if (!$util.isInteger(message.currentVersion) && !(message.currentVersion && $util.isInteger(message.currentVersion.low) && $util.isInteger(message.currentVersion.high)))
                    return "currentVersion: integer|Long expected";
            if (message.isCurrentLocal != null && Object.hasOwnProperty.call(message, "isCurrentLocal"))
                if (typeof message.isCurrentLocal !== "boolean")
                    return "isCurrentLocal: boolean expected";
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion, long + 1);
                if (error)
                    return "remoteVersion." + error;
            }
            if (message.syncedVersion != null && Object.hasOwnProperty.call(message, "syncedVersion")) {
                var error = $root.common.UInt64Value.verify(message.syncedVersion, long + 1);
                if (error)
                    return "syncedVersion." + error;
            }
            if (message.isRemoteRemoved != null && Object.hasOwnProperty.call(message, "isRemoteRemoved"))
                if (typeof message.isRemoteRemoved !== "boolean")
                    return "isRemoteRemoved: boolean expected";
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime")) {
                var error = $root.file.TimeStampsDiff.verify(message.ctime, long + 1);
                if (error)
                    return "ctime." + error;
            }
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime")) {
                var error = $root.file.TimeStampsDiff.verify(message.mtime, long + 1);
                if (error)
                    return "mtime." + error;
            }
            if (message.xattrs != null && Object.hasOwnProperty.call(message, "xattrs")) {
                if (!Array.isArray(message.xattrs))
                    return "xattrs: array expected";
                for (var i = 0; i < message.xattrs.length; ++i) {
                    var error = $root.file.XAttrDiff.verify(message.xattrs[i], long + 1);
                    if (error)
                        return "xattrs." + error;
                }
            }
            if (message.removed != null && Object.hasOwnProperty.call(message, "removed")) {
                var error = $root.fs.FolderDiff.ItemsByBranches.verify(message.removed, long + 1);
                if (error)
                    return "removed." + error;
            }
            if (message.renamed != null && Object.hasOwnProperty.call(message, "renamed")) {
                if (!Array.isArray(message.renamed))
                    return "renamed: array expected";
                for (var i = 0; i < message.renamed.length; ++i) {
                    var error = $root.fs.FolderDiff.Renamed.verify(message.renamed[i], long + 1);
                    if (error)
                        return "renamed." + error;
                }
            }
            if (message.added != null && Object.hasOwnProperty.call(message, "added")) {
                var error = $root.fs.FolderDiff.ItemsByBranches.verify(message.added, long + 1);
                if (error)
                    return "added." + error;
            }
            if (message.rekeyed != null && Object.hasOwnProperty.call(message, "rekeyed")) {
                if (!Array.isArray(message.rekeyed))
                    return "rekeyed: array expected";
                for (var i = 0; i < message.rekeyed.length; ++i) {
                    var error = $root.fs.FolderDiff.Rekeyed.verify(message.rekeyed[i], long + 1);
                    if (error)
                        return "rekeyed." + error;
                }
            }
            if (message.nameOverlaps != null && Object.hasOwnProperty.call(message, "nameOverlaps")) {
                if (!Array.isArray(message.nameOverlaps))
                    return "nameOverlaps: array expected";
                for (var i = 0; i < message.nameOverlaps.length; ++i)
                    if (!$util.isString(message.nameOverlaps[i]))
                        return "nameOverlaps: string[] expected";
            }
            return null;
        };

        /**
         * Creates a FolderDiff message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FolderDiff
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FolderDiff} FolderDiff
         */
        FolderDiff.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FolderDiff)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FolderDiff: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FolderDiff();
            if (object.currentVersion != null)
                if ($util.Long)
                    message.currentVersion = $util.Long.fromValue(object.currentVersion, true);
                else if (typeof object.currentVersion === "string")
                    message.currentVersion = parseInt(object.currentVersion, 10);
                else if (typeof object.currentVersion === "number")
                    message.currentVersion = object.currentVersion;
                else if (typeof object.currentVersion === "object")
                    message.currentVersion = new $util.LongBits(object.currentVersion.low >>> 0, object.currentVersion.high >>> 0).toNumber(true);
            if (object.isCurrentLocal != null)
                message.isCurrentLocal = Boolean(object.isCurrentLocal);
            if (object.remoteVersion != null) {
                if (!$util.isObject(object.remoteVersion))
                    throw TypeError(".fs.FolderDiff.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion, long + 1);
            }
            if (object.syncedVersion != null) {
                if (!$util.isObject(object.syncedVersion))
                    throw TypeError(".fs.FolderDiff.syncedVersion: object expected");
                message.syncedVersion = $root.common.UInt64Value.fromObject(object.syncedVersion, long + 1);
            }
            if (object.isRemoteRemoved != null)
                message.isRemoteRemoved = Boolean(object.isRemoteRemoved);
            if (object.ctime != null) {
                if (!$util.isObject(object.ctime))
                    throw TypeError(".fs.FolderDiff.ctime: object expected");
                message.ctime = $root.file.TimeStampsDiff.fromObject(object.ctime, long + 1);
            }
            if (object.mtime != null) {
                if (!$util.isObject(object.mtime))
                    throw TypeError(".fs.FolderDiff.mtime: object expected");
                message.mtime = $root.file.TimeStampsDiff.fromObject(object.mtime, long + 1);
            }
            if (object.xattrs) {
                if (!Array.isArray(object.xattrs))
                    throw TypeError(".fs.FolderDiff.xattrs: array expected");
                message.xattrs = [];
                for (var i = 0; i < object.xattrs.length; ++i) {
                    if (!$util.isObject(object.xattrs[i]))
                        throw TypeError(".fs.FolderDiff.xattrs: object expected");
                    message.xattrs[i] = $root.file.XAttrDiff.fromObject(object.xattrs[i], long + 1);
                }
            }
            if (object.removed != null) {
                if (!$util.isObject(object.removed))
                    throw TypeError(".fs.FolderDiff.removed: object expected");
                message.removed = $root.fs.FolderDiff.ItemsByBranches.fromObject(object.removed, long + 1);
            }
            if (object.renamed) {
                if (!Array.isArray(object.renamed))
                    throw TypeError(".fs.FolderDiff.renamed: array expected");
                message.renamed = [];
                for (var i = 0; i < object.renamed.length; ++i) {
                    if (!$util.isObject(object.renamed[i]))
                        throw TypeError(".fs.FolderDiff.renamed: object expected");
                    message.renamed[i] = $root.fs.FolderDiff.Renamed.fromObject(object.renamed[i], long + 1);
                }
            }
            if (object.added != null) {
                if (!$util.isObject(object.added))
                    throw TypeError(".fs.FolderDiff.added: object expected");
                message.added = $root.fs.FolderDiff.ItemsByBranches.fromObject(object.added, long + 1);
            }
            if (object.rekeyed) {
                if (!Array.isArray(object.rekeyed))
                    throw TypeError(".fs.FolderDiff.rekeyed: array expected");
                message.rekeyed = [];
                for (var i = 0; i < object.rekeyed.length; ++i) {
                    if (!$util.isObject(object.rekeyed[i]))
                        throw TypeError(".fs.FolderDiff.rekeyed: object expected");
                    message.rekeyed[i] = $root.fs.FolderDiff.Rekeyed.fromObject(object.rekeyed[i], long + 1);
                }
            }
            if (object.nameOverlaps) {
                if (!Array.isArray(object.nameOverlaps))
                    throw TypeError(".fs.FolderDiff.nameOverlaps: array expected");
                message.nameOverlaps = [];
                for (var i = 0; i < object.nameOverlaps.length; ++i)
                    message.nameOverlaps[i] = String(object.nameOverlaps[i]);
            }
            return message;
        };

        /**
         * Creates a plain object from a FolderDiff message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FolderDiff
         * @static
         * @param {fs.FolderDiff} message FolderDiff
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FolderDiff.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults) {
                object.xattrs = [];
                object.renamed = [];
                object.rekeyed = [];
                object.nameOverlaps = [];
            }
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.currentVersion = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.currentVersion = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.isCurrentLocal = false;
                object.remoteVersion = null;
                object.syncedVersion = null;
                object.isRemoteRemoved = false;
                object.ctime = null;
                object.mtime = null;
                object.removed = null;
                object.added = null;
            }
            if (message.currentVersion != null && Object.hasOwnProperty.call(message, "currentVersion"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.currentVersion = typeof message.currentVersion === "number" ? BigInt(message.currentVersion) : $util.Long.fromBits(message.currentVersion.low >>> 0, message.currentVersion.high >>> 0, true).toBigInt();
                else if (typeof message.currentVersion === "number")
                    object.currentVersion = options.longs === String ? String(message.currentVersion) : message.currentVersion;
                else
                    object.currentVersion = options.longs === String ? $util.Long.prototype.toString.call(message.currentVersion) : options.longs === Number ? new $util.LongBits(message.currentVersion.low >>> 0, message.currentVersion.high >>> 0).toNumber(true) : message.currentVersion;
            if (message.isCurrentLocal != null && Object.hasOwnProperty.call(message, "isCurrentLocal"))
                object.isCurrentLocal = message.isCurrentLocal;
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options, q + 1);
            if (message.syncedVersion != null && Object.hasOwnProperty.call(message, "syncedVersion"))
                object.syncedVersion = $root.common.UInt64Value.toObject(message.syncedVersion, options, q + 1);
            if (message.isRemoteRemoved != null && Object.hasOwnProperty.call(message, "isRemoteRemoved"))
                object.isRemoteRemoved = message.isRemoteRemoved;
            if (message.ctime != null && Object.hasOwnProperty.call(message, "ctime"))
                object.ctime = $root.file.TimeStampsDiff.toObject(message.ctime, options, q + 1);
            if (message.mtime != null && Object.hasOwnProperty.call(message, "mtime"))
                object.mtime = $root.file.TimeStampsDiff.toObject(message.mtime, options, q + 1);
            if (message.xattrs && message.xattrs.length) {
                object.xattrs = [];
                for (var j = 0; j < message.xattrs.length; ++j)
                    object.xattrs[j] = $root.file.XAttrDiff.toObject(message.xattrs[j], options, q + 1);
            }
            if (message.removed != null && Object.hasOwnProperty.call(message, "removed"))
                object.removed = $root.fs.FolderDiff.ItemsByBranches.toObject(message.removed, options, q + 1);
            if (message.renamed && message.renamed.length) {
                object.renamed = [];
                for (var j = 0; j < message.renamed.length; ++j)
                    object.renamed[j] = $root.fs.FolderDiff.Renamed.toObject(message.renamed[j], options, q + 1);
            }
            if (message.added != null && Object.hasOwnProperty.call(message, "added"))
                object.added = $root.fs.FolderDiff.ItemsByBranches.toObject(message.added, options, q + 1);
            if (message.rekeyed && message.rekeyed.length) {
                object.rekeyed = [];
                for (var j = 0; j < message.rekeyed.length; ++j)
                    object.rekeyed[j] = $root.fs.FolderDiff.Rekeyed.toObject(message.rekeyed[j], options, q + 1);
            }
            if (message.nameOverlaps && message.nameOverlaps.length) {
                object.nameOverlaps = [];
                for (var j = 0; j < message.nameOverlaps.length; ++j)
                    object.nameOverlaps[j] = message.nameOverlaps[j];
            }
            return object;
        };

        /**
         * Converts this FolderDiff to JSON.
         * @function toJSON
         * @memberof fs.FolderDiff
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FolderDiff.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FolderDiff
         * @function getTypeUrl
         * @memberof fs.FolderDiff
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FolderDiff.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FolderDiff";
        };

        FolderDiff.ItemsByBranches = (function() {

            /**
             * Properties of an ItemsByBranches.
             * @memberof fs.FolderDiff
             * @interface IItemsByBranches
             * @property {Array.<string>|null} [inLocal] ItemsByBranches inLocal
             * @property {Array.<string>|null} [inRemote] ItemsByBranches inRemote
             */

            /**
             * Constructs a new ItemsByBranches.
             * @memberof fs.FolderDiff
             * @classdesc Represents an ItemsByBranches.
             * @implements IItemsByBranches
             * @constructor
             * @param {fs.FolderDiff.IItemsByBranches=} [properties] Properties to set
             */
            function ItemsByBranches(properties) {
                this.inLocal = [];
                this.inRemote = [];
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * ItemsByBranches inLocal.
             * @member {Array.<string>} inLocal
             * @memberof fs.FolderDiff.ItemsByBranches
             * @instance
             */
            ItemsByBranches.prototype.inLocal = $util.emptyArray;

            /**
             * ItemsByBranches inRemote.
             * @member {Array.<string>} inRemote
             * @memberof fs.FolderDiff.ItemsByBranches
             * @instance
             */
            ItemsByBranches.prototype.inRemote = $util.emptyArray;

            /**
             * Creates a new ItemsByBranches instance using the specified properties.
             * @function create
             * @memberof fs.FolderDiff.ItemsByBranches
             * @static
             * @param {fs.FolderDiff.IItemsByBranches=} [properties] Properties to set
             * @returns {fs.FolderDiff.ItemsByBranches} ItemsByBranches instance
             */
            ItemsByBranches.create = function create(properties) {
                return new ItemsByBranches(properties);
            };

            /**
             * Encodes the specified ItemsByBranches message. Does not implicitly {@link fs.FolderDiff.ItemsByBranches.verify|verify} messages.
             * @function encode
             * @memberof fs.FolderDiff.ItemsByBranches
             * @static
             * @param {fs.FolderDiff.IItemsByBranches} message ItemsByBranches message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            ItemsByBranches.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.inLocal != null && message.inLocal.length)
                    for (var i = 0; i < message.inLocal.length; ++i)
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.inLocal[i]);
                if (message.inRemote != null && message.inRemote.length)
                    for (var i = 0; i < message.inRemote.length; ++i)
                        writer.uint32(/* id 2, wireType 2 =*/18).string(message.inRemote[i]);
                return writer;
            };

            /**
             * Encodes the specified ItemsByBranches message, length delimited. Does not implicitly {@link fs.FolderDiff.ItemsByBranches.verify|verify} messages.
             * @function encodeDelimited
             * @memberof fs.FolderDiff.ItemsByBranches
             * @static
             * @param {fs.FolderDiff.IItemsByBranches} message ItemsByBranches message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            ItemsByBranches.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes an ItemsByBranches message from the specified reader or buffer.
             * @function decode
             * @memberof fs.FolderDiff.ItemsByBranches
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {fs.FolderDiff.ItemsByBranches} ItemsByBranches
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            ItemsByBranches.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FolderDiff.ItemsByBranches();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            if (!(message.inLocal && message.inLocal.length))
                                message.inLocal = [];
                            message.inLocal.push(reader.string());
                            break;
                        }
                    case 2: {
                            if (!(message.inRemote && message.inRemote.length))
                                message.inRemote = [];
                            message.inRemote.push(reader.string());
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes an ItemsByBranches message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof fs.FolderDiff.ItemsByBranches
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {fs.FolderDiff.ItemsByBranches} ItemsByBranches
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            ItemsByBranches.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies an ItemsByBranches message.
             * @function verify
             * @memberof fs.FolderDiff.ItemsByBranches
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            ItemsByBranches.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.inLocal != null && Object.hasOwnProperty.call(message, "inLocal")) {
                    if (!Array.isArray(message.inLocal))
                        return "inLocal: array expected";
                    for (var i = 0; i < message.inLocal.length; ++i)
                        if (!$util.isString(message.inLocal[i]))
                            return "inLocal: string[] expected";
                }
                if (message.inRemote != null && Object.hasOwnProperty.call(message, "inRemote")) {
                    if (!Array.isArray(message.inRemote))
                        return "inRemote: array expected";
                    for (var i = 0; i < message.inRemote.length; ++i)
                        if (!$util.isString(message.inRemote[i]))
                            return "inRemote: string[] expected";
                }
                return null;
            };

            /**
             * Creates an ItemsByBranches message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof fs.FolderDiff.ItemsByBranches
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {fs.FolderDiff.ItemsByBranches} ItemsByBranches
             */
            ItemsByBranches.fromObject = function fromObject(object, long) {
                if (object instanceof $root.fs.FolderDiff.ItemsByBranches)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".fs.FolderDiff.ItemsByBranches: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.fs.FolderDiff.ItemsByBranches();
                if (object.inLocal) {
                    if (!Array.isArray(object.inLocal))
                        throw TypeError(".fs.FolderDiff.ItemsByBranches.inLocal: array expected");
                    message.inLocal = [];
                    for (var i = 0; i < object.inLocal.length; ++i)
                        message.inLocal[i] = String(object.inLocal[i]);
                }
                if (object.inRemote) {
                    if (!Array.isArray(object.inRemote))
                        throw TypeError(".fs.FolderDiff.ItemsByBranches.inRemote: array expected");
                    message.inRemote = [];
                    for (var i = 0; i < object.inRemote.length; ++i)
                        message.inRemote[i] = String(object.inRemote[i]);
                }
                return message;
            };

            /**
             * Creates a plain object from an ItemsByBranches message. Also converts values to other types if specified.
             * @function toObject
             * @memberof fs.FolderDiff.ItemsByBranches
             * @static
             * @param {fs.FolderDiff.ItemsByBranches} message ItemsByBranches
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            ItemsByBranches.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.arrays || options.defaults) {
                    object.inLocal = [];
                    object.inRemote = [];
                }
                if (message.inLocal && message.inLocal.length) {
                    object.inLocal = [];
                    for (var j = 0; j < message.inLocal.length; ++j)
                        object.inLocal[j] = message.inLocal[j];
                }
                if (message.inRemote && message.inRemote.length) {
                    object.inRemote = [];
                    for (var j = 0; j < message.inRemote.length; ++j)
                        object.inRemote[j] = message.inRemote[j];
                }
                return object;
            };

            /**
             * Converts this ItemsByBranches to JSON.
             * @function toJSON
             * @memberof fs.FolderDiff.ItemsByBranches
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            ItemsByBranches.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for ItemsByBranches
             * @function getTypeUrl
             * @memberof fs.FolderDiff.ItemsByBranches
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            ItemsByBranches.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/fs.FolderDiff.ItemsByBranches";
            };

            return ItemsByBranches;
        })();

        FolderDiff.Renamed = (function() {

            /**
             * Properties of a Renamed.
             * @memberof fs.FolderDiff
             * @interface IRenamed
             * @property {string|null} [local] Renamed local
             * @property {string|null} [remote] Renamed remote
             * @property {string|null} [renamedIn] Renamed renamedIn
             */

            /**
             * Constructs a new Renamed.
             * @memberof fs.FolderDiff
             * @classdesc Represents a Renamed.
             * @implements IRenamed
             * @constructor
             * @param {fs.FolderDiff.IRenamed=} [properties] Properties to set
             */
            function Renamed(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * Renamed local.
             * @member {string} local
             * @memberof fs.FolderDiff.Renamed
             * @instance
             */
            Renamed.prototype.local = "";

            /**
             * Renamed remote.
             * @member {string} remote
             * @memberof fs.FolderDiff.Renamed
             * @instance
             */
            Renamed.prototype.remote = "";

            /**
             * Renamed renamedIn.
             * @member {string} renamedIn
             * @memberof fs.FolderDiff.Renamed
             * @instance
             */
            Renamed.prototype.renamedIn = "";

            /**
             * Creates a new Renamed instance using the specified properties.
             * @function create
             * @memberof fs.FolderDiff.Renamed
             * @static
             * @param {fs.FolderDiff.IRenamed=} [properties] Properties to set
             * @returns {fs.FolderDiff.Renamed} Renamed instance
             */
            Renamed.create = function create(properties) {
                return new Renamed(properties);
            };

            /**
             * Encodes the specified Renamed message. Does not implicitly {@link fs.FolderDiff.Renamed.verify|verify} messages.
             * @function encode
             * @memberof fs.FolderDiff.Renamed
             * @static
             * @param {fs.FolderDiff.IRenamed} message Renamed message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Renamed.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.local != null && Object.hasOwnProperty.call(message, "local"))
                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.local);
                if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.remote);
                if (message.renamedIn != null && Object.hasOwnProperty.call(message, "renamedIn"))
                    writer.uint32(/* id 3, wireType 2 =*/26).string(message.renamedIn);
                return writer;
            };

            /**
             * Encodes the specified Renamed message, length delimited. Does not implicitly {@link fs.FolderDiff.Renamed.verify|verify} messages.
             * @function encodeDelimited
             * @memberof fs.FolderDiff.Renamed
             * @static
             * @param {fs.FolderDiff.IRenamed} message Renamed message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Renamed.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes a Renamed message from the specified reader or buffer.
             * @function decode
             * @memberof fs.FolderDiff.Renamed
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {fs.FolderDiff.Renamed} Renamed
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Renamed.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FolderDiff.Renamed();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.local = reader.string();
                            break;
                        }
                    case 2: {
                            message.remote = reader.string();
                            break;
                        }
                    case 3: {
                            message.renamedIn = reader.string();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a Renamed message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof fs.FolderDiff.Renamed
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {fs.FolderDiff.Renamed} Renamed
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Renamed.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a Renamed message.
             * @function verify
             * @memberof fs.FolderDiff.Renamed
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            Renamed.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.local != null && Object.hasOwnProperty.call(message, "local"))
                    if (!$util.isString(message.local))
                        return "local: string expected";
                if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                    if (!$util.isString(message.remote))
                        return "remote: string expected";
                if (message.renamedIn != null && Object.hasOwnProperty.call(message, "renamedIn"))
                    if (!$util.isString(message.renamedIn))
                        return "renamedIn: string expected";
                return null;
            };

            /**
             * Creates a Renamed message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof fs.FolderDiff.Renamed
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {fs.FolderDiff.Renamed} Renamed
             */
            Renamed.fromObject = function fromObject(object, long) {
                if (object instanceof $root.fs.FolderDiff.Renamed)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".fs.FolderDiff.Renamed: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.fs.FolderDiff.Renamed();
                if (object.local != null)
                    message.local = String(object.local);
                if (object.remote != null)
                    message.remote = String(object.remote);
                if (object.renamedIn != null)
                    message.renamedIn = String(object.renamedIn);
                return message;
            };

            /**
             * Creates a plain object from a Renamed message. Also converts values to other types if specified.
             * @function toObject
             * @memberof fs.FolderDiff.Renamed
             * @static
             * @param {fs.FolderDiff.Renamed} message Renamed
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            Renamed.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults) {
                    object.local = "";
                    object.remote = "";
                    object.renamedIn = "";
                }
                if (message.local != null && Object.hasOwnProperty.call(message, "local"))
                    object.local = message.local;
                if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                    object.remote = message.remote;
                if (message.renamedIn != null && Object.hasOwnProperty.call(message, "renamedIn"))
                    object.renamedIn = message.renamedIn;
                return object;
            };

            /**
             * Converts this Renamed to JSON.
             * @function toJSON
             * @memberof fs.FolderDiff.Renamed
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            Renamed.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for Renamed
             * @function getTypeUrl
             * @memberof fs.FolderDiff.Renamed
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            Renamed.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/fs.FolderDiff.Renamed";
            };

            return Renamed;
        })();

        FolderDiff.Rekeyed = (function() {

            /**
             * Properties of a Rekeyed.
             * @memberof fs.FolderDiff
             * @interface IRekeyed
             * @property {string|null} [local] Rekeyed local
             * @property {string|null} [remote] Rekeyed remote
             * @property {string|null} [rekeyedIn] Rekeyed rekeyedIn
             */

            /**
             * Constructs a new Rekeyed.
             * @memberof fs.FolderDiff
             * @classdesc Represents a Rekeyed.
             * @implements IRekeyed
             * @constructor
             * @param {fs.FolderDiff.IRekeyed=} [properties] Properties to set
             */
            function Rekeyed(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * Rekeyed local.
             * @member {string} local
             * @memberof fs.FolderDiff.Rekeyed
             * @instance
             */
            Rekeyed.prototype.local = "";

            /**
             * Rekeyed remote.
             * @member {string} remote
             * @memberof fs.FolderDiff.Rekeyed
             * @instance
             */
            Rekeyed.prototype.remote = "";

            /**
             * Rekeyed rekeyedIn.
             * @member {string} rekeyedIn
             * @memberof fs.FolderDiff.Rekeyed
             * @instance
             */
            Rekeyed.prototype.rekeyedIn = "";

            /**
             * Creates a new Rekeyed instance using the specified properties.
             * @function create
             * @memberof fs.FolderDiff.Rekeyed
             * @static
             * @param {fs.FolderDiff.IRekeyed=} [properties] Properties to set
             * @returns {fs.FolderDiff.Rekeyed} Rekeyed instance
             */
            Rekeyed.create = function create(properties) {
                return new Rekeyed(properties);
            };

            /**
             * Encodes the specified Rekeyed message. Does not implicitly {@link fs.FolderDiff.Rekeyed.verify|verify} messages.
             * @function encode
             * @memberof fs.FolderDiff.Rekeyed
             * @static
             * @param {fs.FolderDiff.IRekeyed} message Rekeyed message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Rekeyed.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.local != null && Object.hasOwnProperty.call(message, "local"))
                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.local);
                if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.remote);
                if (message.rekeyedIn != null && Object.hasOwnProperty.call(message, "rekeyedIn"))
                    writer.uint32(/* id 3, wireType 2 =*/26).string(message.rekeyedIn);
                return writer;
            };

            /**
             * Encodes the specified Rekeyed message, length delimited. Does not implicitly {@link fs.FolderDiff.Rekeyed.verify|verify} messages.
             * @function encodeDelimited
             * @memberof fs.FolderDiff.Rekeyed
             * @static
             * @param {fs.FolderDiff.IRekeyed} message Rekeyed message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Rekeyed.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes a Rekeyed message from the specified reader or buffer.
             * @function decode
             * @memberof fs.FolderDiff.Rekeyed
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {fs.FolderDiff.Rekeyed} Rekeyed
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Rekeyed.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FolderDiff.Rekeyed();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.local = reader.string();
                            break;
                        }
                    case 2: {
                            message.remote = reader.string();
                            break;
                        }
                    case 3: {
                            message.rekeyedIn = reader.string();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a Rekeyed message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof fs.FolderDiff.Rekeyed
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {fs.FolderDiff.Rekeyed} Rekeyed
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Rekeyed.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a Rekeyed message.
             * @function verify
             * @memberof fs.FolderDiff.Rekeyed
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            Rekeyed.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.local != null && Object.hasOwnProperty.call(message, "local"))
                    if (!$util.isString(message.local))
                        return "local: string expected";
                if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                    if (!$util.isString(message.remote))
                        return "remote: string expected";
                if (message.rekeyedIn != null && Object.hasOwnProperty.call(message, "rekeyedIn"))
                    if (!$util.isString(message.rekeyedIn))
                        return "rekeyedIn: string expected";
                return null;
            };

            /**
             * Creates a Rekeyed message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof fs.FolderDiff.Rekeyed
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {fs.FolderDiff.Rekeyed} Rekeyed
             */
            Rekeyed.fromObject = function fromObject(object, long) {
                if (object instanceof $root.fs.FolderDiff.Rekeyed)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".fs.FolderDiff.Rekeyed: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.fs.FolderDiff.Rekeyed();
                if (object.local != null)
                    message.local = String(object.local);
                if (object.remote != null)
                    message.remote = String(object.remote);
                if (object.rekeyedIn != null)
                    message.rekeyedIn = String(object.rekeyedIn);
                return message;
            };

            /**
             * Creates a plain object from a Rekeyed message. Also converts values to other types if specified.
             * @function toObject
             * @memberof fs.FolderDiff.Rekeyed
             * @static
             * @param {fs.FolderDiff.Rekeyed} message Rekeyed
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            Rekeyed.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults) {
                    object.local = "";
                    object.remote = "";
                    object.rekeyedIn = "";
                }
                if (message.local != null && Object.hasOwnProperty.call(message, "local"))
                    object.local = message.local;
                if (message.remote != null && Object.hasOwnProperty.call(message, "remote"))
                    object.remote = message.remote;
                if (message.rekeyedIn != null && Object.hasOwnProperty.call(message, "rekeyedIn"))
                    object.rekeyedIn = message.rekeyedIn;
                return object;
            };

            /**
             * Converts this Rekeyed to JSON.
             * @function toJSON
             * @memberof fs.FolderDiff.Rekeyed
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            Rekeyed.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for Rekeyed
             * @function getTypeUrl
             * @memberof fs.FolderDiff.Rekeyed
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            Rekeyed.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/fs.FolderDiff.Rekeyed";
            };

            return Rekeyed;
        })();

        return FolderDiff;
    })();

    fs.RemoteChildRequestBody = (function() {

        /**
         * Properties of a RemoteChildRequestBody.
         * @memberof fs
         * @interface IRemoteChildRequestBody
         * @property {string|null} [path] RemoteChildRequestBody path
         * @property {string|null} [remoteItemName] RemoteChildRequestBody remoteItemName
         * @property {common.IUInt64Value|null} [remoteVersion] RemoteChildRequestBody remoteVersion
         */

        /**
         * Constructs a new RemoteChildRequestBody.
         * @memberof fs
         * @classdesc Represents a RemoteChildRequestBody.
         * @implements IRemoteChildRequestBody
         * @constructor
         * @param {fs.IRemoteChildRequestBody=} [properties] Properties to set
         */
        function RemoteChildRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * RemoteChildRequestBody path.
         * @member {string} path
         * @memberof fs.RemoteChildRequestBody
         * @instance
         */
        RemoteChildRequestBody.prototype.path = "";

        /**
         * RemoteChildRequestBody remoteItemName.
         * @member {string} remoteItemName
         * @memberof fs.RemoteChildRequestBody
         * @instance
         */
        RemoteChildRequestBody.prototype.remoteItemName = "";

        /**
         * RemoteChildRequestBody remoteVersion.
         * @member {common.IUInt64Value|null|undefined} remoteVersion
         * @memberof fs.RemoteChildRequestBody
         * @instance
         */
        RemoteChildRequestBody.prototype.remoteVersion = null;

        /**
         * Creates a new RemoteChildRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.RemoteChildRequestBody
         * @static
         * @param {fs.IRemoteChildRequestBody=} [properties] Properties to set
         * @returns {fs.RemoteChildRequestBody} RemoteChildRequestBody instance
         */
        RemoteChildRequestBody.create = function create(properties) {
            return new RemoteChildRequestBody(properties);
        };

        /**
         * Encodes the specified RemoteChildRequestBody message. Does not implicitly {@link fs.RemoteChildRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.RemoteChildRequestBody
         * @static
         * @param {fs.IRemoteChildRequestBody} message RemoteChildRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        RemoteChildRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.remoteItemName != null && Object.hasOwnProperty.call(message, "remoteItemName"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.remoteItemName);
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified RemoteChildRequestBody message, length delimited. Does not implicitly {@link fs.RemoteChildRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.RemoteChildRequestBody
         * @static
         * @param {fs.IRemoteChildRequestBody} message RemoteChildRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        RemoteChildRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a RemoteChildRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.RemoteChildRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.RemoteChildRequestBody} RemoteChildRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        RemoteChildRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.RemoteChildRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.remoteItemName = reader.string();
                        break;
                    }
                case 3: {
                        message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a RemoteChildRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.RemoteChildRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.RemoteChildRequestBody} RemoteChildRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        RemoteChildRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a RemoteChildRequestBody message.
         * @function verify
         * @memberof fs.RemoteChildRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        RemoteChildRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.remoteItemName != null && Object.hasOwnProperty.call(message, "remoteItemName"))
                if (!$util.isString(message.remoteItemName))
                    return "remoteItemName: string expected";
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion")) {
                var error = $root.common.UInt64Value.verify(message.remoteVersion, long + 1);
                if (error)
                    return "remoteVersion." + error;
            }
            return null;
        };

        /**
         * Creates a RemoteChildRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.RemoteChildRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.RemoteChildRequestBody} RemoteChildRequestBody
         */
        RemoteChildRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.RemoteChildRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.RemoteChildRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.RemoteChildRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.remoteItemName != null)
                message.remoteItemName = String(object.remoteItemName);
            if (object.remoteVersion != null) {
                if (!$util.isObject(object.remoteVersion))
                    throw TypeError(".fs.RemoteChildRequestBody.remoteVersion: object expected");
                message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a RemoteChildRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.RemoteChildRequestBody
         * @static
         * @param {fs.RemoteChildRequestBody} message RemoteChildRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        RemoteChildRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.remoteItemName = "";
                object.remoteVersion = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.remoteItemName != null && Object.hasOwnProperty.call(message, "remoteItemName"))
                object.remoteItemName = message.remoteItemName;
            if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options, q + 1);
            return object;
        };

        /**
         * Converts this RemoteChildRequestBody to JSON.
         * @function toJSON
         * @memberof fs.RemoteChildRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        RemoteChildRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for RemoteChildRequestBody
         * @function getTypeUrl
         * @memberof fs.RemoteChildRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        RemoteChildRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.RemoteChildRequestBody";
        };

        return RemoteChildRequestBody;
    })();

    fs.FSSyncUploadRequestBody = (function() {

        /**
         * Properties of a FSSyncUploadRequestBody.
         * @memberof fs
         * @interface IFSSyncUploadRequestBody
         * @property {string|null} [path] FSSyncUploadRequestBody path
         * @property {file.IOptionsToUploadLocal|null} [opts] FSSyncUploadRequestBody opts
         */

        /**
         * Constructs a new FSSyncUploadRequestBody.
         * @memberof fs
         * @classdesc Represents a FSSyncUploadRequestBody.
         * @implements IFSSyncUploadRequestBody
         * @constructor
         * @param {fs.IFSSyncUploadRequestBody=} [properties] Properties to set
         */
        function FSSyncUploadRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FSSyncUploadRequestBody path.
         * @member {string} path
         * @memberof fs.FSSyncUploadRequestBody
         * @instance
         */
        FSSyncUploadRequestBody.prototype.path = "";

        /**
         * FSSyncUploadRequestBody opts.
         * @member {file.IOptionsToUploadLocal|null|undefined} opts
         * @memberof fs.FSSyncUploadRequestBody
         * @instance
         */
        FSSyncUploadRequestBody.prototype.opts = null;

        /**
         * Creates a new FSSyncUploadRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.FSSyncUploadRequestBody
         * @static
         * @param {fs.IFSSyncUploadRequestBody=} [properties] Properties to set
         * @returns {fs.FSSyncUploadRequestBody} FSSyncUploadRequestBody instance
         */
        FSSyncUploadRequestBody.create = function create(properties) {
            return new FSSyncUploadRequestBody(properties);
        };

        /**
         * Encodes the specified FSSyncUploadRequestBody message. Does not implicitly {@link fs.FSSyncUploadRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.FSSyncUploadRequestBody
         * @static
         * @param {fs.IFSSyncUploadRequestBody} message FSSyncUploadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncUploadRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.file.OptionsToUploadLocal.encode(message.opts, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FSSyncUploadRequestBody message, length delimited. Does not implicitly {@link fs.FSSyncUploadRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.FSSyncUploadRequestBody
         * @static
         * @param {fs.IFSSyncUploadRequestBody} message FSSyncUploadRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FSSyncUploadRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FSSyncUploadRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.FSSyncUploadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.FSSyncUploadRequestBody} FSSyncUploadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSSyncUploadRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.FSSyncUploadRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.opts = $root.file.OptionsToUploadLocal.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FSSyncUploadRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.FSSyncUploadRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.FSSyncUploadRequestBody} FSSyncUploadRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FSSyncUploadRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FSSyncUploadRequestBody message.
         * @function verify
         * @memberof fs.FSSyncUploadRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FSSyncUploadRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts")) {
                var error = $root.file.OptionsToUploadLocal.verify(message.opts, long + 1);
                if (error)
                    return "opts." + error;
            }
            return null;
        };

        /**
         * Creates a FSSyncUploadRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.FSSyncUploadRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.FSSyncUploadRequestBody} FSSyncUploadRequestBody
         */
        FSSyncUploadRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.FSSyncUploadRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.FSSyncUploadRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.FSSyncUploadRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.opts != null) {
                if (!$util.isObject(object.opts))
                    throw TypeError(".fs.FSSyncUploadRequestBody.opts: object expected");
                message.opts = $root.file.OptionsToUploadLocal.fromObject(object.opts, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a FSSyncUploadRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.FSSyncUploadRequestBody
         * @static
         * @param {fs.FSSyncUploadRequestBody} message FSSyncUploadRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FSSyncUploadRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.opts = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                object.opts = $root.file.OptionsToUploadLocal.toObject(message.opts, options, q + 1);
            return object;
        };

        /**
         * Converts this FSSyncUploadRequestBody to JSON.
         * @function toJSON
         * @memberof fs.FSSyncUploadRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FSSyncUploadRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FSSyncUploadRequestBody
         * @function getTypeUrl
         * @memberof fs.FSSyncUploadRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FSSyncUploadRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.FSSyncUploadRequestBody";
        };

        return FSSyncUploadRequestBody;
    })();

    fs.AdoptRemoteFolderItemRequestBody = (function() {

        /**
         * Properties of an AdoptRemoteFolderItemRequestBody.
         * @memberof fs
         * @interface IAdoptRemoteFolderItemRequestBody
         * @property {string|null} [path] AdoptRemoteFolderItemRequestBody path
         * @property {string|null} [itemName] AdoptRemoteFolderItemRequestBody itemName
         * @property {fs.AdoptRemoteFolderItemRequestBody.IOptions|null} [opts] AdoptRemoteFolderItemRequestBody opts
         */

        /**
         * Constructs a new AdoptRemoteFolderItemRequestBody.
         * @memberof fs
         * @classdesc Represents an AdoptRemoteFolderItemRequestBody.
         * @implements IAdoptRemoteFolderItemRequestBody
         * @constructor
         * @param {fs.IAdoptRemoteFolderItemRequestBody=} [properties] Properties to set
         */
        function AdoptRemoteFolderItemRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * AdoptRemoteFolderItemRequestBody path.
         * @member {string} path
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @instance
         */
        AdoptRemoteFolderItemRequestBody.prototype.path = "";

        /**
         * AdoptRemoteFolderItemRequestBody itemName.
         * @member {string} itemName
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @instance
         */
        AdoptRemoteFolderItemRequestBody.prototype.itemName = "";

        /**
         * AdoptRemoteFolderItemRequestBody opts.
         * @member {fs.AdoptRemoteFolderItemRequestBody.IOptions|null|undefined} opts
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @instance
         */
        AdoptRemoteFolderItemRequestBody.prototype.opts = null;

        /**
         * Creates a new AdoptRemoteFolderItemRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @static
         * @param {fs.IAdoptRemoteFolderItemRequestBody=} [properties] Properties to set
         * @returns {fs.AdoptRemoteFolderItemRequestBody} AdoptRemoteFolderItemRequestBody instance
         */
        AdoptRemoteFolderItemRequestBody.create = function create(properties) {
            return new AdoptRemoteFolderItemRequestBody(properties);
        };

        /**
         * Encodes the specified AdoptRemoteFolderItemRequestBody message. Does not implicitly {@link fs.AdoptRemoteFolderItemRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @static
         * @param {fs.IAdoptRemoteFolderItemRequestBody} message AdoptRemoteFolderItemRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AdoptRemoteFolderItemRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.itemName != null && Object.hasOwnProperty.call(message, "itemName"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.itemName);
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.fs.AdoptRemoteFolderItemRequestBody.Options.encode(message.opts, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified AdoptRemoteFolderItemRequestBody message, length delimited. Does not implicitly {@link fs.AdoptRemoteFolderItemRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @static
         * @param {fs.IAdoptRemoteFolderItemRequestBody} message AdoptRemoteFolderItemRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AdoptRemoteFolderItemRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an AdoptRemoteFolderItemRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.AdoptRemoteFolderItemRequestBody} AdoptRemoteFolderItemRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AdoptRemoteFolderItemRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.AdoptRemoteFolderItemRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.itemName = reader.string();
                        break;
                    }
                case 3: {
                        message.opts = $root.fs.AdoptRemoteFolderItemRequestBody.Options.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an AdoptRemoteFolderItemRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.AdoptRemoteFolderItemRequestBody} AdoptRemoteFolderItemRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AdoptRemoteFolderItemRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an AdoptRemoteFolderItemRequestBody message.
         * @function verify
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        AdoptRemoteFolderItemRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.itemName != null && Object.hasOwnProperty.call(message, "itemName"))
                if (!$util.isString(message.itemName))
                    return "itemName: string expected";
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts")) {
                var error = $root.fs.AdoptRemoteFolderItemRequestBody.Options.verify(message.opts, long + 1);
                if (error)
                    return "opts." + error;
            }
            return null;
        };

        /**
         * Creates an AdoptRemoteFolderItemRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.AdoptRemoteFolderItemRequestBody} AdoptRemoteFolderItemRequestBody
         */
        AdoptRemoteFolderItemRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.AdoptRemoteFolderItemRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.AdoptRemoteFolderItemRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.AdoptRemoteFolderItemRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.itemName != null)
                message.itemName = String(object.itemName);
            if (object.opts != null) {
                if (!$util.isObject(object.opts))
                    throw TypeError(".fs.AdoptRemoteFolderItemRequestBody.opts: object expected");
                message.opts = $root.fs.AdoptRemoteFolderItemRequestBody.Options.fromObject(object.opts, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an AdoptRemoteFolderItemRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @static
         * @param {fs.AdoptRemoteFolderItemRequestBody} message AdoptRemoteFolderItemRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        AdoptRemoteFolderItemRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.itemName = "";
                object.opts = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.itemName != null && Object.hasOwnProperty.call(message, "itemName"))
                object.itemName = message.itemName;
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                object.opts = $root.fs.AdoptRemoteFolderItemRequestBody.Options.toObject(message.opts, options, q + 1);
            return object;
        };

        /**
         * Converts this AdoptRemoteFolderItemRequestBody to JSON.
         * @function toJSON
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        AdoptRemoteFolderItemRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for AdoptRemoteFolderItemRequestBody
         * @function getTypeUrl
         * @memberof fs.AdoptRemoteFolderItemRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        AdoptRemoteFolderItemRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.AdoptRemoteFolderItemRequestBody";
        };

        AdoptRemoteFolderItemRequestBody.Options = (function() {

            /**
             * Properties of an Options.
             * @memberof fs.AdoptRemoteFolderItemRequestBody
             * @interface IOptions
             * @property {common.IUInt64Value|null} [localVersion] Options localVersion
             * @property {common.IUInt64Value|null} [uploadVersion] Options uploadVersion
             * @property {common.IBooleanValue|null} [replaceLocalItem] Options replaceLocalItem
             * @property {common.IStringValue|null} [newItemName] Options newItemName
             */

            /**
             * Constructs a new Options.
             * @memberof fs.AdoptRemoteFolderItemRequestBody
             * @classdesc Represents an Options.
             * @implements IOptions
             * @constructor
             * @param {fs.AdoptRemoteFolderItemRequestBody.IOptions=} [properties] Properties to set
             */
            function Options(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * Options localVersion.
             * @member {common.IUInt64Value|null|undefined} localVersion
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @instance
             */
            Options.prototype.localVersion = null;

            /**
             * Options uploadVersion.
             * @member {common.IUInt64Value|null|undefined} uploadVersion
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @instance
             */
            Options.prototype.uploadVersion = null;

            /**
             * Options replaceLocalItem.
             * @member {common.IBooleanValue|null|undefined} replaceLocalItem
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @instance
             */
            Options.prototype.replaceLocalItem = null;

            /**
             * Options newItemName.
             * @member {common.IStringValue|null|undefined} newItemName
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @instance
             */
            Options.prototype.newItemName = null;

            /**
             * Creates a new Options instance using the specified properties.
             * @function create
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @static
             * @param {fs.AdoptRemoteFolderItemRequestBody.IOptions=} [properties] Properties to set
             * @returns {fs.AdoptRemoteFolderItemRequestBody.Options} Options instance
             */
            Options.create = function create(properties) {
                return new Options(properties);
            };

            /**
             * Encodes the specified Options message. Does not implicitly {@link fs.AdoptRemoteFolderItemRequestBody.Options.verify|verify} messages.
             * @function encode
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @static
             * @param {fs.AdoptRemoteFolderItemRequestBody.IOptions} message Options message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Options.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                    $root.common.UInt64Value.encode(message.localVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
                if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                    $root.common.UInt64Value.encode(message.uploadVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
                if (message.replaceLocalItem != null && Object.hasOwnProperty.call(message, "replaceLocalItem"))
                    $root.common.BooleanValue.encode(message.replaceLocalItem, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
                if (message.newItemName != null && Object.hasOwnProperty.call(message, "newItemName"))
                    $root.common.StringValue.encode(message.newItemName, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
                return writer;
            };

            /**
             * Encodes the specified Options message, length delimited. Does not implicitly {@link fs.AdoptRemoteFolderItemRequestBody.Options.verify|verify} messages.
             * @function encodeDelimited
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @static
             * @param {fs.AdoptRemoteFolderItemRequestBody.IOptions} message Options message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Options.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes an Options message from the specified reader or buffer.
             * @function decode
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {fs.AdoptRemoteFolderItemRequestBody.Options} Options
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Options.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.AdoptRemoteFolderItemRequestBody.Options();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.localVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 2: {
                            message.uploadVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 3: {
                            message.replaceLocalItem = $root.common.BooleanValue.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 4: {
                            message.newItemName = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes an Options message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {fs.AdoptRemoteFolderItemRequestBody.Options} Options
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Options.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies an Options message.
             * @function verify
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            Options.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion")) {
                    var error = $root.common.UInt64Value.verify(message.localVersion, long + 1);
                    if (error)
                        return "localVersion." + error;
                }
                if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion")) {
                    var error = $root.common.UInt64Value.verify(message.uploadVersion, long + 1);
                    if (error)
                        return "uploadVersion." + error;
                }
                if (message.replaceLocalItem != null && Object.hasOwnProperty.call(message, "replaceLocalItem")) {
                    var error = $root.common.BooleanValue.verify(message.replaceLocalItem, long + 1);
                    if (error)
                        return "replaceLocalItem." + error;
                }
                if (message.newItemName != null && Object.hasOwnProperty.call(message, "newItemName")) {
                    var error = $root.common.StringValue.verify(message.newItemName, long + 1);
                    if (error)
                        return "newItemName." + error;
                }
                return null;
            };

            /**
             * Creates an Options message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {fs.AdoptRemoteFolderItemRequestBody.Options} Options
             */
            Options.fromObject = function fromObject(object, long) {
                if (object instanceof $root.fs.AdoptRemoteFolderItemRequestBody.Options)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".fs.AdoptRemoteFolderItemRequestBody.Options: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.fs.AdoptRemoteFolderItemRequestBody.Options();
                if (object.localVersion != null) {
                    if (!$util.isObject(object.localVersion))
                        throw TypeError(".fs.AdoptRemoteFolderItemRequestBody.Options.localVersion: object expected");
                    message.localVersion = $root.common.UInt64Value.fromObject(object.localVersion, long + 1);
                }
                if (object.uploadVersion != null) {
                    if (!$util.isObject(object.uploadVersion))
                        throw TypeError(".fs.AdoptRemoteFolderItemRequestBody.Options.uploadVersion: object expected");
                    message.uploadVersion = $root.common.UInt64Value.fromObject(object.uploadVersion, long + 1);
                }
                if (object.replaceLocalItem != null) {
                    if (!$util.isObject(object.replaceLocalItem))
                        throw TypeError(".fs.AdoptRemoteFolderItemRequestBody.Options.replaceLocalItem: object expected");
                    message.replaceLocalItem = $root.common.BooleanValue.fromObject(object.replaceLocalItem, long + 1);
                }
                if (object.newItemName != null) {
                    if (!$util.isObject(object.newItemName))
                        throw TypeError(".fs.AdoptRemoteFolderItemRequestBody.Options.newItemName: object expected");
                    message.newItemName = $root.common.StringValue.fromObject(object.newItemName, long + 1);
                }
                return message;
            };

            /**
             * Creates a plain object from an Options message. Also converts values to other types if specified.
             * @function toObject
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @static
             * @param {fs.AdoptRemoteFolderItemRequestBody.Options} message Options
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            Options.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults) {
                    object.localVersion = null;
                    object.uploadVersion = null;
                    object.replaceLocalItem = null;
                    object.newItemName = null;
                }
                if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                    object.localVersion = $root.common.UInt64Value.toObject(message.localVersion, options, q + 1);
                if (message.uploadVersion != null && Object.hasOwnProperty.call(message, "uploadVersion"))
                    object.uploadVersion = $root.common.UInt64Value.toObject(message.uploadVersion, options, q + 1);
                if (message.replaceLocalItem != null && Object.hasOwnProperty.call(message, "replaceLocalItem"))
                    object.replaceLocalItem = $root.common.BooleanValue.toObject(message.replaceLocalItem, options, q + 1);
                if (message.newItemName != null && Object.hasOwnProperty.call(message, "newItemName"))
                    object.newItemName = $root.common.StringValue.toObject(message.newItemName, options, q + 1);
                return object;
            };

            /**
             * Converts this Options to JSON.
             * @function toJSON
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            Options.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for Options
             * @function getTypeUrl
             * @memberof fs.AdoptRemoteFolderItemRequestBody.Options
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            Options.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/fs.AdoptRemoteFolderItemRequestBody.Options";
            };

            return Options;
        })();

        return AdoptRemoteFolderItemRequestBody;
    })();

    fs.AbsorbRemoteFolderChangesRequestBody = (function() {

        /**
         * Properties of an AbsorbRemoteFolderChangesRequestBody.
         * @memberof fs
         * @interface IAbsorbRemoteFolderChangesRequestBody
         * @property {string|null} [path] AbsorbRemoteFolderChangesRequestBody path
         * @property {fs.AbsorbRemoteFolderChangesRequestBody.IOptions|null} [opts] AbsorbRemoteFolderChangesRequestBody opts
         */

        /**
         * Constructs a new AbsorbRemoteFolderChangesRequestBody.
         * @memberof fs
         * @classdesc Represents an AbsorbRemoteFolderChangesRequestBody.
         * @implements IAbsorbRemoteFolderChangesRequestBody
         * @constructor
         * @param {fs.IAbsorbRemoteFolderChangesRequestBody=} [properties] Properties to set
         */
        function AbsorbRemoteFolderChangesRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * AbsorbRemoteFolderChangesRequestBody path.
         * @member {string} path
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @instance
         */
        AbsorbRemoteFolderChangesRequestBody.prototype.path = "";

        /**
         * AbsorbRemoteFolderChangesRequestBody opts.
         * @member {fs.AbsorbRemoteFolderChangesRequestBody.IOptions|null|undefined} opts
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @instance
         */
        AbsorbRemoteFolderChangesRequestBody.prototype.opts = null;

        /**
         * Creates a new AbsorbRemoteFolderChangesRequestBody instance using the specified properties.
         * @function create
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @static
         * @param {fs.IAbsorbRemoteFolderChangesRequestBody=} [properties] Properties to set
         * @returns {fs.AbsorbRemoteFolderChangesRequestBody} AbsorbRemoteFolderChangesRequestBody instance
         */
        AbsorbRemoteFolderChangesRequestBody.create = function create(properties) {
            return new AbsorbRemoteFolderChangesRequestBody(properties);
        };

        /**
         * Encodes the specified AbsorbRemoteFolderChangesRequestBody message. Does not implicitly {@link fs.AbsorbRemoteFolderChangesRequestBody.verify|verify} messages.
         * @function encode
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @static
         * @param {fs.IAbsorbRemoteFolderChangesRequestBody} message AbsorbRemoteFolderChangesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AbsorbRemoteFolderChangesRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.path);
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                $root.fs.AbsorbRemoteFolderChangesRequestBody.Options.encode(message.opts, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified AbsorbRemoteFolderChangesRequestBody message, length delimited. Does not implicitly {@link fs.AbsorbRemoteFolderChangesRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @static
         * @param {fs.IAbsorbRemoteFolderChangesRequestBody} message AbsorbRemoteFolderChangesRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AbsorbRemoteFolderChangesRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an AbsorbRemoteFolderChangesRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.AbsorbRemoteFolderChangesRequestBody} AbsorbRemoteFolderChangesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AbsorbRemoteFolderChangesRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.AbsorbRemoteFolderChangesRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.path = reader.string();
                        break;
                    }
                case 2: {
                        message.opts = $root.fs.AbsorbRemoteFolderChangesRequestBody.Options.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an AbsorbRemoteFolderChangesRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.AbsorbRemoteFolderChangesRequestBody} AbsorbRemoteFolderChangesRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AbsorbRemoteFolderChangesRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an AbsorbRemoteFolderChangesRequestBody message.
         * @function verify
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        AbsorbRemoteFolderChangesRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                if (!$util.isString(message.path))
                    return "path: string expected";
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts")) {
                var error = $root.fs.AbsorbRemoteFolderChangesRequestBody.Options.verify(message.opts, long + 1);
                if (error)
                    return "opts." + error;
            }
            return null;
        };

        /**
         * Creates an AbsorbRemoteFolderChangesRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.AbsorbRemoteFolderChangesRequestBody} AbsorbRemoteFolderChangesRequestBody
         */
        AbsorbRemoteFolderChangesRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.AbsorbRemoteFolderChangesRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.AbsorbRemoteFolderChangesRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.AbsorbRemoteFolderChangesRequestBody();
            if (object.path != null)
                message.path = String(object.path);
            if (object.opts != null) {
                if (!$util.isObject(object.opts))
                    throw TypeError(".fs.AbsorbRemoteFolderChangesRequestBody.opts: object expected");
                message.opts = $root.fs.AbsorbRemoteFolderChangesRequestBody.Options.fromObject(object.opts, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an AbsorbRemoteFolderChangesRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @static
         * @param {fs.AbsorbRemoteFolderChangesRequestBody} message AbsorbRemoteFolderChangesRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        AbsorbRemoteFolderChangesRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.path = "";
                object.opts = null;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = message.path;
            if (message.opts != null && Object.hasOwnProperty.call(message, "opts"))
                object.opts = $root.fs.AbsorbRemoteFolderChangesRequestBody.Options.toObject(message.opts, options, q + 1);
            return object;
        };

        /**
         * Converts this AbsorbRemoteFolderChangesRequestBody to JSON.
         * @function toJSON
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        AbsorbRemoteFolderChangesRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for AbsorbRemoteFolderChangesRequestBody
         * @function getTypeUrl
         * @memberof fs.AbsorbRemoteFolderChangesRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        AbsorbRemoteFolderChangesRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.AbsorbRemoteFolderChangesRequestBody";
        };

        AbsorbRemoteFolderChangesRequestBody.Options = (function() {

            /**
             * Properties of an Options.
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody
             * @interface IOptions
             * @property {common.IUInt64Value|null} [localVersion] Options localVersion
             * @property {common.IStringValue|null} [postfixForNameOverlaps] Options postfixForNameOverlaps
             * @property {common.IUInt64Value|null} [remoteVersion] Options remoteVersion
             */

            /**
             * Constructs a new Options.
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody
             * @classdesc Represents an Options.
             * @implements IOptions
             * @constructor
             * @param {fs.AbsorbRemoteFolderChangesRequestBody.IOptions=} [properties] Properties to set
             */
            function Options(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * Options localVersion.
             * @member {common.IUInt64Value|null|undefined} localVersion
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @instance
             */
            Options.prototype.localVersion = null;

            /**
             * Options postfixForNameOverlaps.
             * @member {common.IStringValue|null|undefined} postfixForNameOverlaps
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @instance
             */
            Options.prototype.postfixForNameOverlaps = null;

            /**
             * Options remoteVersion.
             * @member {common.IUInt64Value|null|undefined} remoteVersion
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @instance
             */
            Options.prototype.remoteVersion = null;

            /**
             * Creates a new Options instance using the specified properties.
             * @function create
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @static
             * @param {fs.AbsorbRemoteFolderChangesRequestBody.IOptions=} [properties] Properties to set
             * @returns {fs.AbsorbRemoteFolderChangesRequestBody.Options} Options instance
             */
            Options.create = function create(properties) {
                return new Options(properties);
            };

            /**
             * Encodes the specified Options message. Does not implicitly {@link fs.AbsorbRemoteFolderChangesRequestBody.Options.verify|verify} messages.
             * @function encode
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @static
             * @param {fs.AbsorbRemoteFolderChangesRequestBody.IOptions} message Options message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Options.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                    $root.common.UInt64Value.encode(message.localVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
                if (message.postfixForNameOverlaps != null && Object.hasOwnProperty.call(message, "postfixForNameOverlaps"))
                    $root.common.StringValue.encode(message.postfixForNameOverlaps, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
                if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                    $root.common.UInt64Value.encode(message.remoteVersion, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
                return writer;
            };

            /**
             * Encodes the specified Options message, length delimited. Does not implicitly {@link fs.AbsorbRemoteFolderChangesRequestBody.Options.verify|verify} messages.
             * @function encodeDelimited
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @static
             * @param {fs.AbsorbRemoteFolderChangesRequestBody.IOptions} message Options message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Options.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes an Options message from the specified reader or buffer.
             * @function decode
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {fs.AbsorbRemoteFolderChangesRequestBody.Options} Options
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Options.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.AbsorbRemoteFolderChangesRequestBody.Options();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.localVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 2: {
                            message.postfixForNameOverlaps = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 3: {
                            message.remoteVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes an Options message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {fs.AbsorbRemoteFolderChangesRequestBody.Options} Options
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Options.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies an Options message.
             * @function verify
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            Options.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion")) {
                    var error = $root.common.UInt64Value.verify(message.localVersion, long + 1);
                    if (error)
                        return "localVersion." + error;
                }
                if (message.postfixForNameOverlaps != null && Object.hasOwnProperty.call(message, "postfixForNameOverlaps")) {
                    var error = $root.common.StringValue.verify(message.postfixForNameOverlaps, long + 1);
                    if (error)
                        return "postfixForNameOverlaps." + error;
                }
                if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion")) {
                    var error = $root.common.UInt64Value.verify(message.remoteVersion, long + 1);
                    if (error)
                        return "remoteVersion." + error;
                }
                return null;
            };

            /**
             * Creates an Options message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {fs.AbsorbRemoteFolderChangesRequestBody.Options} Options
             */
            Options.fromObject = function fromObject(object, long) {
                if (object instanceof $root.fs.AbsorbRemoteFolderChangesRequestBody.Options)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".fs.AbsorbRemoteFolderChangesRequestBody.Options: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.fs.AbsorbRemoteFolderChangesRequestBody.Options();
                if (object.localVersion != null) {
                    if (!$util.isObject(object.localVersion))
                        throw TypeError(".fs.AbsorbRemoteFolderChangesRequestBody.Options.localVersion: object expected");
                    message.localVersion = $root.common.UInt64Value.fromObject(object.localVersion, long + 1);
                }
                if (object.postfixForNameOverlaps != null) {
                    if (!$util.isObject(object.postfixForNameOverlaps))
                        throw TypeError(".fs.AbsorbRemoteFolderChangesRequestBody.Options.postfixForNameOverlaps: object expected");
                    message.postfixForNameOverlaps = $root.common.StringValue.fromObject(object.postfixForNameOverlaps, long + 1);
                }
                if (object.remoteVersion != null) {
                    if (!$util.isObject(object.remoteVersion))
                        throw TypeError(".fs.AbsorbRemoteFolderChangesRequestBody.Options.remoteVersion: object expected");
                    message.remoteVersion = $root.common.UInt64Value.fromObject(object.remoteVersion, long + 1);
                }
                return message;
            };

            /**
             * Creates a plain object from an Options message. Also converts values to other types if specified.
             * @function toObject
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @static
             * @param {fs.AbsorbRemoteFolderChangesRequestBody.Options} message Options
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            Options.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults) {
                    object.localVersion = null;
                    object.postfixForNameOverlaps = null;
                    object.remoteVersion = null;
                }
                if (message.localVersion != null && Object.hasOwnProperty.call(message, "localVersion"))
                    object.localVersion = $root.common.UInt64Value.toObject(message.localVersion, options, q + 1);
                if (message.postfixForNameOverlaps != null && Object.hasOwnProperty.call(message, "postfixForNameOverlaps"))
                    object.postfixForNameOverlaps = $root.common.StringValue.toObject(message.postfixForNameOverlaps, options, q + 1);
                if (message.remoteVersion != null && Object.hasOwnProperty.call(message, "remoteVersion"))
                    object.remoteVersion = $root.common.UInt64Value.toObject(message.remoteVersion, options, q + 1);
                return object;
            };

            /**
             * Converts this Options to JSON.
             * @function toJSON
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            Options.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for Options
             * @function getTypeUrl
             * @memberof fs.AbsorbRemoteFolderChangesRequestBody.Options
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            Options.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/fs.AbsorbRemoteFolderChangesRequestBody.Options";
            };

            return Options;
        })();

        return AbsorbRemoteFolderChangesRequestBody;
    })();

    fs.AbsorbRemoteFolderChangesReplyBody = (function() {

        /**
         * Properties of an AbsorbRemoteFolderChangesReplyBody.
         * @memberof fs
         * @interface IAbsorbRemoteFolderChangesReplyBody
         * @property {common.IUInt64Value|null} [newVersion] AbsorbRemoteFolderChangesReplyBody newVersion
         */

        /**
         * Constructs a new AbsorbRemoteFolderChangesReplyBody.
         * @memberof fs
         * @classdesc Represents an AbsorbRemoteFolderChangesReplyBody.
         * @implements IAbsorbRemoteFolderChangesReplyBody
         * @constructor
         * @param {fs.IAbsorbRemoteFolderChangesReplyBody=} [properties] Properties to set
         */
        function AbsorbRemoteFolderChangesReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * AbsorbRemoteFolderChangesReplyBody newVersion.
         * @member {common.IUInt64Value|null|undefined} newVersion
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @instance
         */
        AbsorbRemoteFolderChangesReplyBody.prototype.newVersion = null;

        /**
         * Creates a new AbsorbRemoteFolderChangesReplyBody instance using the specified properties.
         * @function create
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @static
         * @param {fs.IAbsorbRemoteFolderChangesReplyBody=} [properties] Properties to set
         * @returns {fs.AbsorbRemoteFolderChangesReplyBody} AbsorbRemoteFolderChangesReplyBody instance
         */
        AbsorbRemoteFolderChangesReplyBody.create = function create(properties) {
            return new AbsorbRemoteFolderChangesReplyBody(properties);
        };

        /**
         * Encodes the specified AbsorbRemoteFolderChangesReplyBody message. Does not implicitly {@link fs.AbsorbRemoteFolderChangesReplyBody.verify|verify} messages.
         * @function encode
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @static
         * @param {fs.IAbsorbRemoteFolderChangesReplyBody} message AbsorbRemoteFolderChangesReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AbsorbRemoteFolderChangesReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.newVersion != null && Object.hasOwnProperty.call(message, "newVersion"))
                $root.common.UInt64Value.encode(message.newVersion, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified AbsorbRemoteFolderChangesReplyBody message, length delimited. Does not implicitly {@link fs.AbsorbRemoteFolderChangesReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @static
         * @param {fs.IAbsorbRemoteFolderChangesReplyBody} message AbsorbRemoteFolderChangesReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AbsorbRemoteFolderChangesReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an AbsorbRemoteFolderChangesReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {fs.AbsorbRemoteFolderChangesReplyBody} AbsorbRemoteFolderChangesReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AbsorbRemoteFolderChangesReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.fs.AbsorbRemoteFolderChangesReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.newVersion = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an AbsorbRemoteFolderChangesReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {fs.AbsorbRemoteFolderChangesReplyBody} AbsorbRemoteFolderChangesReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AbsorbRemoteFolderChangesReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an AbsorbRemoteFolderChangesReplyBody message.
         * @function verify
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        AbsorbRemoteFolderChangesReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.newVersion != null && Object.hasOwnProperty.call(message, "newVersion")) {
                var error = $root.common.UInt64Value.verify(message.newVersion, long + 1);
                if (error)
                    return "newVersion." + error;
            }
            return null;
        };

        /**
         * Creates an AbsorbRemoteFolderChangesReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {fs.AbsorbRemoteFolderChangesReplyBody} AbsorbRemoteFolderChangesReplyBody
         */
        AbsorbRemoteFolderChangesReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.fs.AbsorbRemoteFolderChangesReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".fs.AbsorbRemoteFolderChangesReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.fs.AbsorbRemoteFolderChangesReplyBody();
            if (object.newVersion != null) {
                if (!$util.isObject(object.newVersion))
                    throw TypeError(".fs.AbsorbRemoteFolderChangesReplyBody.newVersion: object expected");
                message.newVersion = $root.common.UInt64Value.fromObject(object.newVersion, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an AbsorbRemoteFolderChangesReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @static
         * @param {fs.AbsorbRemoteFolderChangesReplyBody} message AbsorbRemoteFolderChangesReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        AbsorbRemoteFolderChangesReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.newVersion = null;
            if (message.newVersion != null && Object.hasOwnProperty.call(message, "newVersion"))
                object.newVersion = $root.common.UInt64Value.toObject(message.newVersion, options, q + 1);
            return object;
        };

        /**
         * Converts this AbsorbRemoteFolderChangesReplyBody to JSON.
         * @function toJSON
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        AbsorbRemoteFolderChangesReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for AbsorbRemoteFolderChangesReplyBody
         * @function getTypeUrl
         * @memberof fs.AbsorbRemoteFolderChangesReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        AbsorbRemoteFolderChangesReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/fs.AbsorbRemoteFolderChangesReplyBody";
        };

        return AbsorbRemoteFolderChangesReplyBody;
    })();

    return fs;
})();

module.exports = $root;

},{"protobufjs/minimal":84}],72:[function(require,module,exports){
/*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.bytes = (function() {

    /**
     * Namespace bytes.
     * @exports bytes
     * @namespace
     */
    var bytes = {};

    bytes.SpliceRequestBody = (function() {

        /**
         * Properties of a SpliceRequestBody.
         * @memberof bytes
         * @interface ISpliceRequestBody
         * @property {number|Long|null} [pos] SpliceRequestBody pos
         * @property {number|Long|null} [del] SpliceRequestBody del
         * @property {common.IBytesValue|null} [bytes] SpliceRequestBody bytes
         */

        /**
         * Constructs a new SpliceRequestBody.
         * @memberof bytes
         * @classdesc Represents a SpliceRequestBody.
         * @implements ISpliceRequestBody
         * @constructor
         * @param {bytes.ISpliceRequestBody=} [properties] Properties to set
         */
        function SpliceRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * SpliceRequestBody pos.
         * @member {number|Long} pos
         * @memberof bytes.SpliceRequestBody
         * @instance
         */
        SpliceRequestBody.prototype.pos = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * SpliceRequestBody del.
         * @member {number|Long} del
         * @memberof bytes.SpliceRequestBody
         * @instance
         */
        SpliceRequestBody.prototype.del = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * SpliceRequestBody bytes.
         * @member {common.IBytesValue|null|undefined} bytes
         * @memberof bytes.SpliceRequestBody
         * @instance
         */
        SpliceRequestBody.prototype.bytes = null;

        /**
         * Creates a new SpliceRequestBody instance using the specified properties.
         * @function create
         * @memberof bytes.SpliceRequestBody
         * @static
         * @param {bytes.ISpliceRequestBody=} [properties] Properties to set
         * @returns {bytes.SpliceRequestBody} SpliceRequestBody instance
         */
        SpliceRequestBody.create = function create(properties) {
            return new SpliceRequestBody(properties);
        };

        /**
         * Encodes the specified SpliceRequestBody message. Does not implicitly {@link bytes.SpliceRequestBody.verify|verify} messages.
         * @function encode
         * @memberof bytes.SpliceRequestBody
         * @static
         * @param {bytes.ISpliceRequestBody} message SpliceRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SpliceRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.pos != null && Object.hasOwnProperty.call(message, "pos"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.pos);
            if (message.del != null && Object.hasOwnProperty.call(message, "del"))
                writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.del);
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified SpliceRequestBody message, length delimited. Does not implicitly {@link bytes.SpliceRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof bytes.SpliceRequestBody
         * @static
         * @param {bytes.ISpliceRequestBody} message SpliceRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SpliceRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a SpliceRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof bytes.SpliceRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {bytes.SpliceRequestBody} SpliceRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SpliceRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.bytes.SpliceRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.pos = reader.uint64();
                        break;
                    }
                case 2: {
                        message.del = reader.uint64();
                        break;
                    }
                case 3: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a SpliceRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof bytes.SpliceRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {bytes.SpliceRequestBody} SpliceRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SpliceRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a SpliceRequestBody message.
         * @function verify
         * @memberof bytes.SpliceRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        SpliceRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.pos != null && Object.hasOwnProperty.call(message, "pos"))
                if (!$util.isInteger(message.pos) && !(message.pos && $util.isInteger(message.pos.low) && $util.isInteger(message.pos.high)))
                    return "pos: integer|Long expected";
            if (message.del != null && Object.hasOwnProperty.call(message, "del"))
                if (!$util.isInteger(message.del) && !(message.del && $util.isInteger(message.del.low) && $util.isInteger(message.del.high)))
                    return "del: integer|Long expected";
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes, long + 1);
                if (error)
                    return "bytes." + error;
            }
            return null;
        };

        /**
         * Creates a SpliceRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof bytes.SpliceRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {bytes.SpliceRequestBody} SpliceRequestBody
         */
        SpliceRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.bytes.SpliceRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".bytes.SpliceRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.bytes.SpliceRequestBody();
            if (object.pos != null)
                if ($util.Long)
                    message.pos = $util.Long.fromValue(object.pos, true);
                else if (typeof object.pos === "string")
                    message.pos = parseInt(object.pos, 10);
                else if (typeof object.pos === "number")
                    message.pos = object.pos;
                else if (typeof object.pos === "object")
                    message.pos = new $util.LongBits(object.pos.low >>> 0, object.pos.high >>> 0).toNumber(true);
            if (object.del != null)
                if ($util.Long)
                    message.del = $util.Long.fromValue(object.del, true);
                else if (typeof object.del === "string")
                    message.del = parseInt(object.del, 10);
                else if (typeof object.del === "number")
                    message.del = object.del;
                else if (typeof object.del === "object")
                    message.del = new $util.LongBits(object.del.low >>> 0, object.del.high >>> 0).toNumber(true);
            if (object.bytes != null) {
                if (!$util.isObject(object.bytes))
                    throw TypeError(".bytes.SpliceRequestBody.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a SpliceRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof bytes.SpliceRequestBody
         * @static
         * @param {bytes.SpliceRequestBody} message SpliceRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        SpliceRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.pos = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.pos = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.del = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.del = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.bytes = null;
            }
            if (message.pos != null && Object.hasOwnProperty.call(message, "pos"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.pos = typeof message.pos === "number" ? BigInt(message.pos) : $util.Long.fromBits(message.pos.low >>> 0, message.pos.high >>> 0, true).toBigInt();
                else if (typeof message.pos === "number")
                    object.pos = options.longs === String ? String(message.pos) : message.pos;
                else
                    object.pos = options.longs === String ? $util.Long.prototype.toString.call(message.pos) : options.longs === Number ? new $util.LongBits(message.pos.low >>> 0, message.pos.high >>> 0).toNumber(true) : message.pos;
            if (message.del != null && Object.hasOwnProperty.call(message, "del"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.del = typeof message.del === "number" ? BigInt(message.del) : $util.Long.fromBits(message.del.low >>> 0, message.del.high >>> 0, true).toBigInt();
                else if (typeof message.del === "number")
                    object.del = options.longs === String ? String(message.del) : message.del;
                else
                    object.del = options.longs === String ? $util.Long.prototype.toString.call(message.del) : options.longs === Number ? new $util.LongBits(message.del.low >>> 0, message.del.high >>> 0).toNumber(true) : message.del;
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options, q + 1);
            return object;
        };

        /**
         * Converts this SpliceRequestBody to JSON.
         * @function toJSON
         * @memberof bytes.SpliceRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        SpliceRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for SpliceRequestBody
         * @function getTypeUrl
         * @memberof bytes.SpliceRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        SpliceRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/bytes.SpliceRequestBody";
        };

        return SpliceRequestBody;
    })();

    bytes.TruncateRequestBody = (function() {

        /**
         * Properties of a TruncateRequestBody.
         * @memberof bytes
         * @interface ITruncateRequestBody
         * @property {number|Long|null} [size] TruncateRequestBody size
         */

        /**
         * Constructs a new TruncateRequestBody.
         * @memberof bytes
         * @classdesc Represents a TruncateRequestBody.
         * @implements ITruncateRequestBody
         * @constructor
         * @param {bytes.ITruncateRequestBody=} [properties] Properties to set
         */
        function TruncateRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * TruncateRequestBody size.
         * @member {number|Long} size
         * @memberof bytes.TruncateRequestBody
         * @instance
         */
        TruncateRequestBody.prototype.size = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new TruncateRequestBody instance using the specified properties.
         * @function create
         * @memberof bytes.TruncateRequestBody
         * @static
         * @param {bytes.ITruncateRequestBody=} [properties] Properties to set
         * @returns {bytes.TruncateRequestBody} TruncateRequestBody instance
         */
        TruncateRequestBody.create = function create(properties) {
            return new TruncateRequestBody(properties);
        };

        /**
         * Encodes the specified TruncateRequestBody message. Does not implicitly {@link bytes.TruncateRequestBody.verify|verify} messages.
         * @function encode
         * @memberof bytes.TruncateRequestBody
         * @static
         * @param {bytes.ITruncateRequestBody} message TruncateRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        TruncateRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.size != null && Object.hasOwnProperty.call(message, "size"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.size);
            return writer;
        };

        /**
         * Encodes the specified TruncateRequestBody message, length delimited. Does not implicitly {@link bytes.TruncateRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof bytes.TruncateRequestBody
         * @static
         * @param {bytes.ITruncateRequestBody} message TruncateRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        TruncateRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a TruncateRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof bytes.TruncateRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {bytes.TruncateRequestBody} TruncateRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        TruncateRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.bytes.TruncateRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.size = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a TruncateRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof bytes.TruncateRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {bytes.TruncateRequestBody} TruncateRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        TruncateRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a TruncateRequestBody message.
         * @function verify
         * @memberof bytes.TruncateRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        TruncateRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.size != null && Object.hasOwnProperty.call(message, "size"))
                if (!$util.isInteger(message.size) && !(message.size && $util.isInteger(message.size.low) && $util.isInteger(message.size.high)))
                    return "size: integer|Long expected";
            return null;
        };

        /**
         * Creates a TruncateRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof bytes.TruncateRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {bytes.TruncateRequestBody} TruncateRequestBody
         */
        TruncateRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.bytes.TruncateRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".bytes.TruncateRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.bytes.TruncateRequestBody();
            if (object.size != null)
                if ($util.Long)
                    message.size = $util.Long.fromValue(object.size, true);
                else if (typeof object.size === "string")
                    message.size = parseInt(object.size, 10);
                else if (typeof object.size === "number")
                    message.size = object.size;
                else if (typeof object.size === "object")
                    message.size = new $util.LongBits(object.size.low >>> 0, object.size.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from a TruncateRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof bytes.TruncateRequestBody
         * @static
         * @param {bytes.TruncateRequestBody} message TruncateRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        TruncateRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.size = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.size = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            if (message.size != null && Object.hasOwnProperty.call(message, "size"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.size = typeof message.size === "number" ? BigInt(message.size) : $util.Long.fromBits(message.size.low >>> 0, message.size.high >>> 0, true).toBigInt();
                else if (typeof message.size === "number")
                    object.size = options.longs === String ? String(message.size) : message.size;
                else
                    object.size = options.longs === String ? $util.Long.prototype.toString.call(message.size) : options.longs === Number ? new $util.LongBits(message.size.low >>> 0, message.size.high >>> 0).toNumber(true) : message.size;
            return object;
        };

        /**
         * Converts this TruncateRequestBody to JSON.
         * @function toJSON
         * @memberof bytes.TruncateRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        TruncateRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for TruncateRequestBody
         * @function getTypeUrl
         * @memberof bytes.TruncateRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        TruncateRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/bytes.TruncateRequestBody";
        };

        return TruncateRequestBody;
    })();

    bytes.FileLayoutMsg = (function() {

        /**
         * Properties of a FileLayoutMsg.
         * @memberof bytes
         * @interface IFileLayoutMsg
         * @property {common.IUInt64Value|null} [base] FileLayoutMsg base
         * @property {Array.<bytes.FileLayoutMsg.ILayoutSection>|null} [sections] FileLayoutMsg sections
         */

        /**
         * Constructs a new FileLayoutMsg.
         * @memberof bytes
         * @classdesc Represents a FileLayoutMsg.
         * @implements IFileLayoutMsg
         * @constructor
         * @param {bytes.IFileLayoutMsg=} [properties] Properties to set
         */
        function FileLayoutMsg(properties) {
            this.sections = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * FileLayoutMsg base.
         * @member {common.IUInt64Value|null|undefined} base
         * @memberof bytes.FileLayoutMsg
         * @instance
         */
        FileLayoutMsg.prototype.base = null;

        /**
         * FileLayoutMsg sections.
         * @member {Array.<bytes.FileLayoutMsg.ILayoutSection>} sections
         * @memberof bytes.FileLayoutMsg
         * @instance
         */
        FileLayoutMsg.prototype.sections = $util.emptyArray;

        /**
         * Creates a new FileLayoutMsg instance using the specified properties.
         * @function create
         * @memberof bytes.FileLayoutMsg
         * @static
         * @param {bytes.IFileLayoutMsg=} [properties] Properties to set
         * @returns {bytes.FileLayoutMsg} FileLayoutMsg instance
         */
        FileLayoutMsg.create = function create(properties) {
            return new FileLayoutMsg(properties);
        };

        /**
         * Encodes the specified FileLayoutMsg message. Does not implicitly {@link bytes.FileLayoutMsg.verify|verify} messages.
         * @function encode
         * @memberof bytes.FileLayoutMsg
         * @static
         * @param {bytes.IFileLayoutMsg} message FileLayoutMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileLayoutMsg.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.base != null && Object.hasOwnProperty.call(message, "base"))
                $root.common.UInt64Value.encode(message.base, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.sections != null && message.sections.length)
                for (var i = 0; i < message.sections.length; ++i)
                    $root.bytes.FileLayoutMsg.LayoutSection.encode(message.sections[i], writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified FileLayoutMsg message, length delimited. Does not implicitly {@link bytes.FileLayoutMsg.verify|verify} messages.
         * @function encodeDelimited
         * @memberof bytes.FileLayoutMsg
         * @static
         * @param {bytes.IFileLayoutMsg} message FileLayoutMsg message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        FileLayoutMsg.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a FileLayoutMsg message from the specified reader or buffer.
         * @function decode
         * @memberof bytes.FileLayoutMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {bytes.FileLayoutMsg} FileLayoutMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileLayoutMsg.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.bytes.FileLayoutMsg();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.base = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        if (!(message.sections && message.sections.length))
                            message.sections = [];
                        message.sections.push($root.bytes.FileLayoutMsg.LayoutSection.decode(reader, reader.uint32(), undefined, long + 1));
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a FileLayoutMsg message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof bytes.FileLayoutMsg
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {bytes.FileLayoutMsg} FileLayoutMsg
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        FileLayoutMsg.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a FileLayoutMsg message.
         * @function verify
         * @memberof bytes.FileLayoutMsg
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        FileLayoutMsg.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.base != null && Object.hasOwnProperty.call(message, "base")) {
                var error = $root.common.UInt64Value.verify(message.base, long + 1);
                if (error)
                    return "base." + error;
            }
            if (message.sections != null && Object.hasOwnProperty.call(message, "sections")) {
                if (!Array.isArray(message.sections))
                    return "sections: array expected";
                for (var i = 0; i < message.sections.length; ++i) {
                    var error = $root.bytes.FileLayoutMsg.LayoutSection.verify(message.sections[i], long + 1);
                    if (error)
                        return "sections." + error;
                }
            }
            return null;
        };

        /**
         * Creates a FileLayoutMsg message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof bytes.FileLayoutMsg
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {bytes.FileLayoutMsg} FileLayoutMsg
         */
        FileLayoutMsg.fromObject = function fromObject(object, long) {
            if (object instanceof $root.bytes.FileLayoutMsg)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".bytes.FileLayoutMsg: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.bytes.FileLayoutMsg();
            if (object.base != null) {
                if (!$util.isObject(object.base))
                    throw TypeError(".bytes.FileLayoutMsg.base: object expected");
                message.base = $root.common.UInt64Value.fromObject(object.base, long + 1);
            }
            if (object.sections) {
                if (!Array.isArray(object.sections))
                    throw TypeError(".bytes.FileLayoutMsg.sections: array expected");
                message.sections = [];
                for (var i = 0; i < object.sections.length; ++i) {
                    if (!$util.isObject(object.sections[i]))
                        throw TypeError(".bytes.FileLayoutMsg.sections: object expected");
                    message.sections[i] = $root.bytes.FileLayoutMsg.LayoutSection.fromObject(object.sections[i], long + 1);
                }
            }
            return message;
        };

        /**
         * Creates a plain object from a FileLayoutMsg message. Also converts values to other types if specified.
         * @function toObject
         * @memberof bytes.FileLayoutMsg
         * @static
         * @param {bytes.FileLayoutMsg} message FileLayoutMsg
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        FileLayoutMsg.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.sections = [];
            if (options.defaults)
                object.base = null;
            if (message.base != null && Object.hasOwnProperty.call(message, "base"))
                object.base = $root.common.UInt64Value.toObject(message.base, options, q + 1);
            if (message.sections && message.sections.length) {
                object.sections = [];
                for (var j = 0; j < message.sections.length; ++j)
                    object.sections[j] = $root.bytes.FileLayoutMsg.LayoutSection.toObject(message.sections[j], options, q + 1);
            }
            return object;
        };

        /**
         * Converts this FileLayoutMsg to JSON.
         * @function toJSON
         * @memberof bytes.FileLayoutMsg
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        FileLayoutMsg.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for FileLayoutMsg
         * @function getTypeUrl
         * @memberof bytes.FileLayoutMsg
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        FileLayoutMsg.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/bytes.FileLayoutMsg";
        };

        FileLayoutMsg.LayoutSection = (function() {

            /**
             * Properties of a LayoutSection.
             * @memberof bytes.FileLayoutMsg
             * @interface ILayoutSection
             * @property {string|null} [src] LayoutSection src
             * @property {number|Long|null} [ofs] LayoutSection ofs
             * @property {number|Long|null} [len] LayoutSection len
             */

            /**
             * Constructs a new LayoutSection.
             * @memberof bytes.FileLayoutMsg
             * @classdesc Represents a LayoutSection.
             * @implements ILayoutSection
             * @constructor
             * @param {bytes.FileLayoutMsg.ILayoutSection=} [properties] Properties to set
             */
            function LayoutSection(properties) {
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * LayoutSection src.
             * @member {string} src
             * @memberof bytes.FileLayoutMsg.LayoutSection
             * @instance
             */
            LayoutSection.prototype.src = "";

            /**
             * LayoutSection ofs.
             * @member {number|Long} ofs
             * @memberof bytes.FileLayoutMsg.LayoutSection
             * @instance
             */
            LayoutSection.prototype.ofs = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

            /**
             * LayoutSection len.
             * @member {number|Long} len
             * @memberof bytes.FileLayoutMsg.LayoutSection
             * @instance
             */
            LayoutSection.prototype.len = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

            /**
             * Creates a new LayoutSection instance using the specified properties.
             * @function create
             * @memberof bytes.FileLayoutMsg.LayoutSection
             * @static
             * @param {bytes.FileLayoutMsg.ILayoutSection=} [properties] Properties to set
             * @returns {bytes.FileLayoutMsg.LayoutSection} LayoutSection instance
             */
            LayoutSection.create = function create(properties) {
                return new LayoutSection(properties);
            };

            /**
             * Encodes the specified LayoutSection message. Does not implicitly {@link bytes.FileLayoutMsg.LayoutSection.verify|verify} messages.
             * @function encode
             * @memberof bytes.FileLayoutMsg.LayoutSection
             * @static
             * @param {bytes.FileLayoutMsg.ILayoutSection} message LayoutSection message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            LayoutSection.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.src);
                if (message.ofs != null && Object.hasOwnProperty.call(message, "ofs"))
                    writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.ofs);
                if (message.len != null && Object.hasOwnProperty.call(message, "len"))
                    writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.len);
                return writer;
            };

            /**
             * Encodes the specified LayoutSection message, length delimited. Does not implicitly {@link bytes.FileLayoutMsg.LayoutSection.verify|verify} messages.
             * @function encodeDelimited
             * @memberof bytes.FileLayoutMsg.LayoutSection
             * @static
             * @param {bytes.FileLayoutMsg.ILayoutSection} message LayoutSection message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            LayoutSection.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes a LayoutSection message from the specified reader or buffer.
             * @function decode
             * @memberof bytes.FileLayoutMsg.LayoutSection
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {bytes.FileLayoutMsg.LayoutSection} LayoutSection
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            LayoutSection.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.bytes.FileLayoutMsg.LayoutSection();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.src = reader.string();
                            break;
                        }
                    case 2: {
                            message.ofs = reader.uint64();
                            break;
                        }
                    case 3: {
                            message.len = reader.uint64();
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a LayoutSection message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof bytes.FileLayoutMsg.LayoutSection
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {bytes.FileLayoutMsg.LayoutSection} LayoutSection
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            LayoutSection.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a LayoutSection message.
             * @function verify
             * @memberof bytes.FileLayoutMsg.LayoutSection
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            LayoutSection.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                    if (!$util.isString(message.src))
                        return "src: string expected";
                if (message.ofs != null && Object.hasOwnProperty.call(message, "ofs"))
                    if (!$util.isInteger(message.ofs) && !(message.ofs && $util.isInteger(message.ofs.low) && $util.isInteger(message.ofs.high)))
                        return "ofs: integer|Long expected";
                if (message.len != null && Object.hasOwnProperty.call(message, "len"))
                    if (!$util.isInteger(message.len) && !(message.len && $util.isInteger(message.len.low) && $util.isInteger(message.len.high)))
                        return "len: integer|Long expected";
                return null;
            };

            /**
             * Creates a LayoutSection message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof bytes.FileLayoutMsg.LayoutSection
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {bytes.FileLayoutMsg.LayoutSection} LayoutSection
             */
            LayoutSection.fromObject = function fromObject(object, long) {
                if (object instanceof $root.bytes.FileLayoutMsg.LayoutSection)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".bytes.FileLayoutMsg.LayoutSection: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.bytes.FileLayoutMsg.LayoutSection();
                if (object.src != null)
                    message.src = String(object.src);
                if (object.ofs != null)
                    if ($util.Long)
                        message.ofs = $util.Long.fromValue(object.ofs, true);
                    else if (typeof object.ofs === "string")
                        message.ofs = parseInt(object.ofs, 10);
                    else if (typeof object.ofs === "number")
                        message.ofs = object.ofs;
                    else if (typeof object.ofs === "object")
                        message.ofs = new $util.LongBits(object.ofs.low >>> 0, object.ofs.high >>> 0).toNumber(true);
                if (object.len != null)
                    if ($util.Long)
                        message.len = $util.Long.fromValue(object.len, true);
                    else if (typeof object.len === "string")
                        message.len = parseInt(object.len, 10);
                    else if (typeof object.len === "number")
                        message.len = object.len;
                    else if (typeof object.len === "object")
                        message.len = new $util.LongBits(object.len.low >>> 0, object.len.high >>> 0).toNumber(true);
                return message;
            };

            /**
             * Creates a plain object from a LayoutSection message. Also converts values to other types if specified.
             * @function toObject
             * @memberof bytes.FileLayoutMsg.LayoutSection
             * @static
             * @param {bytes.FileLayoutMsg.LayoutSection} message LayoutSection
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            LayoutSection.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.defaults) {
                    object.src = "";
                    if ($util.Long) {
                        var long = new $util.Long(0, 0, true);
                        object.ofs = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                    } else
                        object.ofs = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                    if ($util.Long) {
                        var long = new $util.Long(0, 0, true);
                        object.len = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                    } else
                        object.len = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                }
                if (message.src != null && Object.hasOwnProperty.call(message, "src"))
                    object.src = message.src;
                if (message.ofs != null && Object.hasOwnProperty.call(message, "ofs"))
                    if (typeof BigInt !== "undefined" && options.longs === BigInt)
                        object.ofs = typeof message.ofs === "number" ? BigInt(message.ofs) : $util.Long.fromBits(message.ofs.low >>> 0, message.ofs.high >>> 0, true).toBigInt();
                    else if (typeof message.ofs === "number")
                        object.ofs = options.longs === String ? String(message.ofs) : message.ofs;
                    else
                        object.ofs = options.longs === String ? $util.Long.prototype.toString.call(message.ofs) : options.longs === Number ? new $util.LongBits(message.ofs.low >>> 0, message.ofs.high >>> 0).toNumber(true) : message.ofs;
                if (message.len != null && Object.hasOwnProperty.call(message, "len"))
                    if (typeof BigInt !== "undefined" && options.longs === BigInt)
                        object.len = typeof message.len === "number" ? BigInt(message.len) : $util.Long.fromBits(message.len.low >>> 0, message.len.high >>> 0, true).toBigInt();
                    else if (typeof message.len === "number")
                        object.len = options.longs === String ? String(message.len) : message.len;
                    else
                        object.len = options.longs === String ? $util.Long.prototype.toString.call(message.len) : options.longs === Number ? new $util.LongBits(message.len.low >>> 0, message.len.high >>> 0).toNumber(true) : message.len;
                return object;
            };

            /**
             * Converts this LayoutSection to JSON.
             * @function toJSON
             * @memberof bytes.FileLayoutMsg.LayoutSection
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            LayoutSection.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for LayoutSection
             * @function getTypeUrl
             * @memberof bytes.FileLayoutMsg.LayoutSection
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            LayoutSection.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/bytes.FileLayoutMsg.LayoutSection";
            };

            return LayoutSection;
        })();

        return FileLayoutMsg;
    })();

    bytes.DoneRequestBody = (function() {

        /**
         * Properties of a DoneRequestBody.
         * @memberof bytes
         * @interface IDoneRequestBody
         * @property {common.IErrorValue|null} [err] DoneRequestBody err
         */

        /**
         * Constructs a new DoneRequestBody.
         * @memberof bytes
         * @classdesc Represents a DoneRequestBody.
         * @implements IDoneRequestBody
         * @constructor
         * @param {bytes.IDoneRequestBody=} [properties] Properties to set
         */
        function DoneRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * DoneRequestBody err.
         * @member {common.IErrorValue|null|undefined} err
         * @memberof bytes.DoneRequestBody
         * @instance
         */
        DoneRequestBody.prototype.err = null;

        /**
         * Creates a new DoneRequestBody instance using the specified properties.
         * @function create
         * @memberof bytes.DoneRequestBody
         * @static
         * @param {bytes.IDoneRequestBody=} [properties] Properties to set
         * @returns {bytes.DoneRequestBody} DoneRequestBody instance
         */
        DoneRequestBody.create = function create(properties) {
            return new DoneRequestBody(properties);
        };

        /**
         * Encodes the specified DoneRequestBody message. Does not implicitly {@link bytes.DoneRequestBody.verify|verify} messages.
         * @function encode
         * @memberof bytes.DoneRequestBody
         * @static
         * @param {bytes.IDoneRequestBody} message DoneRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DoneRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.err != null && Object.hasOwnProperty.call(message, "err"))
                $root.common.ErrorValue.encode(message.err, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified DoneRequestBody message, length delimited. Does not implicitly {@link bytes.DoneRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof bytes.DoneRequestBody
         * @static
         * @param {bytes.IDoneRequestBody} message DoneRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        DoneRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a DoneRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof bytes.DoneRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {bytes.DoneRequestBody} DoneRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DoneRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.bytes.DoneRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.err = $root.common.ErrorValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a DoneRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof bytes.DoneRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {bytes.DoneRequestBody} DoneRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        DoneRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a DoneRequestBody message.
         * @function verify
         * @memberof bytes.DoneRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        DoneRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.err != null && Object.hasOwnProperty.call(message, "err")) {
                var error = $root.common.ErrorValue.verify(message.err, long + 1);
                if (error)
                    return "err." + error;
            }
            return null;
        };

        /**
         * Creates a DoneRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof bytes.DoneRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {bytes.DoneRequestBody} DoneRequestBody
         */
        DoneRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.bytes.DoneRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".bytes.DoneRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.bytes.DoneRequestBody();
            if (object.err != null) {
                if (!$util.isObject(object.err))
                    throw TypeError(".bytes.DoneRequestBody.err: object expected");
                message.err = $root.common.ErrorValue.fromObject(object.err, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a DoneRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof bytes.DoneRequestBody
         * @static
         * @param {bytes.DoneRequestBody} message DoneRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        DoneRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.err = null;
            if (message.err != null && Object.hasOwnProperty.call(message, "err"))
                object.err = $root.common.ErrorValue.toObject(message.err, options, q + 1);
            return object;
        };

        /**
         * Converts this DoneRequestBody to JSON.
         * @function toJSON
         * @memberof bytes.DoneRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        DoneRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for DoneRequestBody
         * @function getTypeUrl
         * @memberof bytes.DoneRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        DoneRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/bytes.DoneRequestBody";
        };

        return DoneRequestBody;
    })();

    bytes.ReadReplyBody = (function() {

        /**
         * Properties of a ReadReplyBody.
         * @memberof bytes
         * @interface IReadReplyBody
         * @property {common.IBytesValue|null} [bytes] ReadReplyBody bytes
         */

        /**
         * Constructs a new ReadReplyBody.
         * @memberof bytes
         * @classdesc Represents a ReadReplyBody.
         * @implements IReadReplyBody
         * @constructor
         * @param {bytes.IReadReplyBody=} [properties] Properties to set
         */
        function ReadReplyBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ReadReplyBody bytes.
         * @member {common.IBytesValue|null|undefined} bytes
         * @memberof bytes.ReadReplyBody
         * @instance
         */
        ReadReplyBody.prototype.bytes = null;

        /**
         * Creates a new ReadReplyBody instance using the specified properties.
         * @function create
         * @memberof bytes.ReadReplyBody
         * @static
         * @param {bytes.IReadReplyBody=} [properties] Properties to set
         * @returns {bytes.ReadReplyBody} ReadReplyBody instance
         */
        ReadReplyBody.create = function create(properties) {
            return new ReadReplyBody(properties);
        };

        /**
         * Encodes the specified ReadReplyBody message. Does not implicitly {@link bytes.ReadReplyBody.verify|verify} messages.
         * @function encode
         * @memberof bytes.ReadReplyBody
         * @static
         * @param {bytes.IReadReplyBody} message ReadReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ReadReplyBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified ReadReplyBody message, length delimited. Does not implicitly {@link bytes.ReadReplyBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof bytes.ReadReplyBody
         * @static
         * @param {bytes.IReadReplyBody} message ReadReplyBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ReadReplyBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a ReadReplyBody message from the specified reader or buffer.
         * @function decode
         * @memberof bytes.ReadReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {bytes.ReadReplyBody} ReadReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ReadReplyBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.bytes.ReadReplyBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a ReadReplyBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof bytes.ReadReplyBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {bytes.ReadReplyBody} ReadReplyBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ReadReplyBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a ReadReplyBody message.
         * @function verify
         * @memberof bytes.ReadReplyBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ReadReplyBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes, long + 1);
                if (error)
                    return "bytes." + error;
            }
            return null;
        };

        /**
         * Creates a ReadReplyBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof bytes.ReadReplyBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {bytes.ReadReplyBody} ReadReplyBody
         */
        ReadReplyBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.bytes.ReadReplyBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".bytes.ReadReplyBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.bytes.ReadReplyBody();
            if (object.bytes != null) {
                if (!$util.isObject(object.bytes))
                    throw TypeError(".bytes.ReadReplyBody.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a ReadReplyBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof bytes.ReadReplyBody
         * @static
         * @param {bytes.ReadReplyBody} message ReadReplyBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ReadReplyBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.bytes = null;
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options, q + 1);
            return object;
        };

        /**
         * Converts this ReadReplyBody to JSON.
         * @function toJSON
         * @memberof bytes.ReadReplyBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ReadReplyBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ReadReplyBody
         * @function getTypeUrl
         * @memberof bytes.ReadReplyBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ReadReplyBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/bytes.ReadReplyBody";
        };

        return ReadReplyBody;
    })();

    bytes.ReadNextRequestBody = (function() {

        /**
         * Properties of a ReadNextRequestBody.
         * @memberof bytes
         * @interface IReadNextRequestBody
         * @property {common.IUInt64Value|null} [len] ReadNextRequestBody len
         */

        /**
         * Constructs a new ReadNextRequestBody.
         * @memberof bytes
         * @classdesc Represents a ReadNextRequestBody.
         * @implements IReadNextRequestBody
         * @constructor
         * @param {bytes.IReadNextRequestBody=} [properties] Properties to set
         */
        function ReadNextRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ReadNextRequestBody len.
         * @member {common.IUInt64Value|null|undefined} len
         * @memberof bytes.ReadNextRequestBody
         * @instance
         */
        ReadNextRequestBody.prototype.len = null;

        /**
         * Creates a new ReadNextRequestBody instance using the specified properties.
         * @function create
         * @memberof bytes.ReadNextRequestBody
         * @static
         * @param {bytes.IReadNextRequestBody=} [properties] Properties to set
         * @returns {bytes.ReadNextRequestBody} ReadNextRequestBody instance
         */
        ReadNextRequestBody.create = function create(properties) {
            return new ReadNextRequestBody(properties);
        };

        /**
         * Encodes the specified ReadNextRequestBody message. Does not implicitly {@link bytes.ReadNextRequestBody.verify|verify} messages.
         * @function encode
         * @memberof bytes.ReadNextRequestBody
         * @static
         * @param {bytes.IReadNextRequestBody} message ReadNextRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ReadNextRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.len != null && Object.hasOwnProperty.call(message, "len"))
                $root.common.UInt64Value.encode(message.len, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified ReadNextRequestBody message, length delimited. Does not implicitly {@link bytes.ReadNextRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof bytes.ReadNextRequestBody
         * @static
         * @param {bytes.IReadNextRequestBody} message ReadNextRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ReadNextRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a ReadNextRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof bytes.ReadNextRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {bytes.ReadNextRequestBody} ReadNextRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ReadNextRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.bytes.ReadNextRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.len = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a ReadNextRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof bytes.ReadNextRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {bytes.ReadNextRequestBody} ReadNextRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ReadNextRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a ReadNextRequestBody message.
         * @function verify
         * @memberof bytes.ReadNextRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ReadNextRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.len != null && Object.hasOwnProperty.call(message, "len")) {
                var error = $root.common.UInt64Value.verify(message.len, long + 1);
                if (error)
                    return "len." + error;
            }
            return null;
        };

        /**
         * Creates a ReadNextRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof bytes.ReadNextRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {bytes.ReadNextRequestBody} ReadNextRequestBody
         */
        ReadNextRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.bytes.ReadNextRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".bytes.ReadNextRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.bytes.ReadNextRequestBody();
            if (object.len != null) {
                if (!$util.isObject(object.len))
                    throw TypeError(".bytes.ReadNextRequestBody.len: object expected");
                message.len = $root.common.UInt64Value.fromObject(object.len, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a ReadNextRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof bytes.ReadNextRequestBody
         * @static
         * @param {bytes.ReadNextRequestBody} message ReadNextRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ReadNextRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.len = null;
            if (message.len != null && Object.hasOwnProperty.call(message, "len"))
                object.len = $root.common.UInt64Value.toObject(message.len, options, q + 1);
            return object;
        };

        /**
         * Converts this ReadNextRequestBody to JSON.
         * @function toJSON
         * @memberof bytes.ReadNextRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ReadNextRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ReadNextRequestBody
         * @function getTypeUrl
         * @memberof bytes.ReadNextRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ReadNextRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/bytes.ReadNextRequestBody";
        };

        return ReadNextRequestBody;
    })();

    bytes.ReadAtRequestBody = (function() {

        /**
         * Properties of a ReadAtRequestBody.
         * @memberof bytes
         * @interface IReadAtRequestBody
         * @property {number|Long|null} [pos] ReadAtRequestBody pos
         * @property {common.IUInt64Value|null} [len] ReadAtRequestBody len
         */

        /**
         * Constructs a new ReadAtRequestBody.
         * @memberof bytes
         * @classdesc Represents a ReadAtRequestBody.
         * @implements IReadAtRequestBody
         * @constructor
         * @param {bytes.IReadAtRequestBody=} [properties] Properties to set
         */
        function ReadAtRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ReadAtRequestBody pos.
         * @member {number|Long} pos
         * @memberof bytes.ReadAtRequestBody
         * @instance
         */
        ReadAtRequestBody.prototype.pos = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * ReadAtRequestBody len.
         * @member {common.IUInt64Value|null|undefined} len
         * @memberof bytes.ReadAtRequestBody
         * @instance
         */
        ReadAtRequestBody.prototype.len = null;

        /**
         * Creates a new ReadAtRequestBody instance using the specified properties.
         * @function create
         * @memberof bytes.ReadAtRequestBody
         * @static
         * @param {bytes.IReadAtRequestBody=} [properties] Properties to set
         * @returns {bytes.ReadAtRequestBody} ReadAtRequestBody instance
         */
        ReadAtRequestBody.create = function create(properties) {
            return new ReadAtRequestBody(properties);
        };

        /**
         * Encodes the specified ReadAtRequestBody message. Does not implicitly {@link bytes.ReadAtRequestBody.verify|verify} messages.
         * @function encode
         * @memberof bytes.ReadAtRequestBody
         * @static
         * @param {bytes.IReadAtRequestBody} message ReadAtRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ReadAtRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.pos != null && Object.hasOwnProperty.call(message, "pos"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.pos);
            if (message.len != null && Object.hasOwnProperty.call(message, "len"))
                $root.common.UInt64Value.encode(message.len, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified ReadAtRequestBody message, length delimited. Does not implicitly {@link bytes.ReadAtRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof bytes.ReadAtRequestBody
         * @static
         * @param {bytes.IReadAtRequestBody} message ReadAtRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ReadAtRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a ReadAtRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof bytes.ReadAtRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {bytes.ReadAtRequestBody} ReadAtRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ReadAtRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.bytes.ReadAtRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.pos = reader.uint64();
                        break;
                    }
                case 2: {
                        message.len = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a ReadAtRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof bytes.ReadAtRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {bytes.ReadAtRequestBody} ReadAtRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ReadAtRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a ReadAtRequestBody message.
         * @function verify
         * @memberof bytes.ReadAtRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ReadAtRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.pos != null && Object.hasOwnProperty.call(message, "pos"))
                if (!$util.isInteger(message.pos) && !(message.pos && $util.isInteger(message.pos.low) && $util.isInteger(message.pos.high)))
                    return "pos: integer|Long expected";
            if (message.len != null && Object.hasOwnProperty.call(message, "len")) {
                var error = $root.common.UInt64Value.verify(message.len, long + 1);
                if (error)
                    return "len." + error;
            }
            return null;
        };

        /**
         * Creates a ReadAtRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof bytes.ReadAtRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {bytes.ReadAtRequestBody} ReadAtRequestBody
         */
        ReadAtRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.bytes.ReadAtRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".bytes.ReadAtRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.bytes.ReadAtRequestBody();
            if (object.pos != null)
                if ($util.Long)
                    message.pos = $util.Long.fromValue(object.pos, true);
                else if (typeof object.pos === "string")
                    message.pos = parseInt(object.pos, 10);
                else if (typeof object.pos === "number")
                    message.pos = object.pos;
                else if (typeof object.pos === "object")
                    message.pos = new $util.LongBits(object.pos.low >>> 0, object.pos.high >>> 0).toNumber(true);
            if (object.len != null) {
                if (!$util.isObject(object.len))
                    throw TypeError(".bytes.ReadAtRequestBody.len: object expected");
                message.len = $root.common.UInt64Value.fromObject(object.len, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a ReadAtRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof bytes.ReadAtRequestBody
         * @static
         * @param {bytes.ReadAtRequestBody} message ReadAtRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ReadAtRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.pos = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.pos = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
                object.len = null;
            }
            if (message.pos != null && Object.hasOwnProperty.call(message, "pos"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.pos = typeof message.pos === "number" ? BigInt(message.pos) : $util.Long.fromBits(message.pos.low >>> 0, message.pos.high >>> 0, true).toBigInt();
                else if (typeof message.pos === "number")
                    object.pos = options.longs === String ? String(message.pos) : message.pos;
                else
                    object.pos = options.longs === String ? $util.Long.prototype.toString.call(message.pos) : options.longs === Number ? new $util.LongBits(message.pos.low >>> 0, message.pos.high >>> 0).toNumber(true) : message.pos;
            if (message.len != null && Object.hasOwnProperty.call(message, "len"))
                object.len = $root.common.UInt64Value.toObject(message.len, options, q + 1);
            return object;
        };

        /**
         * Converts this ReadAtRequestBody to JSON.
         * @function toJSON
         * @memberof bytes.ReadAtRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ReadAtRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ReadAtRequestBody
         * @function getTypeUrl
         * @memberof bytes.ReadAtRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ReadAtRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/bytes.ReadAtRequestBody";
        };

        return ReadAtRequestBody;
    })();

    bytes.SeekRequestBody = (function() {

        /**
         * Properties of a SeekRequestBody.
         * @memberof bytes
         * @interface ISeekRequestBody
         * @property {number|Long|null} [offset] SeekRequestBody offset
         */

        /**
         * Constructs a new SeekRequestBody.
         * @memberof bytes
         * @classdesc Represents a SeekRequestBody.
         * @implements ISeekRequestBody
         * @constructor
         * @param {bytes.ISeekRequestBody=} [properties] Properties to set
         */
        function SeekRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * SeekRequestBody offset.
         * @member {number|Long} offset
         * @memberof bytes.SeekRequestBody
         * @instance
         */
        SeekRequestBody.prototype.offset = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new SeekRequestBody instance using the specified properties.
         * @function create
         * @memberof bytes.SeekRequestBody
         * @static
         * @param {bytes.ISeekRequestBody=} [properties] Properties to set
         * @returns {bytes.SeekRequestBody} SeekRequestBody instance
         */
        SeekRequestBody.create = function create(properties) {
            return new SeekRequestBody(properties);
        };

        /**
         * Encodes the specified SeekRequestBody message. Does not implicitly {@link bytes.SeekRequestBody.verify|verify} messages.
         * @function encode
         * @memberof bytes.SeekRequestBody
         * @static
         * @param {bytes.ISeekRequestBody} message SeekRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SeekRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.offset != null && Object.hasOwnProperty.call(message, "offset"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.offset);
            return writer;
        };

        /**
         * Encodes the specified SeekRequestBody message, length delimited. Does not implicitly {@link bytes.SeekRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof bytes.SeekRequestBody
         * @static
         * @param {bytes.ISeekRequestBody} message SeekRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        SeekRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a SeekRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof bytes.SeekRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {bytes.SeekRequestBody} SeekRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SeekRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.bytes.SeekRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.offset = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a SeekRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof bytes.SeekRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {bytes.SeekRequestBody} SeekRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        SeekRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a SeekRequestBody message.
         * @function verify
         * @memberof bytes.SeekRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        SeekRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.offset != null && Object.hasOwnProperty.call(message, "offset"))
                if (!$util.isInteger(message.offset) && !(message.offset && $util.isInteger(message.offset.low) && $util.isInteger(message.offset.high)))
                    return "offset: integer|Long expected";
            return null;
        };

        /**
         * Creates a SeekRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof bytes.SeekRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {bytes.SeekRequestBody} SeekRequestBody
         */
        SeekRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.bytes.SeekRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".bytes.SeekRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.bytes.SeekRequestBody();
            if (object.offset != null)
                if ($util.Long)
                    message.offset = $util.Long.fromValue(object.offset, true);
                else if (typeof object.offset === "string")
                    message.offset = parseInt(object.offset, 10);
                else if (typeof object.offset === "number")
                    message.offset = object.offset;
                else if (typeof object.offset === "object")
                    message.offset = new $util.LongBits(object.offset.low >>> 0, object.offset.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from a SeekRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof bytes.SeekRequestBody
         * @static
         * @param {bytes.SeekRequestBody} message SeekRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        SeekRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.offset = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.offset = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            if (message.offset != null && Object.hasOwnProperty.call(message, "offset"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.offset = typeof message.offset === "number" ? BigInt(message.offset) : $util.Long.fromBits(message.offset.low >>> 0, message.offset.high >>> 0, true).toBigInt();
                else if (typeof message.offset === "number")
                    object.offset = options.longs === String ? String(message.offset) : message.offset;
                else
                    object.offset = options.longs === String ? $util.Long.prototype.toString.call(message.offset) : options.longs === Number ? new $util.LongBits(message.offset.low >>> 0, message.offset.high >>> 0).toNumber(true) : message.offset;
            return object;
        };

        /**
         * Converts this SeekRequestBody to JSON.
         * @function toJSON
         * @memberof bytes.SeekRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        SeekRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for SeekRequestBody
         * @function getTypeUrl
         * @memberof bytes.SeekRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        SeekRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/bytes.SeekRequestBody";
        };

        return SeekRequestBody;
    })();

    return bytes;
})();

$root.common = (function() {

    /**
     * Namespace common.
     * @exports common
     * @namespace
     */
    var common = {};

    common.ObjectReference = (function() {

        /**
         * Properties of an ObjectReference.
         * @memberof common
         * @interface IObjectReference
         * @property {string|null} [objType] ObjectReference objType
         * @property {Array.<string>|null} [path] ObjectReference path
         */

        /**
         * Constructs a new ObjectReference.
         * @memberof common
         * @classdesc Represents an ObjectReference.
         * @implements IObjectReference
         * @constructor
         * @param {common.IObjectReference=} [properties] Properties to set
         */
        function ObjectReference(properties) {
            this.path = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ObjectReference objType.
         * @member {string} objType
         * @memberof common.ObjectReference
         * @instance
         */
        ObjectReference.prototype.objType = "";

        /**
         * ObjectReference path.
         * @member {Array.<string>} path
         * @memberof common.ObjectReference
         * @instance
         */
        ObjectReference.prototype.path = $util.emptyArray;

        /**
         * Creates a new ObjectReference instance using the specified properties.
         * @function create
         * @memberof common.ObjectReference
         * @static
         * @param {common.IObjectReference=} [properties] Properties to set
         * @returns {common.ObjectReference} ObjectReference instance
         */
        ObjectReference.create = function create(properties) {
            return new ObjectReference(properties);
        };

        /**
         * Encodes the specified ObjectReference message. Does not implicitly {@link common.ObjectReference.verify|verify} messages.
         * @function encode
         * @memberof common.ObjectReference
         * @static
         * @param {common.IObjectReference} message ObjectReference message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ObjectReference.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.objType != null && Object.hasOwnProperty.call(message, "objType"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.objType);
            if (message.path != null && message.path.length)
                for (var i = 0; i < message.path.length; ++i)
                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.path[i]);
            return writer;
        };

        /**
         * Encodes the specified ObjectReference message, length delimited. Does not implicitly {@link common.ObjectReference.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.ObjectReference
         * @static
         * @param {common.IObjectReference} message ObjectReference message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ObjectReference.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an ObjectReference message from the specified reader or buffer.
         * @function decode
         * @memberof common.ObjectReference
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.ObjectReference} ObjectReference
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ObjectReference.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ObjectReference();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.objType = reader.string();
                        break;
                    }
                case 2: {
                        if (!(message.path && message.path.length))
                            message.path = [];
                        message.path.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an ObjectReference message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.ObjectReference
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.ObjectReference} ObjectReference
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ObjectReference.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an ObjectReference message.
         * @function verify
         * @memberof common.ObjectReference
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ObjectReference.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.objType != null && Object.hasOwnProperty.call(message, "objType"))
                if (!$util.isString(message.objType))
                    return "objType: string expected";
            if (message.path != null && Object.hasOwnProperty.call(message, "path")) {
                if (!Array.isArray(message.path))
                    return "path: array expected";
                for (var i = 0; i < message.path.length; ++i)
                    if (!$util.isString(message.path[i]))
                        return "path: string[] expected";
            }
            return null;
        };

        /**
         * Creates an ObjectReference message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.ObjectReference
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.ObjectReference} ObjectReference
         */
        ObjectReference.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.ObjectReference)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.ObjectReference: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.ObjectReference();
            if (object.objType != null)
                message.objType = String(object.objType);
            if (object.path) {
                if (!Array.isArray(object.path))
                    throw TypeError(".common.ObjectReference.path: array expected");
                message.path = [];
                for (var i = 0; i < object.path.length; ++i)
                    message.path[i] = String(object.path[i]);
            }
            return message;
        };

        /**
         * Creates a plain object from an ObjectReference message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.ObjectReference
         * @static
         * @param {common.ObjectReference} message ObjectReference
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ObjectReference.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.path = [];
            if (options.defaults)
                object.objType = "";
            if (message.objType != null && Object.hasOwnProperty.call(message, "objType"))
                object.objType = message.objType;
            if (message.path && message.path.length) {
                object.path = [];
                for (var j = 0; j < message.path.length; ++j)
                    object.path[j] = message.path[j];
            }
            return object;
        };

        /**
         * Converts this ObjectReference to JSON.
         * @function toJSON
         * @memberof common.ObjectReference
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ObjectReference.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ObjectReference
         * @function getTypeUrl
         * @memberof common.ObjectReference
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ObjectReference.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.ObjectReference";
        };

        return ObjectReference;
    })();

    common.BooleanValue = (function() {

        /**
         * Properties of a BooleanValue.
         * @memberof common
         * @interface IBooleanValue
         * @property {boolean|null} [value] BooleanValue value
         */

        /**
         * Constructs a new BooleanValue.
         * @memberof common
         * @classdesc Represents a BooleanValue.
         * @implements IBooleanValue
         * @constructor
         * @param {common.IBooleanValue=} [properties] Properties to set
         */
        function BooleanValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * BooleanValue value.
         * @member {boolean} value
         * @memberof common.BooleanValue
         * @instance
         */
        BooleanValue.prototype.value = false;

        /**
         * Creates a new BooleanValue instance using the specified properties.
         * @function create
         * @memberof common.BooleanValue
         * @static
         * @param {common.IBooleanValue=} [properties] Properties to set
         * @returns {common.BooleanValue} BooleanValue instance
         */
        BooleanValue.create = function create(properties) {
            return new BooleanValue(properties);
        };

        /**
         * Encodes the specified BooleanValue message. Does not implicitly {@link common.BooleanValue.verify|verify} messages.
         * @function encode
         * @memberof common.BooleanValue
         * @static
         * @param {common.IBooleanValue} message BooleanValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BooleanValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 0 =*/8).bool(message.value);
            return writer;
        };

        /**
         * Encodes the specified BooleanValue message, length delimited. Does not implicitly {@link common.BooleanValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.BooleanValue
         * @static
         * @param {common.IBooleanValue} message BooleanValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BooleanValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a BooleanValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.BooleanValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.BooleanValue} BooleanValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BooleanValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BooleanValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.bool();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a BooleanValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.BooleanValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.BooleanValue} BooleanValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BooleanValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a BooleanValue message.
         * @function verify
         * @memberof common.BooleanValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        BooleanValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (typeof message.value !== "boolean")
                    return "value: boolean expected";
            return null;
        };

        /**
         * Creates a BooleanValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.BooleanValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.BooleanValue} BooleanValue
         */
        BooleanValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.BooleanValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.BooleanValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.BooleanValue();
            if (object.value != null)
                message.value = Boolean(object.value);
            return message;
        };

        /**
         * Creates a plain object from a BooleanValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.BooleanValue
         * @static
         * @param {common.BooleanValue} message BooleanValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        BooleanValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.value = false;
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = message.value;
            return object;
        };

        /**
         * Converts this BooleanValue to JSON.
         * @function toJSON
         * @memberof common.BooleanValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        BooleanValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for BooleanValue
         * @function getTypeUrl
         * @memberof common.BooleanValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        BooleanValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.BooleanValue";
        };

        return BooleanValue;
    })();

    common.StringArrayValue = (function() {

        /**
         * Properties of a StringArrayValue.
         * @memberof common
         * @interface IStringArrayValue
         * @property {Array.<string>|null} [values] StringArrayValue values
         */

        /**
         * Constructs a new StringArrayValue.
         * @memberof common
         * @classdesc Represents a StringArrayValue.
         * @implements IStringArrayValue
         * @constructor
         * @param {common.IStringArrayValue=} [properties] Properties to set
         */
        function StringArrayValue(properties) {
            this.values = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * StringArrayValue values.
         * @member {Array.<string>} values
         * @memberof common.StringArrayValue
         * @instance
         */
        StringArrayValue.prototype.values = $util.emptyArray;

        /**
         * Creates a new StringArrayValue instance using the specified properties.
         * @function create
         * @memberof common.StringArrayValue
         * @static
         * @param {common.IStringArrayValue=} [properties] Properties to set
         * @returns {common.StringArrayValue} StringArrayValue instance
         */
        StringArrayValue.create = function create(properties) {
            return new StringArrayValue(properties);
        };

        /**
         * Encodes the specified StringArrayValue message. Does not implicitly {@link common.StringArrayValue.verify|verify} messages.
         * @function encode
         * @memberof common.StringArrayValue
         * @static
         * @param {common.IStringArrayValue} message StringArrayValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringArrayValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.values != null && message.values.length)
                for (var i = 0; i < message.values.length; ++i)
                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.values[i]);
            return writer;
        };

        /**
         * Encodes the specified StringArrayValue message, length delimited. Does not implicitly {@link common.StringArrayValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.StringArrayValue
         * @static
         * @param {common.IStringArrayValue} message StringArrayValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringArrayValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a StringArrayValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.StringArrayValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.StringArrayValue} StringArrayValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringArrayValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringArrayValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.values && message.values.length))
                            message.values = [];
                        message.values.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a StringArrayValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.StringArrayValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.StringArrayValue} StringArrayValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringArrayValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a StringArrayValue message.
         * @function verify
         * @memberof common.StringArrayValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        StringArrayValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.values != null && Object.hasOwnProperty.call(message, "values")) {
                if (!Array.isArray(message.values))
                    return "values: array expected";
                for (var i = 0; i < message.values.length; ++i)
                    if (!$util.isString(message.values[i]))
                        return "values: string[] expected";
            }
            return null;
        };

        /**
         * Creates a StringArrayValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.StringArrayValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.StringArrayValue} StringArrayValue
         */
        StringArrayValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.StringArrayValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.StringArrayValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.StringArrayValue();
            if (object.values) {
                if (!Array.isArray(object.values))
                    throw TypeError(".common.StringArrayValue.values: array expected");
                message.values = [];
                for (var i = 0; i < object.values.length; ++i)
                    message.values[i] = String(object.values[i]);
            }
            return message;
        };

        /**
         * Creates a plain object from a StringArrayValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.StringArrayValue
         * @static
         * @param {common.StringArrayValue} message StringArrayValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        StringArrayValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.values = [];
            if (message.values && message.values.length) {
                object.values = [];
                for (var j = 0; j < message.values.length; ++j)
                    object.values[j] = message.values[j];
            }
            return object;
        };

        /**
         * Converts this StringArrayValue to JSON.
         * @function toJSON
         * @memberof common.StringArrayValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        StringArrayValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for StringArrayValue
         * @function getTypeUrl
         * @memberof common.StringArrayValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        StringArrayValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.StringArrayValue";
        };

        return StringArrayValue;
    })();

    common.UInt64Value = (function() {

        /**
         * Properties of a UInt64Value.
         * @memberof common
         * @interface IUInt64Value
         * @property {number|Long|null} [value] UInt64Value value
         */

        /**
         * Constructs a new UInt64Value.
         * @memberof common
         * @classdesc Represents a UInt64Value.
         * @implements IUInt64Value
         * @constructor
         * @param {common.IUInt64Value=} [properties] Properties to set
         */
        function UInt64Value(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * UInt64Value value.
         * @member {number|Long} value
         * @memberof common.UInt64Value
         * @instance
         */
        UInt64Value.prototype.value = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new UInt64Value instance using the specified properties.
         * @function create
         * @memberof common.UInt64Value
         * @static
         * @param {common.IUInt64Value=} [properties] Properties to set
         * @returns {common.UInt64Value} UInt64Value instance
         */
        UInt64Value.create = function create(properties) {
            return new UInt64Value(properties);
        };

        /**
         * Encodes the specified UInt64Value message. Does not implicitly {@link common.UInt64Value.verify|verify} messages.
         * @function encode
         * @memberof common.UInt64Value
         * @static
         * @param {common.IUInt64Value} message UInt64Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt64Value.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.value);
            return writer;
        };

        /**
         * Encodes the specified UInt64Value message, length delimited. Does not implicitly {@link common.UInt64Value.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.UInt64Value
         * @static
         * @param {common.IUInt64Value} message UInt64Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt64Value.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a UInt64Value message from the specified reader or buffer.
         * @function decode
         * @memberof common.UInt64Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.UInt64Value} UInt64Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt64Value.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt64Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a UInt64Value message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.UInt64Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.UInt64Value} UInt64Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt64Value.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a UInt64Value message.
         * @function verify
         * @memberof common.UInt64Value
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        UInt64Value.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!$util.isInteger(message.value) && !(message.value && $util.isInteger(message.value.low) && $util.isInteger(message.value.high)))
                    return "value: integer|Long expected";
            return null;
        };

        /**
         * Creates a UInt64Value message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.UInt64Value
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.UInt64Value} UInt64Value
         */
        UInt64Value.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.UInt64Value)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.UInt64Value: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.UInt64Value();
            if (object.value != null)
                if ($util.Long)
                    message.value = $util.Long.fromValue(object.value, true);
                else if (typeof object.value === "string")
                    message.value = parseInt(object.value, 10);
                else if (typeof object.value === "number")
                    message.value = object.value;
                else if (typeof object.value === "object")
                    message.value = new $util.LongBits(object.value.low >>> 0, object.value.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from a UInt64Value message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.UInt64Value
         * @static
         * @param {common.UInt64Value} message UInt64Value
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        UInt64Value.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.value = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.value = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.value = typeof message.value === "number" ? BigInt(message.value) : $util.Long.fromBits(message.value.low >>> 0, message.value.high >>> 0, true).toBigInt();
                else if (typeof message.value === "number")
                    object.value = options.longs === String ? String(message.value) : message.value;
                else
                    object.value = options.longs === String ? $util.Long.prototype.toString.call(message.value) : options.longs === Number ? new $util.LongBits(message.value.low >>> 0, message.value.high >>> 0).toNumber(true) : message.value;
            return object;
        };

        /**
         * Converts this UInt64Value to JSON.
         * @function toJSON
         * @memberof common.UInt64Value
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        UInt64Value.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for UInt64Value
         * @function getTypeUrl
         * @memberof common.UInt64Value
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        UInt64Value.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.UInt64Value";
        };

        return UInt64Value;
    })();

    common.UInt32Value = (function() {

        /**
         * Properties of a UInt32Value.
         * @memberof common
         * @interface IUInt32Value
         * @property {number|null} [value] UInt32Value value
         */

        /**
         * Constructs a new UInt32Value.
         * @memberof common
         * @classdesc Represents a UInt32Value.
         * @implements IUInt32Value
         * @constructor
         * @param {common.IUInt32Value=} [properties] Properties to set
         */
        function UInt32Value(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * UInt32Value value.
         * @member {number} value
         * @memberof common.UInt32Value
         * @instance
         */
        UInt32Value.prototype.value = 0;

        /**
         * Creates a new UInt32Value instance using the specified properties.
         * @function create
         * @memberof common.UInt32Value
         * @static
         * @param {common.IUInt32Value=} [properties] Properties to set
         * @returns {common.UInt32Value} UInt32Value instance
         */
        UInt32Value.create = function create(properties) {
            return new UInt32Value(properties);
        };

        /**
         * Encodes the specified UInt32Value message. Does not implicitly {@link common.UInt32Value.verify|verify} messages.
         * @function encode
         * @memberof common.UInt32Value
         * @static
         * @param {common.IUInt32Value} message UInt32Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt32Value.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.value);
            return writer;
        };

        /**
         * Encodes the specified UInt32Value message, length delimited. Does not implicitly {@link common.UInt32Value.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.UInt32Value
         * @static
         * @param {common.IUInt32Value} message UInt32Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt32Value.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a UInt32Value message from the specified reader or buffer.
         * @function decode
         * @memberof common.UInt32Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.UInt32Value} UInt32Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt32Value.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt32Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.uint32();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a UInt32Value message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.UInt32Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.UInt32Value} UInt32Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt32Value.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a UInt32Value message.
         * @function verify
         * @memberof common.UInt32Value
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        UInt32Value.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!$util.isInteger(message.value))
                    return "value: integer expected";
            return null;
        };

        /**
         * Creates a UInt32Value message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.UInt32Value
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.UInt32Value} UInt32Value
         */
        UInt32Value.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.UInt32Value)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.UInt32Value: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.UInt32Value();
            if (object.value != null)
                message.value = object.value >>> 0;
            return message;
        };

        /**
         * Creates a plain object from a UInt32Value message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.UInt32Value
         * @static
         * @param {common.UInt32Value} message UInt32Value
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        UInt32Value.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.value = 0;
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = message.value;
            return object;
        };

        /**
         * Converts this UInt32Value to JSON.
         * @function toJSON
         * @memberof common.UInt32Value
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        UInt32Value.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for UInt32Value
         * @function getTypeUrl
         * @memberof common.UInt32Value
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        UInt32Value.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.UInt32Value";
        };

        return UInt32Value;
    })();

    common.StringValue = (function() {

        /**
         * Properties of a StringValue.
         * @memberof common
         * @interface IStringValue
         * @property {string|null} [value] StringValue value
         */

        /**
         * Constructs a new StringValue.
         * @memberof common
         * @classdesc Represents a StringValue.
         * @implements IStringValue
         * @constructor
         * @param {common.IStringValue=} [properties] Properties to set
         */
        function StringValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * StringValue value.
         * @member {string} value
         * @memberof common.StringValue
         * @instance
         */
        StringValue.prototype.value = "";

        /**
         * Creates a new StringValue instance using the specified properties.
         * @function create
         * @memberof common.StringValue
         * @static
         * @param {common.IStringValue=} [properties] Properties to set
         * @returns {common.StringValue} StringValue instance
         */
        StringValue.create = function create(properties) {
            return new StringValue(properties);
        };

        /**
         * Encodes the specified StringValue message. Does not implicitly {@link common.StringValue.verify|verify} messages.
         * @function encode
         * @memberof common.StringValue
         * @static
         * @param {common.IStringValue} message StringValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.value);
            return writer;
        };

        /**
         * Encodes the specified StringValue message, length delimited. Does not implicitly {@link common.StringValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.StringValue
         * @static
         * @param {common.IStringValue} message StringValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a StringValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.StringValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.StringValue} StringValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a StringValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.StringValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.StringValue} StringValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a StringValue message.
         * @function verify
         * @memberof common.StringValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        StringValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!$util.isString(message.value))
                    return "value: string expected";
            return null;
        };

        /**
         * Creates a StringValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.StringValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.StringValue} StringValue
         */
        StringValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.StringValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.StringValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.StringValue();
            if (object.value != null)
                message.value = String(object.value);
            return message;
        };

        /**
         * Creates a plain object from a StringValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.StringValue
         * @static
         * @param {common.StringValue} message StringValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        StringValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.value = "";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = message.value;
            return object;
        };

        /**
         * Converts this StringValue to JSON.
         * @function toJSON
         * @memberof common.StringValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        StringValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for StringValue
         * @function getTypeUrl
         * @memberof common.StringValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        StringValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.StringValue";
        };

        return StringValue;
    })();

    common.BytesValue = (function() {

        /**
         * Properties of a BytesValue.
         * @memberof common
         * @interface IBytesValue
         * @property {Uint8Array|null} [value] BytesValue value
         */

        /**
         * Constructs a new BytesValue.
         * @memberof common
         * @classdesc Represents a BytesValue.
         * @implements IBytesValue
         * @constructor
         * @param {common.IBytesValue=} [properties] Properties to set
         */
        function BytesValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * BytesValue value.
         * @member {Uint8Array} value
         * @memberof common.BytesValue
         * @instance
         */
        BytesValue.prototype.value = $util.newBuffer([]);

        /**
         * Creates a new BytesValue instance using the specified properties.
         * @function create
         * @memberof common.BytesValue
         * @static
         * @param {common.IBytesValue=} [properties] Properties to set
         * @returns {common.BytesValue} BytesValue instance
         */
        BytesValue.create = function create(properties) {
            return new BytesValue(properties);
        };

        /**
         * Encodes the specified BytesValue message. Does not implicitly {@link common.BytesValue.verify|verify} messages.
         * @function encode
         * @memberof common.BytesValue
         * @static
         * @param {common.IBytesValue} message BytesValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BytesValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.value);
            return writer;
        };

        /**
         * Encodes the specified BytesValue message, length delimited. Does not implicitly {@link common.BytesValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.BytesValue
         * @static
         * @param {common.IBytesValue} message BytesValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BytesValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a BytesValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.BytesValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.BytesValue} BytesValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BytesValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BytesValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.bytes();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a BytesValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.BytesValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.BytesValue} BytesValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BytesValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a BytesValue message.
         * @function verify
         * @memberof common.BytesValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        BytesValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!(message.value && typeof message.value.length === "number" || $util.isString(message.value)))
                    return "value: buffer expected";
            return null;
        };

        /**
         * Creates a BytesValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.BytesValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.BytesValue} BytesValue
         */
        BytesValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.BytesValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.BytesValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.BytesValue();
            if (object.value != null)
                if (typeof object.value === "string")
                    $util.base64.decode(object.value, message.value = $util.newBuffer($util.base64.length(object.value)), 0);
                else if (object.value.length >= 0)
                    message.value = object.value;
            return message;
        };

        /**
         * Creates a plain object from a BytesValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.BytesValue
         * @static
         * @param {common.BytesValue} message BytesValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        BytesValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if (options.bytes === String)
                    object.value = "";
                else {
                    object.value = [];
                    if (options.bytes !== Array)
                        object.value = $util.newBuffer(object.value);
                }
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = options.bytes === String ? $util.base64.encode(message.value, 0, message.value.length) : options.bytes === Array ? Array.prototype.slice.call(message.value) : message.value;
            return object;
        };

        /**
         * Converts this BytesValue to JSON.
         * @function toJSON
         * @memberof common.BytesValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        BytesValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for BytesValue
         * @function getTypeUrl
         * @memberof common.BytesValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        BytesValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.BytesValue";
        };

        return BytesValue;
    })();

    common.ErrorValue = (function() {

        /**
         * Properties of an ErrorValue.
         * @memberof common
         * @interface IErrorValue
         * @property {string|null} [runtimeExcJson] ErrorValue runtimeExcJson
         * @property {string|null} [err] ErrorValue err
         */

        /**
         * Constructs a new ErrorValue.
         * @memberof common
         * @classdesc Represents an ErrorValue.
         * @implements IErrorValue
         * @constructor
         * @param {common.IErrorValue=} [properties] Properties to set
         */
        function ErrorValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ErrorValue runtimeExcJson.
         * @member {string} runtimeExcJson
         * @memberof common.ErrorValue
         * @instance
         */
        ErrorValue.prototype.runtimeExcJson = "";

        /**
         * ErrorValue err.
         * @member {string} err
         * @memberof common.ErrorValue
         * @instance
         */
        ErrorValue.prototype.err = "";

        /**
         * Creates a new ErrorValue instance using the specified properties.
         * @function create
         * @memberof common.ErrorValue
         * @static
         * @param {common.IErrorValue=} [properties] Properties to set
         * @returns {common.ErrorValue} ErrorValue instance
         */
        ErrorValue.create = function create(properties) {
            return new ErrorValue(properties);
        };

        /**
         * Encodes the specified ErrorValue message. Does not implicitly {@link common.ErrorValue.verify|verify} messages.
         * @function encode
         * @memberof common.ErrorValue
         * @static
         * @param {common.IErrorValue} message ErrorValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ErrorValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.runtimeExcJson != null && Object.hasOwnProperty.call(message, "runtimeExcJson"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.runtimeExcJson);
            if (message.err != null && Object.hasOwnProperty.call(message, "err"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.err);
            return writer;
        };

        /**
         * Encodes the specified ErrorValue message, length delimited. Does not implicitly {@link common.ErrorValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.ErrorValue
         * @static
         * @param {common.IErrorValue} message ErrorValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ErrorValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an ErrorValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.ErrorValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.ErrorValue} ErrorValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ErrorValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ErrorValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.runtimeExcJson = reader.string();
                        break;
                    }
                case 2: {
                        message.err = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an ErrorValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.ErrorValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.ErrorValue} ErrorValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ErrorValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an ErrorValue message.
         * @function verify
         * @memberof common.ErrorValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ErrorValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.runtimeExcJson != null && Object.hasOwnProperty.call(message, "runtimeExcJson"))
                if (!$util.isString(message.runtimeExcJson))
                    return "runtimeExcJson: string expected";
            if (message.err != null && Object.hasOwnProperty.call(message, "err"))
                if (!$util.isString(message.err))
                    return "err: string expected";
            return null;
        };

        /**
         * Creates an ErrorValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.ErrorValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.ErrorValue} ErrorValue
         */
        ErrorValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.ErrorValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.ErrorValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.ErrorValue();
            if (object.runtimeExcJson != null)
                message.runtimeExcJson = String(object.runtimeExcJson);
            if (object.err != null)
                message.err = String(object.err);
            return message;
        };

        /**
         * Creates a plain object from an ErrorValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.ErrorValue
         * @static
         * @param {common.ErrorValue} message ErrorValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ErrorValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.runtimeExcJson = "";
                object.err = "";
            }
            if (message.runtimeExcJson != null && Object.hasOwnProperty.call(message, "runtimeExcJson"))
                object.runtimeExcJson = message.runtimeExcJson;
            if (message.err != null && Object.hasOwnProperty.call(message, "err"))
                object.err = message.err;
            return object;
        };

        /**
         * Converts this ErrorValue to JSON.
         * @function toJSON
         * @memberof common.ErrorValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ErrorValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ErrorValue
         * @function getTypeUrl
         * @memberof common.ErrorValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ErrorValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.ErrorValue";
        };

        return ErrorValue;
    })();

    common.AnyValue = (function() {

        /**
         * Properties of an AnyValue.
         * @memberof common
         * @interface IAnyValue
         * @property {string|null} [type] AnyValue type
         * @property {common.IStringValue|null} [json] AnyValue json
         * @property {common.IBytesValue|null} [bytes] AnyValue bytes
         */

        /**
         * Constructs a new AnyValue.
         * @memberof common
         * @classdesc Represents an AnyValue.
         * @implements IAnyValue
         * @constructor
         * @param {common.IAnyValue=} [properties] Properties to set
         */
        function AnyValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * AnyValue type.
         * @member {string} type
         * @memberof common.AnyValue
         * @instance
         */
        AnyValue.prototype.type = "";

        /**
         * AnyValue json.
         * @member {common.IStringValue|null|undefined} json
         * @memberof common.AnyValue
         * @instance
         */
        AnyValue.prototype.json = null;

        /**
         * AnyValue bytes.
         * @member {common.IBytesValue|null|undefined} bytes
         * @memberof common.AnyValue
         * @instance
         */
        AnyValue.prototype.bytes = null;

        /**
         * Creates a new AnyValue instance using the specified properties.
         * @function create
         * @memberof common.AnyValue
         * @static
         * @param {common.IAnyValue=} [properties] Properties to set
         * @returns {common.AnyValue} AnyValue instance
         */
        AnyValue.create = function create(properties) {
            return new AnyValue(properties);
        };

        /**
         * Encodes the specified AnyValue message. Does not implicitly {@link common.AnyValue.verify|verify} messages.
         * @function encode
         * @memberof common.AnyValue
         * @static
         * @param {common.IAnyValue} message AnyValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AnyValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.type);
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified AnyValue message, length delimited. Does not implicitly {@link common.AnyValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.AnyValue
         * @static
         * @param {common.IAnyValue} message AnyValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AnyValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an AnyValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.AnyValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.AnyValue} AnyValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AnyValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.AnyValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.type = reader.string();
                        break;
                    }
                case 2: {
                        message.json = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an AnyValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.AnyValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.AnyValue} AnyValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AnyValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an AnyValue message.
         * @function verify
         * @memberof common.AnyValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        AnyValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.json != null && Object.hasOwnProperty.call(message, "json")) {
                var error = $root.common.StringValue.verify(message.json, long + 1);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes, long + 1);
                if (error)
                    return "bytes." + error;
            }
            return null;
        };

        /**
         * Creates an AnyValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.AnyValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.AnyValue} AnyValue
         */
        AnyValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.AnyValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.AnyValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.AnyValue();
            if (object.type != null)
                message.type = String(object.type);
            if (object.json != null) {
                if (!$util.isObject(object.json))
                    throw TypeError(".common.AnyValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json, long + 1);
            }
            if (object.bytes != null) {
                if (!$util.isObject(object.bytes))
                    throw TypeError(".common.AnyValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an AnyValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.AnyValue
         * @static
         * @param {common.AnyValue} message AnyValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        AnyValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.json = null;
                object.bytes = null;
            }
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                object.type = message.type;
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = $root.common.StringValue.toObject(message.json, options, q + 1);
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options, q + 1);
            return object;
        };

        /**
         * Converts this AnyValue to JSON.
         * @function toJSON
         * @memberof common.AnyValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        AnyValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for AnyValue
         * @function getTypeUrl
         * @memberof common.AnyValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        AnyValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.AnyValue";
        };

        return AnyValue;
    })();

    return common;
})();

module.exports = $root;

},{"protobufjs/minimal":84}],73:[function(require,module,exports){
arguments[4][27][0].apply(exports,arguments)
},{"dup":27,"protobufjs/minimal":84}],74:[function(require,module,exports){
arguments[4][28][0].apply(exports,arguments)
},{"dup":28,"protobufjs/minimal":84}],75:[function(require,module,exports){
arguments[4][29][0].apply(exports,arguments)
},{"dup":29,"protobufjs/minimal":84}],76:[function(require,module,exports){
/*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.ipc = (function() {

    /**
     * Namespace ipc.
     * @exports ipc
     * @namespace
     */
    var ipc = {};

    ipc.EnvelopeHeaders = (function() {

        /**
         * Properties of an EnvelopeHeaders.
         * @memberof ipc
         * @interface IEnvelopeHeaders
         * @property {string|null} [msgType] EnvelopeHeaders msgType
         * @property {common.IUInt64Value|null} [fnCallNum] EnvelopeHeaders fnCallNum
         * @property {Array.<string>|null} [path] EnvelopeHeaders path
         */

        /**
         * Constructs a new EnvelopeHeaders.
         * @memberof ipc
         * @classdesc Represents an EnvelopeHeaders.
         * @implements IEnvelopeHeaders
         * @constructor
         * @param {ipc.IEnvelopeHeaders=} [properties] Properties to set
         */
        function EnvelopeHeaders(properties) {
            this.path = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * EnvelopeHeaders msgType.
         * @member {string} msgType
         * @memberof ipc.EnvelopeHeaders
         * @instance
         */
        EnvelopeHeaders.prototype.msgType = "";

        /**
         * EnvelopeHeaders fnCallNum.
         * @member {common.IUInt64Value|null|undefined} fnCallNum
         * @memberof ipc.EnvelopeHeaders
         * @instance
         */
        EnvelopeHeaders.prototype.fnCallNum = null;

        /**
         * EnvelopeHeaders path.
         * @member {Array.<string>} path
         * @memberof ipc.EnvelopeHeaders
         * @instance
         */
        EnvelopeHeaders.prototype.path = $util.emptyArray;

        /**
         * Creates a new EnvelopeHeaders instance using the specified properties.
         * @function create
         * @memberof ipc.EnvelopeHeaders
         * @static
         * @param {ipc.IEnvelopeHeaders=} [properties] Properties to set
         * @returns {ipc.EnvelopeHeaders} EnvelopeHeaders instance
         */
        EnvelopeHeaders.create = function create(properties) {
            return new EnvelopeHeaders(properties);
        };

        /**
         * Encodes the specified EnvelopeHeaders message. Does not implicitly {@link ipc.EnvelopeHeaders.verify|verify} messages.
         * @function encode
         * @memberof ipc.EnvelopeHeaders
         * @static
         * @param {ipc.IEnvelopeHeaders} message EnvelopeHeaders message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        EnvelopeHeaders.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.msgType != null && Object.hasOwnProperty.call(message, "msgType"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.msgType);
            if (message.fnCallNum != null && Object.hasOwnProperty.call(message, "fnCallNum"))
                $root.common.UInt64Value.encode(message.fnCallNum, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.path != null && message.path.length)
                for (var i = 0; i < message.path.length; ++i)
                    writer.uint32(/* id 3, wireType 2 =*/26).string(message.path[i]);
            return writer;
        };

        /**
         * Encodes the specified EnvelopeHeaders message, length delimited. Does not implicitly {@link ipc.EnvelopeHeaders.verify|verify} messages.
         * @function encodeDelimited
         * @memberof ipc.EnvelopeHeaders
         * @static
         * @param {ipc.IEnvelopeHeaders} message EnvelopeHeaders message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        EnvelopeHeaders.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an EnvelopeHeaders message from the specified reader or buffer.
         * @function decode
         * @memberof ipc.EnvelopeHeaders
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {ipc.EnvelopeHeaders} EnvelopeHeaders
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        EnvelopeHeaders.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.ipc.EnvelopeHeaders();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.msgType = reader.string();
                        break;
                    }
                case 2: {
                        message.fnCallNum = $root.common.UInt64Value.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        if (!(message.path && message.path.length))
                            message.path = [];
                        message.path.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an EnvelopeHeaders message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof ipc.EnvelopeHeaders
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {ipc.EnvelopeHeaders} EnvelopeHeaders
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        EnvelopeHeaders.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an EnvelopeHeaders message.
         * @function verify
         * @memberof ipc.EnvelopeHeaders
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        EnvelopeHeaders.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.msgType != null && Object.hasOwnProperty.call(message, "msgType"))
                if (!$util.isString(message.msgType))
                    return "msgType: string expected";
            if (message.fnCallNum != null && Object.hasOwnProperty.call(message, "fnCallNum")) {
                var error = $root.common.UInt64Value.verify(message.fnCallNum, long + 1);
                if (error)
                    return "fnCallNum." + error;
            }
            if (message.path != null && Object.hasOwnProperty.call(message, "path")) {
                if (!Array.isArray(message.path))
                    return "path: array expected";
                for (var i = 0; i < message.path.length; ++i)
                    if (!$util.isString(message.path[i]))
                        return "path: string[] expected";
            }
            return null;
        };

        /**
         * Creates an EnvelopeHeaders message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof ipc.EnvelopeHeaders
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {ipc.EnvelopeHeaders} EnvelopeHeaders
         */
        EnvelopeHeaders.fromObject = function fromObject(object, long) {
            if (object instanceof $root.ipc.EnvelopeHeaders)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".ipc.EnvelopeHeaders: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.ipc.EnvelopeHeaders();
            if (object.msgType != null)
                message.msgType = String(object.msgType);
            if (object.fnCallNum != null) {
                if (!$util.isObject(object.fnCallNum))
                    throw TypeError(".ipc.EnvelopeHeaders.fnCallNum: object expected");
                message.fnCallNum = $root.common.UInt64Value.fromObject(object.fnCallNum, long + 1);
            }
            if (object.path) {
                if (!Array.isArray(object.path))
                    throw TypeError(".ipc.EnvelopeHeaders.path: array expected");
                message.path = [];
                for (var i = 0; i < object.path.length; ++i)
                    message.path[i] = String(object.path[i]);
            }
            return message;
        };

        /**
         * Creates a plain object from an EnvelopeHeaders message. Also converts values to other types if specified.
         * @function toObject
         * @memberof ipc.EnvelopeHeaders
         * @static
         * @param {ipc.EnvelopeHeaders} message EnvelopeHeaders
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        EnvelopeHeaders.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.path = [];
            if (options.defaults) {
                object.msgType = "";
                object.fnCallNum = null;
            }
            if (message.msgType != null && Object.hasOwnProperty.call(message, "msgType"))
                object.msgType = message.msgType;
            if (message.fnCallNum != null && Object.hasOwnProperty.call(message, "fnCallNum"))
                object.fnCallNum = $root.common.UInt64Value.toObject(message.fnCallNum, options, q + 1);
            if (message.path && message.path.length) {
                object.path = [];
                for (var j = 0; j < message.path.length; ++j)
                    object.path[j] = message.path[j];
            }
            return object;
        };

        /**
         * Converts this EnvelopeHeaders to JSON.
         * @function toJSON
         * @memberof ipc.EnvelopeHeaders
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        EnvelopeHeaders.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for EnvelopeHeaders
         * @function getTypeUrl
         * @memberof ipc.EnvelopeHeaders
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        EnvelopeHeaders.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/ipc.EnvelopeHeaders";
        };

        return EnvelopeHeaders;
    })();

    ipc.Envelope = (function() {

        /**
         * Properties of an Envelope.
         * @memberof ipc
         * @interface IEnvelope
         * @property {ipc.IEnvelopeHeaders|null} [headers] Envelope headers
         * @property {common.IBytesValue|null} [body] Envelope body
         */

        /**
         * Constructs a new Envelope.
         * @memberof ipc
         * @classdesc Represents an Envelope.
         * @implements IEnvelope
         * @constructor
         * @param {ipc.IEnvelope=} [properties] Properties to set
         */
        function Envelope(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * Envelope headers.
         * @member {ipc.IEnvelopeHeaders|null|undefined} headers
         * @memberof ipc.Envelope
         * @instance
         */
        Envelope.prototype.headers = null;

        /**
         * Envelope body.
         * @member {common.IBytesValue|null|undefined} body
         * @memberof ipc.Envelope
         * @instance
         */
        Envelope.prototype.body = null;

        /**
         * Creates a new Envelope instance using the specified properties.
         * @function create
         * @memberof ipc.Envelope
         * @static
         * @param {ipc.IEnvelope=} [properties] Properties to set
         * @returns {ipc.Envelope} Envelope instance
         */
        Envelope.create = function create(properties) {
            return new Envelope(properties);
        };

        /**
         * Encodes the specified Envelope message. Does not implicitly {@link ipc.Envelope.verify|verify} messages.
         * @function encode
         * @memberof ipc.Envelope
         * @static
         * @param {ipc.IEnvelope} message Envelope message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        Envelope.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.headers != null && Object.hasOwnProperty.call(message, "headers"))
                $root.ipc.EnvelopeHeaders.encode(message.headers, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            if (message.body != null && Object.hasOwnProperty.call(message, "body"))
                $root.common.BytesValue.encode(message.body, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified Envelope message, length delimited. Does not implicitly {@link ipc.Envelope.verify|verify} messages.
         * @function encodeDelimited
         * @memberof ipc.Envelope
         * @static
         * @param {ipc.IEnvelope} message Envelope message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        Envelope.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an Envelope message from the specified reader or buffer.
         * @function decode
         * @memberof ipc.Envelope
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {ipc.Envelope} Envelope
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        Envelope.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.ipc.Envelope();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.headers = $root.ipc.EnvelopeHeaders.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 2: {
                        message.body = $root.common.BytesValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an Envelope message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof ipc.Envelope
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {ipc.Envelope} Envelope
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        Envelope.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an Envelope message.
         * @function verify
         * @memberof ipc.Envelope
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        Envelope.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.headers != null && Object.hasOwnProperty.call(message, "headers")) {
                var error = $root.ipc.EnvelopeHeaders.verify(message.headers, long + 1);
                if (error)
                    return "headers." + error;
            }
            if (message.body != null && Object.hasOwnProperty.call(message, "body")) {
                var error = $root.common.BytesValue.verify(message.body, long + 1);
                if (error)
                    return "body." + error;
            }
            return null;
        };

        /**
         * Creates an Envelope message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof ipc.Envelope
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {ipc.Envelope} Envelope
         */
        Envelope.fromObject = function fromObject(object, long) {
            if (object instanceof $root.ipc.Envelope)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".ipc.Envelope: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.ipc.Envelope();
            if (object.headers != null) {
                if (!$util.isObject(object.headers))
                    throw TypeError(".ipc.Envelope.headers: object expected");
                message.headers = $root.ipc.EnvelopeHeaders.fromObject(object.headers, long + 1);
            }
            if (object.body != null) {
                if (!$util.isObject(object.body))
                    throw TypeError(".ipc.Envelope.body: object expected");
                message.body = $root.common.BytesValue.fromObject(object.body, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an Envelope message. Also converts values to other types if specified.
         * @function toObject
         * @memberof ipc.Envelope
         * @static
         * @param {ipc.Envelope} message Envelope
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        Envelope.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.headers = null;
                object.body = null;
            }
            if (message.headers != null && Object.hasOwnProperty.call(message, "headers"))
                object.headers = $root.ipc.EnvelopeHeaders.toObject(message.headers, options, q + 1);
            if (message.body != null && Object.hasOwnProperty.call(message, "body"))
                object.body = $root.common.BytesValue.toObject(message.body, options, q + 1);
            return object;
        };

        /**
         * Converts this Envelope to JSON.
         * @function toJSON
         * @memberof ipc.Envelope
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        Envelope.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for Envelope
         * @function getTypeUrl
         * @memberof ipc.Envelope
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        Envelope.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/ipc.Envelope";
        };

        return Envelope;
    })();

    return ipc;
})();

$root.common = (function() {

    /**
     * Namespace common.
     * @exports common
     * @namespace
     */
    var common = {};

    common.ObjectReference = (function() {

        /**
         * Properties of an ObjectReference.
         * @memberof common
         * @interface IObjectReference
         * @property {string|null} [objType] ObjectReference objType
         * @property {Array.<string>|null} [path] ObjectReference path
         */

        /**
         * Constructs a new ObjectReference.
         * @memberof common
         * @classdesc Represents an ObjectReference.
         * @implements IObjectReference
         * @constructor
         * @param {common.IObjectReference=} [properties] Properties to set
         */
        function ObjectReference(properties) {
            this.path = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ObjectReference objType.
         * @member {string} objType
         * @memberof common.ObjectReference
         * @instance
         */
        ObjectReference.prototype.objType = "";

        /**
         * ObjectReference path.
         * @member {Array.<string>} path
         * @memberof common.ObjectReference
         * @instance
         */
        ObjectReference.prototype.path = $util.emptyArray;

        /**
         * Creates a new ObjectReference instance using the specified properties.
         * @function create
         * @memberof common.ObjectReference
         * @static
         * @param {common.IObjectReference=} [properties] Properties to set
         * @returns {common.ObjectReference} ObjectReference instance
         */
        ObjectReference.create = function create(properties) {
            return new ObjectReference(properties);
        };

        /**
         * Encodes the specified ObjectReference message. Does not implicitly {@link common.ObjectReference.verify|verify} messages.
         * @function encode
         * @memberof common.ObjectReference
         * @static
         * @param {common.IObjectReference} message ObjectReference message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ObjectReference.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.objType != null && Object.hasOwnProperty.call(message, "objType"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.objType);
            if (message.path != null && message.path.length)
                for (var i = 0; i < message.path.length; ++i)
                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.path[i]);
            return writer;
        };

        /**
         * Encodes the specified ObjectReference message, length delimited. Does not implicitly {@link common.ObjectReference.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.ObjectReference
         * @static
         * @param {common.IObjectReference} message ObjectReference message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ObjectReference.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an ObjectReference message from the specified reader or buffer.
         * @function decode
         * @memberof common.ObjectReference
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.ObjectReference} ObjectReference
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ObjectReference.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ObjectReference();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.objType = reader.string();
                        break;
                    }
                case 2: {
                        if (!(message.path && message.path.length))
                            message.path = [];
                        message.path.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an ObjectReference message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.ObjectReference
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.ObjectReference} ObjectReference
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ObjectReference.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an ObjectReference message.
         * @function verify
         * @memberof common.ObjectReference
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ObjectReference.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.objType != null && Object.hasOwnProperty.call(message, "objType"))
                if (!$util.isString(message.objType))
                    return "objType: string expected";
            if (message.path != null && Object.hasOwnProperty.call(message, "path")) {
                if (!Array.isArray(message.path))
                    return "path: array expected";
                for (var i = 0; i < message.path.length; ++i)
                    if (!$util.isString(message.path[i]))
                        return "path: string[] expected";
            }
            return null;
        };

        /**
         * Creates an ObjectReference message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.ObjectReference
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.ObjectReference} ObjectReference
         */
        ObjectReference.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.ObjectReference)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.ObjectReference: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.ObjectReference();
            if (object.objType != null)
                message.objType = String(object.objType);
            if (object.path) {
                if (!Array.isArray(object.path))
                    throw TypeError(".common.ObjectReference.path: array expected");
                message.path = [];
                for (var i = 0; i < object.path.length; ++i)
                    message.path[i] = String(object.path[i]);
            }
            return message;
        };

        /**
         * Creates a plain object from an ObjectReference message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.ObjectReference
         * @static
         * @param {common.ObjectReference} message ObjectReference
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ObjectReference.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.path = [];
            if (options.defaults)
                object.objType = "";
            if (message.objType != null && Object.hasOwnProperty.call(message, "objType"))
                object.objType = message.objType;
            if (message.path && message.path.length) {
                object.path = [];
                for (var j = 0; j < message.path.length; ++j)
                    object.path[j] = message.path[j];
            }
            return object;
        };

        /**
         * Converts this ObjectReference to JSON.
         * @function toJSON
         * @memberof common.ObjectReference
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ObjectReference.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ObjectReference
         * @function getTypeUrl
         * @memberof common.ObjectReference
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ObjectReference.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.ObjectReference";
        };

        return ObjectReference;
    })();

    common.BooleanValue = (function() {

        /**
         * Properties of a BooleanValue.
         * @memberof common
         * @interface IBooleanValue
         * @property {boolean|null} [value] BooleanValue value
         */

        /**
         * Constructs a new BooleanValue.
         * @memberof common
         * @classdesc Represents a BooleanValue.
         * @implements IBooleanValue
         * @constructor
         * @param {common.IBooleanValue=} [properties] Properties to set
         */
        function BooleanValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * BooleanValue value.
         * @member {boolean} value
         * @memberof common.BooleanValue
         * @instance
         */
        BooleanValue.prototype.value = false;

        /**
         * Creates a new BooleanValue instance using the specified properties.
         * @function create
         * @memberof common.BooleanValue
         * @static
         * @param {common.IBooleanValue=} [properties] Properties to set
         * @returns {common.BooleanValue} BooleanValue instance
         */
        BooleanValue.create = function create(properties) {
            return new BooleanValue(properties);
        };

        /**
         * Encodes the specified BooleanValue message. Does not implicitly {@link common.BooleanValue.verify|verify} messages.
         * @function encode
         * @memberof common.BooleanValue
         * @static
         * @param {common.IBooleanValue} message BooleanValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BooleanValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 0 =*/8).bool(message.value);
            return writer;
        };

        /**
         * Encodes the specified BooleanValue message, length delimited. Does not implicitly {@link common.BooleanValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.BooleanValue
         * @static
         * @param {common.IBooleanValue} message BooleanValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BooleanValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a BooleanValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.BooleanValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.BooleanValue} BooleanValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BooleanValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BooleanValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.bool();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a BooleanValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.BooleanValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.BooleanValue} BooleanValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BooleanValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a BooleanValue message.
         * @function verify
         * @memberof common.BooleanValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        BooleanValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (typeof message.value !== "boolean")
                    return "value: boolean expected";
            return null;
        };

        /**
         * Creates a BooleanValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.BooleanValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.BooleanValue} BooleanValue
         */
        BooleanValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.BooleanValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.BooleanValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.BooleanValue();
            if (object.value != null)
                message.value = Boolean(object.value);
            return message;
        };

        /**
         * Creates a plain object from a BooleanValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.BooleanValue
         * @static
         * @param {common.BooleanValue} message BooleanValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        BooleanValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.value = false;
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = message.value;
            return object;
        };

        /**
         * Converts this BooleanValue to JSON.
         * @function toJSON
         * @memberof common.BooleanValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        BooleanValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for BooleanValue
         * @function getTypeUrl
         * @memberof common.BooleanValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        BooleanValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.BooleanValue";
        };

        return BooleanValue;
    })();

    common.StringArrayValue = (function() {

        /**
         * Properties of a StringArrayValue.
         * @memberof common
         * @interface IStringArrayValue
         * @property {Array.<string>|null} [values] StringArrayValue values
         */

        /**
         * Constructs a new StringArrayValue.
         * @memberof common
         * @classdesc Represents a StringArrayValue.
         * @implements IStringArrayValue
         * @constructor
         * @param {common.IStringArrayValue=} [properties] Properties to set
         */
        function StringArrayValue(properties) {
            this.values = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * StringArrayValue values.
         * @member {Array.<string>} values
         * @memberof common.StringArrayValue
         * @instance
         */
        StringArrayValue.prototype.values = $util.emptyArray;

        /**
         * Creates a new StringArrayValue instance using the specified properties.
         * @function create
         * @memberof common.StringArrayValue
         * @static
         * @param {common.IStringArrayValue=} [properties] Properties to set
         * @returns {common.StringArrayValue} StringArrayValue instance
         */
        StringArrayValue.create = function create(properties) {
            return new StringArrayValue(properties);
        };

        /**
         * Encodes the specified StringArrayValue message. Does not implicitly {@link common.StringArrayValue.verify|verify} messages.
         * @function encode
         * @memberof common.StringArrayValue
         * @static
         * @param {common.IStringArrayValue} message StringArrayValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringArrayValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.values != null && message.values.length)
                for (var i = 0; i < message.values.length; ++i)
                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.values[i]);
            return writer;
        };

        /**
         * Encodes the specified StringArrayValue message, length delimited. Does not implicitly {@link common.StringArrayValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.StringArrayValue
         * @static
         * @param {common.IStringArrayValue} message StringArrayValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringArrayValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a StringArrayValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.StringArrayValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.StringArrayValue} StringArrayValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringArrayValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringArrayValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.values && message.values.length))
                            message.values = [];
                        message.values.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a StringArrayValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.StringArrayValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.StringArrayValue} StringArrayValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringArrayValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a StringArrayValue message.
         * @function verify
         * @memberof common.StringArrayValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        StringArrayValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.values != null && Object.hasOwnProperty.call(message, "values")) {
                if (!Array.isArray(message.values))
                    return "values: array expected";
                for (var i = 0; i < message.values.length; ++i)
                    if (!$util.isString(message.values[i]))
                        return "values: string[] expected";
            }
            return null;
        };

        /**
         * Creates a StringArrayValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.StringArrayValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.StringArrayValue} StringArrayValue
         */
        StringArrayValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.StringArrayValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.StringArrayValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.StringArrayValue();
            if (object.values) {
                if (!Array.isArray(object.values))
                    throw TypeError(".common.StringArrayValue.values: array expected");
                message.values = [];
                for (var i = 0; i < object.values.length; ++i)
                    message.values[i] = String(object.values[i]);
            }
            return message;
        };

        /**
         * Creates a plain object from a StringArrayValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.StringArrayValue
         * @static
         * @param {common.StringArrayValue} message StringArrayValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        StringArrayValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.values = [];
            if (message.values && message.values.length) {
                object.values = [];
                for (var j = 0; j < message.values.length; ++j)
                    object.values[j] = message.values[j];
            }
            return object;
        };

        /**
         * Converts this StringArrayValue to JSON.
         * @function toJSON
         * @memberof common.StringArrayValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        StringArrayValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for StringArrayValue
         * @function getTypeUrl
         * @memberof common.StringArrayValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        StringArrayValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.StringArrayValue";
        };

        return StringArrayValue;
    })();

    common.UInt64Value = (function() {

        /**
         * Properties of a UInt64Value.
         * @memberof common
         * @interface IUInt64Value
         * @property {number|Long|null} [value] UInt64Value value
         */

        /**
         * Constructs a new UInt64Value.
         * @memberof common
         * @classdesc Represents a UInt64Value.
         * @implements IUInt64Value
         * @constructor
         * @param {common.IUInt64Value=} [properties] Properties to set
         */
        function UInt64Value(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * UInt64Value value.
         * @member {number|Long} value
         * @memberof common.UInt64Value
         * @instance
         */
        UInt64Value.prototype.value = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new UInt64Value instance using the specified properties.
         * @function create
         * @memberof common.UInt64Value
         * @static
         * @param {common.IUInt64Value=} [properties] Properties to set
         * @returns {common.UInt64Value} UInt64Value instance
         */
        UInt64Value.create = function create(properties) {
            return new UInt64Value(properties);
        };

        /**
         * Encodes the specified UInt64Value message. Does not implicitly {@link common.UInt64Value.verify|verify} messages.
         * @function encode
         * @memberof common.UInt64Value
         * @static
         * @param {common.IUInt64Value} message UInt64Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt64Value.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.value);
            return writer;
        };

        /**
         * Encodes the specified UInt64Value message, length delimited. Does not implicitly {@link common.UInt64Value.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.UInt64Value
         * @static
         * @param {common.IUInt64Value} message UInt64Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt64Value.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a UInt64Value message from the specified reader or buffer.
         * @function decode
         * @memberof common.UInt64Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.UInt64Value} UInt64Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt64Value.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt64Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a UInt64Value message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.UInt64Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.UInt64Value} UInt64Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt64Value.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a UInt64Value message.
         * @function verify
         * @memberof common.UInt64Value
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        UInt64Value.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!$util.isInteger(message.value) && !(message.value && $util.isInteger(message.value.low) && $util.isInteger(message.value.high)))
                    return "value: integer|Long expected";
            return null;
        };

        /**
         * Creates a UInt64Value message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.UInt64Value
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.UInt64Value} UInt64Value
         */
        UInt64Value.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.UInt64Value)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.UInt64Value: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.UInt64Value();
            if (object.value != null)
                if ($util.Long)
                    message.value = $util.Long.fromValue(object.value, true);
                else if (typeof object.value === "string")
                    message.value = parseInt(object.value, 10);
                else if (typeof object.value === "number")
                    message.value = object.value;
                else if (typeof object.value === "object")
                    message.value = new $util.LongBits(object.value.low >>> 0, object.value.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from a UInt64Value message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.UInt64Value
         * @static
         * @param {common.UInt64Value} message UInt64Value
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        UInt64Value.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.value = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.value = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.value = typeof message.value === "number" ? BigInt(message.value) : $util.Long.fromBits(message.value.low >>> 0, message.value.high >>> 0, true).toBigInt();
                else if (typeof message.value === "number")
                    object.value = options.longs === String ? String(message.value) : message.value;
                else
                    object.value = options.longs === String ? $util.Long.prototype.toString.call(message.value) : options.longs === Number ? new $util.LongBits(message.value.low >>> 0, message.value.high >>> 0).toNumber(true) : message.value;
            return object;
        };

        /**
         * Converts this UInt64Value to JSON.
         * @function toJSON
         * @memberof common.UInt64Value
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        UInt64Value.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for UInt64Value
         * @function getTypeUrl
         * @memberof common.UInt64Value
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        UInt64Value.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.UInt64Value";
        };

        return UInt64Value;
    })();

    common.UInt32Value = (function() {

        /**
         * Properties of a UInt32Value.
         * @memberof common
         * @interface IUInt32Value
         * @property {number|null} [value] UInt32Value value
         */

        /**
         * Constructs a new UInt32Value.
         * @memberof common
         * @classdesc Represents a UInt32Value.
         * @implements IUInt32Value
         * @constructor
         * @param {common.IUInt32Value=} [properties] Properties to set
         */
        function UInt32Value(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * UInt32Value value.
         * @member {number} value
         * @memberof common.UInt32Value
         * @instance
         */
        UInt32Value.prototype.value = 0;

        /**
         * Creates a new UInt32Value instance using the specified properties.
         * @function create
         * @memberof common.UInt32Value
         * @static
         * @param {common.IUInt32Value=} [properties] Properties to set
         * @returns {common.UInt32Value} UInt32Value instance
         */
        UInt32Value.create = function create(properties) {
            return new UInt32Value(properties);
        };

        /**
         * Encodes the specified UInt32Value message. Does not implicitly {@link common.UInt32Value.verify|verify} messages.
         * @function encode
         * @memberof common.UInt32Value
         * @static
         * @param {common.IUInt32Value} message UInt32Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt32Value.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.value);
            return writer;
        };

        /**
         * Encodes the specified UInt32Value message, length delimited. Does not implicitly {@link common.UInt32Value.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.UInt32Value
         * @static
         * @param {common.IUInt32Value} message UInt32Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt32Value.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a UInt32Value message from the specified reader or buffer.
         * @function decode
         * @memberof common.UInt32Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.UInt32Value} UInt32Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt32Value.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt32Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.uint32();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a UInt32Value message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.UInt32Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.UInt32Value} UInt32Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt32Value.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a UInt32Value message.
         * @function verify
         * @memberof common.UInt32Value
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        UInt32Value.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!$util.isInteger(message.value))
                    return "value: integer expected";
            return null;
        };

        /**
         * Creates a UInt32Value message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.UInt32Value
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.UInt32Value} UInt32Value
         */
        UInt32Value.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.UInt32Value)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.UInt32Value: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.UInt32Value();
            if (object.value != null)
                message.value = object.value >>> 0;
            return message;
        };

        /**
         * Creates a plain object from a UInt32Value message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.UInt32Value
         * @static
         * @param {common.UInt32Value} message UInt32Value
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        UInt32Value.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.value = 0;
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = message.value;
            return object;
        };

        /**
         * Converts this UInt32Value to JSON.
         * @function toJSON
         * @memberof common.UInt32Value
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        UInt32Value.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for UInt32Value
         * @function getTypeUrl
         * @memberof common.UInt32Value
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        UInt32Value.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.UInt32Value";
        };

        return UInt32Value;
    })();

    common.StringValue = (function() {

        /**
         * Properties of a StringValue.
         * @memberof common
         * @interface IStringValue
         * @property {string|null} [value] StringValue value
         */

        /**
         * Constructs a new StringValue.
         * @memberof common
         * @classdesc Represents a StringValue.
         * @implements IStringValue
         * @constructor
         * @param {common.IStringValue=} [properties] Properties to set
         */
        function StringValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * StringValue value.
         * @member {string} value
         * @memberof common.StringValue
         * @instance
         */
        StringValue.prototype.value = "";

        /**
         * Creates a new StringValue instance using the specified properties.
         * @function create
         * @memberof common.StringValue
         * @static
         * @param {common.IStringValue=} [properties] Properties to set
         * @returns {common.StringValue} StringValue instance
         */
        StringValue.create = function create(properties) {
            return new StringValue(properties);
        };

        /**
         * Encodes the specified StringValue message. Does not implicitly {@link common.StringValue.verify|verify} messages.
         * @function encode
         * @memberof common.StringValue
         * @static
         * @param {common.IStringValue} message StringValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.value);
            return writer;
        };

        /**
         * Encodes the specified StringValue message, length delimited. Does not implicitly {@link common.StringValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.StringValue
         * @static
         * @param {common.IStringValue} message StringValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a StringValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.StringValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.StringValue} StringValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a StringValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.StringValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.StringValue} StringValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a StringValue message.
         * @function verify
         * @memberof common.StringValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        StringValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!$util.isString(message.value))
                    return "value: string expected";
            return null;
        };

        /**
         * Creates a StringValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.StringValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.StringValue} StringValue
         */
        StringValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.StringValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.StringValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.StringValue();
            if (object.value != null)
                message.value = String(object.value);
            return message;
        };

        /**
         * Creates a plain object from a StringValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.StringValue
         * @static
         * @param {common.StringValue} message StringValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        StringValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.value = "";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = message.value;
            return object;
        };

        /**
         * Converts this StringValue to JSON.
         * @function toJSON
         * @memberof common.StringValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        StringValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for StringValue
         * @function getTypeUrl
         * @memberof common.StringValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        StringValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.StringValue";
        };

        return StringValue;
    })();

    common.BytesValue = (function() {

        /**
         * Properties of a BytesValue.
         * @memberof common
         * @interface IBytesValue
         * @property {Uint8Array|null} [value] BytesValue value
         */

        /**
         * Constructs a new BytesValue.
         * @memberof common
         * @classdesc Represents a BytesValue.
         * @implements IBytesValue
         * @constructor
         * @param {common.IBytesValue=} [properties] Properties to set
         */
        function BytesValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * BytesValue value.
         * @member {Uint8Array} value
         * @memberof common.BytesValue
         * @instance
         */
        BytesValue.prototype.value = $util.newBuffer([]);

        /**
         * Creates a new BytesValue instance using the specified properties.
         * @function create
         * @memberof common.BytesValue
         * @static
         * @param {common.IBytesValue=} [properties] Properties to set
         * @returns {common.BytesValue} BytesValue instance
         */
        BytesValue.create = function create(properties) {
            return new BytesValue(properties);
        };

        /**
         * Encodes the specified BytesValue message. Does not implicitly {@link common.BytesValue.verify|verify} messages.
         * @function encode
         * @memberof common.BytesValue
         * @static
         * @param {common.IBytesValue} message BytesValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BytesValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.value);
            return writer;
        };

        /**
         * Encodes the specified BytesValue message, length delimited. Does not implicitly {@link common.BytesValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.BytesValue
         * @static
         * @param {common.IBytesValue} message BytesValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BytesValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a BytesValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.BytesValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.BytesValue} BytesValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BytesValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BytesValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.bytes();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a BytesValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.BytesValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.BytesValue} BytesValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BytesValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a BytesValue message.
         * @function verify
         * @memberof common.BytesValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        BytesValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!(message.value && typeof message.value.length === "number" || $util.isString(message.value)))
                    return "value: buffer expected";
            return null;
        };

        /**
         * Creates a BytesValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.BytesValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.BytesValue} BytesValue
         */
        BytesValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.BytesValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.BytesValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.BytesValue();
            if (object.value != null)
                if (typeof object.value === "string")
                    $util.base64.decode(object.value, message.value = $util.newBuffer($util.base64.length(object.value)), 0);
                else if (object.value.length >= 0)
                    message.value = object.value;
            return message;
        };

        /**
         * Creates a plain object from a BytesValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.BytesValue
         * @static
         * @param {common.BytesValue} message BytesValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        BytesValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if (options.bytes === String)
                    object.value = "";
                else {
                    object.value = [];
                    if (options.bytes !== Array)
                        object.value = $util.newBuffer(object.value);
                }
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = options.bytes === String ? $util.base64.encode(message.value, 0, message.value.length) : options.bytes === Array ? Array.prototype.slice.call(message.value) : message.value;
            return object;
        };

        /**
         * Converts this BytesValue to JSON.
         * @function toJSON
         * @memberof common.BytesValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        BytesValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for BytesValue
         * @function getTypeUrl
         * @memberof common.BytesValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        BytesValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.BytesValue";
        };

        return BytesValue;
    })();

    common.ErrorValue = (function() {

        /**
         * Properties of an ErrorValue.
         * @memberof common
         * @interface IErrorValue
         * @property {string|null} [runtimeExcJson] ErrorValue runtimeExcJson
         * @property {string|null} [err] ErrorValue err
         */

        /**
         * Constructs a new ErrorValue.
         * @memberof common
         * @classdesc Represents an ErrorValue.
         * @implements IErrorValue
         * @constructor
         * @param {common.IErrorValue=} [properties] Properties to set
         */
        function ErrorValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ErrorValue runtimeExcJson.
         * @member {string} runtimeExcJson
         * @memberof common.ErrorValue
         * @instance
         */
        ErrorValue.prototype.runtimeExcJson = "";

        /**
         * ErrorValue err.
         * @member {string} err
         * @memberof common.ErrorValue
         * @instance
         */
        ErrorValue.prototype.err = "";

        /**
         * Creates a new ErrorValue instance using the specified properties.
         * @function create
         * @memberof common.ErrorValue
         * @static
         * @param {common.IErrorValue=} [properties] Properties to set
         * @returns {common.ErrorValue} ErrorValue instance
         */
        ErrorValue.create = function create(properties) {
            return new ErrorValue(properties);
        };

        /**
         * Encodes the specified ErrorValue message. Does not implicitly {@link common.ErrorValue.verify|verify} messages.
         * @function encode
         * @memberof common.ErrorValue
         * @static
         * @param {common.IErrorValue} message ErrorValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ErrorValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.runtimeExcJson != null && Object.hasOwnProperty.call(message, "runtimeExcJson"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.runtimeExcJson);
            if (message.err != null && Object.hasOwnProperty.call(message, "err"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.err);
            return writer;
        };

        /**
         * Encodes the specified ErrorValue message, length delimited. Does not implicitly {@link common.ErrorValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.ErrorValue
         * @static
         * @param {common.IErrorValue} message ErrorValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ErrorValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an ErrorValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.ErrorValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.ErrorValue} ErrorValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ErrorValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ErrorValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.runtimeExcJson = reader.string();
                        break;
                    }
                case 2: {
                        message.err = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an ErrorValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.ErrorValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.ErrorValue} ErrorValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ErrorValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an ErrorValue message.
         * @function verify
         * @memberof common.ErrorValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ErrorValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.runtimeExcJson != null && Object.hasOwnProperty.call(message, "runtimeExcJson"))
                if (!$util.isString(message.runtimeExcJson))
                    return "runtimeExcJson: string expected";
            if (message.err != null && Object.hasOwnProperty.call(message, "err"))
                if (!$util.isString(message.err))
                    return "err: string expected";
            return null;
        };

        /**
         * Creates an ErrorValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.ErrorValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.ErrorValue} ErrorValue
         */
        ErrorValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.ErrorValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.ErrorValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.ErrorValue();
            if (object.runtimeExcJson != null)
                message.runtimeExcJson = String(object.runtimeExcJson);
            if (object.err != null)
                message.err = String(object.err);
            return message;
        };

        /**
         * Creates a plain object from an ErrorValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.ErrorValue
         * @static
         * @param {common.ErrorValue} message ErrorValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ErrorValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.runtimeExcJson = "";
                object.err = "";
            }
            if (message.runtimeExcJson != null && Object.hasOwnProperty.call(message, "runtimeExcJson"))
                object.runtimeExcJson = message.runtimeExcJson;
            if (message.err != null && Object.hasOwnProperty.call(message, "err"))
                object.err = message.err;
            return object;
        };

        /**
         * Converts this ErrorValue to JSON.
         * @function toJSON
         * @memberof common.ErrorValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ErrorValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ErrorValue
         * @function getTypeUrl
         * @memberof common.ErrorValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ErrorValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.ErrorValue";
        };

        return ErrorValue;
    })();

    common.AnyValue = (function() {

        /**
         * Properties of an AnyValue.
         * @memberof common
         * @interface IAnyValue
         * @property {string|null} [type] AnyValue type
         * @property {common.IStringValue|null} [json] AnyValue json
         * @property {common.IBytesValue|null} [bytes] AnyValue bytes
         */

        /**
         * Constructs a new AnyValue.
         * @memberof common
         * @classdesc Represents an AnyValue.
         * @implements IAnyValue
         * @constructor
         * @param {common.IAnyValue=} [properties] Properties to set
         */
        function AnyValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * AnyValue type.
         * @member {string} type
         * @memberof common.AnyValue
         * @instance
         */
        AnyValue.prototype.type = "";

        /**
         * AnyValue json.
         * @member {common.IStringValue|null|undefined} json
         * @memberof common.AnyValue
         * @instance
         */
        AnyValue.prototype.json = null;

        /**
         * AnyValue bytes.
         * @member {common.IBytesValue|null|undefined} bytes
         * @memberof common.AnyValue
         * @instance
         */
        AnyValue.prototype.bytes = null;

        /**
         * Creates a new AnyValue instance using the specified properties.
         * @function create
         * @memberof common.AnyValue
         * @static
         * @param {common.IAnyValue=} [properties] Properties to set
         * @returns {common.AnyValue} AnyValue instance
         */
        AnyValue.create = function create(properties) {
            return new AnyValue(properties);
        };

        /**
         * Encodes the specified AnyValue message. Does not implicitly {@link common.AnyValue.verify|verify} messages.
         * @function encode
         * @memberof common.AnyValue
         * @static
         * @param {common.IAnyValue} message AnyValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AnyValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.type);
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified AnyValue message, length delimited. Does not implicitly {@link common.AnyValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.AnyValue
         * @static
         * @param {common.IAnyValue} message AnyValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AnyValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an AnyValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.AnyValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.AnyValue} AnyValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AnyValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.AnyValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.type = reader.string();
                        break;
                    }
                case 2: {
                        message.json = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an AnyValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.AnyValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.AnyValue} AnyValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AnyValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an AnyValue message.
         * @function verify
         * @memberof common.AnyValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        AnyValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.json != null && Object.hasOwnProperty.call(message, "json")) {
                var error = $root.common.StringValue.verify(message.json, long + 1);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes, long + 1);
                if (error)
                    return "bytes." + error;
            }
            return null;
        };

        /**
         * Creates an AnyValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.AnyValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.AnyValue} AnyValue
         */
        AnyValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.AnyValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.AnyValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.AnyValue();
            if (object.type != null)
                message.type = String(object.type);
            if (object.json != null) {
                if (!$util.isObject(object.json))
                    throw TypeError(".common.AnyValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json, long + 1);
            }
            if (object.bytes != null) {
                if (!$util.isObject(object.bytes))
                    throw TypeError(".common.AnyValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an AnyValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.AnyValue
         * @static
         * @param {common.AnyValue} message AnyValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        AnyValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.json = null;
                object.bytes = null;
            }
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                object.type = message.type;
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = $root.common.StringValue.toObject(message.json, options, q + 1);
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options, q + 1);
            return object;
        };

        /**
         * Converts this AnyValue to JSON.
         * @function toJSON
         * @memberof common.AnyValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        AnyValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for AnyValue
         * @function getTypeUrl
         * @memberof common.AnyValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        AnyValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.AnyValue";
        };

        return AnyValue;
    })();

    return common;
})();

module.exports = $root;

},{"protobufjs/minimal":84}],77:[function(require,module,exports){
/*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.json_ipc = (function() {

    /**
     * Namespace json_ipc.
     * @exports json_ipc
     * @namespace
     */
    var json_ipc = {};

    json_ipc.ValuesSequence = (function() {

        /**
         * Properties of a ValuesSequence.
         * @memberof json_ipc
         * @interface IValuesSequence
         * @property {Array.<json_ipc.ValuesSequence.IValue>|null} [values] ValuesSequence values
         */

        /**
         * Constructs a new ValuesSequence.
         * @memberof json_ipc
         * @classdesc Represents a ValuesSequence.
         * @implements IValuesSequence
         * @constructor
         * @param {json_ipc.IValuesSequence=} [properties] Properties to set
         */
        function ValuesSequence(properties) {
            this.values = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ValuesSequence values.
         * @member {Array.<json_ipc.ValuesSequence.IValue>} values
         * @memberof json_ipc.ValuesSequence
         * @instance
         */
        ValuesSequence.prototype.values = $util.emptyArray;

        /**
         * Creates a new ValuesSequence instance using the specified properties.
         * @function create
         * @memberof json_ipc.ValuesSequence
         * @static
         * @param {json_ipc.IValuesSequence=} [properties] Properties to set
         * @returns {json_ipc.ValuesSequence} ValuesSequence instance
         */
        ValuesSequence.create = function create(properties) {
            return new ValuesSequence(properties);
        };

        /**
         * Encodes the specified ValuesSequence message. Does not implicitly {@link json_ipc.ValuesSequence.verify|verify} messages.
         * @function encode
         * @memberof json_ipc.ValuesSequence
         * @static
         * @param {json_ipc.IValuesSequence} message ValuesSequence message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ValuesSequence.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.values != null && message.values.length)
                for (var i = 0; i < message.values.length; ++i)
                    $root.json_ipc.ValuesSequence.Value.encode(message.values[i], writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified ValuesSequence message, length delimited. Does not implicitly {@link json_ipc.ValuesSequence.verify|verify} messages.
         * @function encodeDelimited
         * @memberof json_ipc.ValuesSequence
         * @static
         * @param {json_ipc.IValuesSequence} message ValuesSequence message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ValuesSequence.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a ValuesSequence message from the specified reader or buffer.
         * @function decode
         * @memberof json_ipc.ValuesSequence
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {json_ipc.ValuesSequence} ValuesSequence
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ValuesSequence.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.json_ipc.ValuesSequence();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.values && message.values.length))
                            message.values = [];
                        message.values.push($root.json_ipc.ValuesSequence.Value.decode(reader, reader.uint32(), undefined, long + 1));
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a ValuesSequence message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof json_ipc.ValuesSequence
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {json_ipc.ValuesSequence} ValuesSequence
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ValuesSequence.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a ValuesSequence message.
         * @function verify
         * @memberof json_ipc.ValuesSequence
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ValuesSequence.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.values != null && Object.hasOwnProperty.call(message, "values")) {
                if (!Array.isArray(message.values))
                    return "values: array expected";
                for (var i = 0; i < message.values.length; ++i) {
                    var error = $root.json_ipc.ValuesSequence.Value.verify(message.values[i], long + 1);
                    if (error)
                        return "values." + error;
                }
            }
            return null;
        };

        /**
         * Creates a ValuesSequence message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof json_ipc.ValuesSequence
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {json_ipc.ValuesSequence} ValuesSequence
         */
        ValuesSequence.fromObject = function fromObject(object, long) {
            if (object instanceof $root.json_ipc.ValuesSequence)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".json_ipc.ValuesSequence: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.json_ipc.ValuesSequence();
            if (object.values) {
                if (!Array.isArray(object.values))
                    throw TypeError(".json_ipc.ValuesSequence.values: array expected");
                message.values = [];
                for (var i = 0; i < object.values.length; ++i) {
                    if (!$util.isObject(object.values[i]))
                        throw TypeError(".json_ipc.ValuesSequence.values: object expected");
                    message.values[i] = $root.json_ipc.ValuesSequence.Value.fromObject(object.values[i], long + 1);
                }
            }
            return message;
        };

        /**
         * Creates a plain object from a ValuesSequence message. Also converts values to other types if specified.
         * @function toObject
         * @memberof json_ipc.ValuesSequence
         * @static
         * @param {json_ipc.ValuesSequence} message ValuesSequence
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ValuesSequence.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.values = [];
            if (message.values && message.values.length) {
                object.values = [];
                for (var j = 0; j < message.values.length; ++j)
                    object.values[j] = $root.json_ipc.ValuesSequence.Value.toObject(message.values[j], options, q + 1);
            }
            return object;
        };

        /**
         * Converts this ValuesSequence to JSON.
         * @function toJSON
         * @memberof json_ipc.ValuesSequence
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ValuesSequence.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ValuesSequence
         * @function getTypeUrl
         * @memberof json_ipc.ValuesSequence
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ValuesSequence.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/json_ipc.ValuesSequence";
        };

        ValuesSequence.BinaryValue = (function() {

            /**
             * Properties of a BinaryValue.
             * @memberof json_ipc.ValuesSequence
             * @interface IBinaryValue
             * @property {Uint8Array|null} [arr] BinaryValue arr
             * @property {Array.<string>|null} [objLocation] BinaryValue objLocation
             */

            /**
             * Constructs a new BinaryValue.
             * @memberof json_ipc.ValuesSequence
             * @classdesc Represents a BinaryValue.
             * @implements IBinaryValue
             * @constructor
             * @param {json_ipc.ValuesSequence.IBinaryValue=} [properties] Properties to set
             */
            function BinaryValue(properties) {
                this.objLocation = [];
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * BinaryValue arr.
             * @member {Uint8Array} arr
             * @memberof json_ipc.ValuesSequence.BinaryValue
             * @instance
             */
            BinaryValue.prototype.arr = $util.newBuffer([]);

            /**
             * BinaryValue objLocation.
             * @member {Array.<string>} objLocation
             * @memberof json_ipc.ValuesSequence.BinaryValue
             * @instance
             */
            BinaryValue.prototype.objLocation = $util.emptyArray;

            /**
             * Creates a new BinaryValue instance using the specified properties.
             * @function create
             * @memberof json_ipc.ValuesSequence.BinaryValue
             * @static
             * @param {json_ipc.ValuesSequence.IBinaryValue=} [properties] Properties to set
             * @returns {json_ipc.ValuesSequence.BinaryValue} BinaryValue instance
             */
            BinaryValue.create = function create(properties) {
                return new BinaryValue(properties);
            };

            /**
             * Encodes the specified BinaryValue message. Does not implicitly {@link json_ipc.ValuesSequence.BinaryValue.verify|verify} messages.
             * @function encode
             * @memberof json_ipc.ValuesSequence.BinaryValue
             * @static
             * @param {json_ipc.ValuesSequence.IBinaryValue} message BinaryValue message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            BinaryValue.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.arr != null && Object.hasOwnProperty.call(message, "arr"))
                    writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.arr);
                if (message.objLocation != null && message.objLocation.length)
                    for (var i = 0; i < message.objLocation.length; ++i)
                        writer.uint32(/* id 2, wireType 2 =*/18).string(message.objLocation[i]);
                return writer;
            };

            /**
             * Encodes the specified BinaryValue message, length delimited. Does not implicitly {@link json_ipc.ValuesSequence.BinaryValue.verify|verify} messages.
             * @function encodeDelimited
             * @memberof json_ipc.ValuesSequence.BinaryValue
             * @static
             * @param {json_ipc.ValuesSequence.IBinaryValue} message BinaryValue message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            BinaryValue.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes a BinaryValue message from the specified reader or buffer.
             * @function decode
             * @memberof json_ipc.ValuesSequence.BinaryValue
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {json_ipc.ValuesSequence.BinaryValue} BinaryValue
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            BinaryValue.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.json_ipc.ValuesSequence.BinaryValue();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.arr = reader.bytes();
                            break;
                        }
                    case 2: {
                            if (!(message.objLocation && message.objLocation.length))
                                message.objLocation = [];
                            message.objLocation.push(reader.string());
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a BinaryValue message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof json_ipc.ValuesSequence.BinaryValue
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {json_ipc.ValuesSequence.BinaryValue} BinaryValue
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            BinaryValue.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a BinaryValue message.
             * @function verify
             * @memberof json_ipc.ValuesSequence.BinaryValue
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            BinaryValue.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.arr != null && Object.hasOwnProperty.call(message, "arr"))
                    if (!(message.arr && typeof message.arr.length === "number" || $util.isString(message.arr)))
                        return "arr: buffer expected";
                if (message.objLocation != null && Object.hasOwnProperty.call(message, "objLocation")) {
                    if (!Array.isArray(message.objLocation))
                        return "objLocation: array expected";
                    for (var i = 0; i < message.objLocation.length; ++i)
                        if (!$util.isString(message.objLocation[i]))
                            return "objLocation: string[] expected";
                }
                return null;
            };

            /**
             * Creates a BinaryValue message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof json_ipc.ValuesSequence.BinaryValue
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {json_ipc.ValuesSequence.BinaryValue} BinaryValue
             */
            BinaryValue.fromObject = function fromObject(object, long) {
                if (object instanceof $root.json_ipc.ValuesSequence.BinaryValue)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".json_ipc.ValuesSequence.BinaryValue: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.json_ipc.ValuesSequence.BinaryValue();
                if (object.arr != null)
                    if (typeof object.arr === "string")
                        $util.base64.decode(object.arr, message.arr = $util.newBuffer($util.base64.length(object.arr)), 0);
                    else if (object.arr.length >= 0)
                        message.arr = object.arr;
                if (object.objLocation) {
                    if (!Array.isArray(object.objLocation))
                        throw TypeError(".json_ipc.ValuesSequence.BinaryValue.objLocation: array expected");
                    message.objLocation = [];
                    for (var i = 0; i < object.objLocation.length; ++i)
                        message.objLocation[i] = String(object.objLocation[i]);
                }
                return message;
            };

            /**
             * Creates a plain object from a BinaryValue message. Also converts values to other types if specified.
             * @function toObject
             * @memberof json_ipc.ValuesSequence.BinaryValue
             * @static
             * @param {json_ipc.ValuesSequence.BinaryValue} message BinaryValue
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            BinaryValue.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.arrays || options.defaults)
                    object.objLocation = [];
                if (options.defaults)
                    if (options.bytes === String)
                        object.arr = "";
                    else {
                        object.arr = [];
                        if (options.bytes !== Array)
                            object.arr = $util.newBuffer(object.arr);
                    }
                if (message.arr != null && Object.hasOwnProperty.call(message, "arr"))
                    object.arr = options.bytes === String ? $util.base64.encode(message.arr, 0, message.arr.length) : options.bytes === Array ? Array.prototype.slice.call(message.arr) : message.arr;
                if (message.objLocation && message.objLocation.length) {
                    object.objLocation = [];
                    for (var j = 0; j < message.objLocation.length; ++j)
                        object.objLocation[j] = message.objLocation[j];
                }
                return object;
            };

            /**
             * Converts this BinaryValue to JSON.
             * @function toJSON
             * @memberof json_ipc.ValuesSequence.BinaryValue
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            BinaryValue.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for BinaryValue
             * @function getTypeUrl
             * @memberof json_ipc.ValuesSequence.BinaryValue
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            BinaryValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/json_ipc.ValuesSequence.BinaryValue";
            };

            return BinaryValue;
        })();

        ValuesSequence.TransferredObj = (function() {

            /**
             * Properties of a TransferredObj.
             * @memberof json_ipc.ValuesSequence
             * @interface ITransferredObj
             * @property {Array.<string>|null} [objLocation] TransferredObj objLocation
             * @property {common.IObjectReference|null} [objRef] TransferredObj objRef
             */

            /**
             * Constructs a new TransferredObj.
             * @memberof json_ipc.ValuesSequence
             * @classdesc Represents a TransferredObj.
             * @implements ITransferredObj
             * @constructor
             * @param {json_ipc.ValuesSequence.ITransferredObj=} [properties] Properties to set
             */
            function TransferredObj(properties) {
                this.objLocation = [];
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * TransferredObj objLocation.
             * @member {Array.<string>} objLocation
             * @memberof json_ipc.ValuesSequence.TransferredObj
             * @instance
             */
            TransferredObj.prototype.objLocation = $util.emptyArray;

            /**
             * TransferredObj objRef.
             * @member {common.IObjectReference|null|undefined} objRef
             * @memberof json_ipc.ValuesSequence.TransferredObj
             * @instance
             */
            TransferredObj.prototype.objRef = null;

            /**
             * Creates a new TransferredObj instance using the specified properties.
             * @function create
             * @memberof json_ipc.ValuesSequence.TransferredObj
             * @static
             * @param {json_ipc.ValuesSequence.ITransferredObj=} [properties] Properties to set
             * @returns {json_ipc.ValuesSequence.TransferredObj} TransferredObj instance
             */
            TransferredObj.create = function create(properties) {
                return new TransferredObj(properties);
            };

            /**
             * Encodes the specified TransferredObj message. Does not implicitly {@link json_ipc.ValuesSequence.TransferredObj.verify|verify} messages.
             * @function encode
             * @memberof json_ipc.ValuesSequence.TransferredObj
             * @static
             * @param {json_ipc.ValuesSequence.ITransferredObj} message TransferredObj message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            TransferredObj.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.objLocation != null && message.objLocation.length)
                    for (var i = 0; i < message.objLocation.length; ++i)
                        writer.uint32(/* id 1, wireType 2 =*/10).string(message.objLocation[i]);
                if (message.objRef != null && Object.hasOwnProperty.call(message, "objRef"))
                    $root.common.ObjectReference.encode(message.objRef, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
                return writer;
            };

            /**
             * Encodes the specified TransferredObj message, length delimited. Does not implicitly {@link json_ipc.ValuesSequence.TransferredObj.verify|verify} messages.
             * @function encodeDelimited
             * @memberof json_ipc.ValuesSequence.TransferredObj
             * @static
             * @param {json_ipc.ValuesSequence.ITransferredObj} message TransferredObj message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            TransferredObj.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes a TransferredObj message from the specified reader or buffer.
             * @function decode
             * @memberof json_ipc.ValuesSequence.TransferredObj
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {json_ipc.ValuesSequence.TransferredObj} TransferredObj
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            TransferredObj.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.json_ipc.ValuesSequence.TransferredObj();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            if (!(message.objLocation && message.objLocation.length))
                                message.objLocation = [];
                            message.objLocation.push(reader.string());
                            break;
                        }
                    case 2: {
                            message.objRef = $root.common.ObjectReference.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a TransferredObj message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof json_ipc.ValuesSequence.TransferredObj
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {json_ipc.ValuesSequence.TransferredObj} TransferredObj
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            TransferredObj.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a TransferredObj message.
             * @function verify
             * @memberof json_ipc.ValuesSequence.TransferredObj
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            TransferredObj.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.objLocation != null && Object.hasOwnProperty.call(message, "objLocation")) {
                    if (!Array.isArray(message.objLocation))
                        return "objLocation: array expected";
                    for (var i = 0; i < message.objLocation.length; ++i)
                        if (!$util.isString(message.objLocation[i]))
                            return "objLocation: string[] expected";
                }
                if (message.objRef != null && Object.hasOwnProperty.call(message, "objRef")) {
                    var error = $root.common.ObjectReference.verify(message.objRef, long + 1);
                    if (error)
                        return "objRef." + error;
                }
                return null;
            };

            /**
             * Creates a TransferredObj message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof json_ipc.ValuesSequence.TransferredObj
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {json_ipc.ValuesSequence.TransferredObj} TransferredObj
             */
            TransferredObj.fromObject = function fromObject(object, long) {
                if (object instanceof $root.json_ipc.ValuesSequence.TransferredObj)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".json_ipc.ValuesSequence.TransferredObj: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.json_ipc.ValuesSequence.TransferredObj();
                if (object.objLocation) {
                    if (!Array.isArray(object.objLocation))
                        throw TypeError(".json_ipc.ValuesSequence.TransferredObj.objLocation: array expected");
                    message.objLocation = [];
                    for (var i = 0; i < object.objLocation.length; ++i)
                        message.objLocation[i] = String(object.objLocation[i]);
                }
                if (object.objRef != null) {
                    if (!$util.isObject(object.objRef))
                        throw TypeError(".json_ipc.ValuesSequence.TransferredObj.objRef: object expected");
                    message.objRef = $root.common.ObjectReference.fromObject(object.objRef, long + 1);
                }
                return message;
            };

            /**
             * Creates a plain object from a TransferredObj message. Also converts values to other types if specified.
             * @function toObject
             * @memberof json_ipc.ValuesSequence.TransferredObj
             * @static
             * @param {json_ipc.ValuesSequence.TransferredObj} message TransferredObj
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            TransferredObj.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.arrays || options.defaults)
                    object.objLocation = [];
                if (options.defaults)
                    object.objRef = null;
                if (message.objLocation && message.objLocation.length) {
                    object.objLocation = [];
                    for (var j = 0; j < message.objLocation.length; ++j)
                        object.objLocation[j] = message.objLocation[j];
                }
                if (message.objRef != null && Object.hasOwnProperty.call(message, "objRef"))
                    object.objRef = $root.common.ObjectReference.toObject(message.objRef, options, q + 1);
                return object;
            };

            /**
             * Converts this TransferredObj to JSON.
             * @function toJSON
             * @memberof json_ipc.ValuesSequence.TransferredObj
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            TransferredObj.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for TransferredObj
             * @function getTypeUrl
             * @memberof json_ipc.ValuesSequence.TransferredObj
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            TransferredObj.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/json_ipc.ValuesSequence.TransferredObj";
            };

            return TransferredObj;
        })();

        ValuesSequence.Value = (function() {

            /**
             * Properties of a Value.
             * @memberof json_ipc.ValuesSequence
             * @interface IValue
             * @property {string|null} [json] Value json
             * @property {Array.<json_ipc.ValuesSequence.IBinaryValue>|null} [binaryInJson] Value binaryInJson
             * @property {Array.<json_ipc.ValuesSequence.ITransferredObj>|null} [transferredInJson] Value transferredInJson
             * @property {json_ipc.ValuesSequence.IBinaryValue|null} [arr] Value arr
             * @property {json_ipc.ValuesSequence.ITransferredObj|null} [transferred] Value transferred
             */

            /**
             * Constructs a new Value.
             * @memberof json_ipc.ValuesSequence
             * @classdesc Represents a Value.
             * @implements IValue
             * @constructor
             * @param {json_ipc.ValuesSequence.IValue=} [properties] Properties to set
             */
            function Value(properties) {
                this.binaryInJson = [];
                this.transferredInJson = [];
                if (properties)
                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                        if (properties[keys[i]] != null && keys[i] !== "__proto__")
                            this[keys[i]] = properties[keys[i]];
            }

            /**
             * Value json.
             * @member {string} json
             * @memberof json_ipc.ValuesSequence.Value
             * @instance
             */
            Value.prototype.json = "";

            /**
             * Value binaryInJson.
             * @member {Array.<json_ipc.ValuesSequence.IBinaryValue>} binaryInJson
             * @memberof json_ipc.ValuesSequence.Value
             * @instance
             */
            Value.prototype.binaryInJson = $util.emptyArray;

            /**
             * Value transferredInJson.
             * @member {Array.<json_ipc.ValuesSequence.ITransferredObj>} transferredInJson
             * @memberof json_ipc.ValuesSequence.Value
             * @instance
             */
            Value.prototype.transferredInJson = $util.emptyArray;

            /**
             * Value arr.
             * @member {json_ipc.ValuesSequence.IBinaryValue|null|undefined} arr
             * @memberof json_ipc.ValuesSequence.Value
             * @instance
             */
            Value.prototype.arr = null;

            /**
             * Value transferred.
             * @member {json_ipc.ValuesSequence.ITransferredObj|null|undefined} transferred
             * @memberof json_ipc.ValuesSequence.Value
             * @instance
             */
            Value.prototype.transferred = null;

            /**
             * Creates a new Value instance using the specified properties.
             * @function create
             * @memberof json_ipc.ValuesSequence.Value
             * @static
             * @param {json_ipc.ValuesSequence.IValue=} [properties] Properties to set
             * @returns {json_ipc.ValuesSequence.Value} Value instance
             */
            Value.create = function create(properties) {
                return new Value(properties);
            };

            /**
             * Encodes the specified Value message. Does not implicitly {@link json_ipc.ValuesSequence.Value.verify|verify} messages.
             * @function encode
             * @memberof json_ipc.ValuesSequence.Value
             * @static
             * @param {json_ipc.ValuesSequence.IValue} message Value message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Value.encode = function encode(message, writer, q) {
                if (!writer)
                    writer = $Writer.create();
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.json);
                if (message.binaryInJson != null && message.binaryInJson.length)
                    for (var i = 0; i < message.binaryInJson.length; ++i)
                        $root.json_ipc.ValuesSequence.BinaryValue.encode(message.binaryInJson[i], writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
                if (message.transferredInJson != null && message.transferredInJson.length)
                    for (var i = 0; i < message.transferredInJson.length; ++i)
                        $root.json_ipc.ValuesSequence.TransferredObj.encode(message.transferredInJson[i], writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
                if (message.arr != null && Object.hasOwnProperty.call(message, "arr"))
                    $root.json_ipc.ValuesSequence.BinaryValue.encode(message.arr, writer.uint32(/* id 4, wireType 2 =*/34).fork(), q + 1).ldelim();
                if (message.transferred != null && Object.hasOwnProperty.call(message, "transferred"))
                    $root.json_ipc.ValuesSequence.TransferredObj.encode(message.transferred, writer.uint32(/* id 5, wireType 2 =*/42).fork(), q + 1).ldelim();
                return writer;
            };

            /**
             * Encodes the specified Value message, length delimited. Does not implicitly {@link json_ipc.ValuesSequence.Value.verify|verify} messages.
             * @function encodeDelimited
             * @memberof json_ipc.ValuesSequence.Value
             * @static
             * @param {json_ipc.ValuesSequence.IValue} message Value message or plain object to encode
             * @param {$protobuf.Writer} [writer] Writer to encode to
             * @returns {$protobuf.Writer} Writer
             */
            Value.encodeDelimited = function encodeDelimited(message, writer) {
                return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
            };

            /**
             * Decodes a Value message from the specified reader or buffer.
             * @function decode
             * @memberof json_ipc.ValuesSequence.Value
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @param {number} [length] Message length if known beforehand
             * @returns {json_ipc.ValuesSequence.Value} Value
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Value.decode = function decode(reader, length, error, long) {
                if (!(reader instanceof $Reader))
                    reader = $Reader.create(reader);
                if (long === undefined)
                    long = 0;
                if (long > $Reader.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.json_ipc.ValuesSequence.Value();
                while (reader.pos < end) {
                    var tag = reader.uint32();
                    if (tag === error)
                        break;
                    switch (tag >>> 3) {
                    case 1: {
                            message.json = reader.string();
                            break;
                        }
                    case 2: {
                            if (!(message.binaryInJson && message.binaryInJson.length))
                                message.binaryInJson = [];
                            message.binaryInJson.push($root.json_ipc.ValuesSequence.BinaryValue.decode(reader, reader.uint32(), undefined, long + 1));
                            break;
                        }
                    case 3: {
                            if (!(message.transferredInJson && message.transferredInJson.length))
                                message.transferredInJson = [];
                            message.transferredInJson.push($root.json_ipc.ValuesSequence.TransferredObj.decode(reader, reader.uint32(), undefined, long + 1));
                            break;
                        }
                    case 4: {
                            message.arr = $root.json_ipc.ValuesSequence.BinaryValue.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    case 5: {
                            message.transferred = $root.json_ipc.ValuesSequence.TransferredObj.decode(reader, reader.uint32(), undefined, long + 1);
                            break;
                        }
                    default:
                        reader.skipType(tag & 7, long);
                        break;
                    }
                }
                return message;
            };

            /**
             * Decodes a Value message from the specified reader or buffer, length delimited.
             * @function decodeDelimited
             * @memberof json_ipc.ValuesSequence.Value
             * @static
             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
             * @returns {json_ipc.ValuesSequence.Value} Value
             * @throws {Error} If the payload is not a reader or valid buffer
             * @throws {$protobuf.util.ProtocolError} If required fields are missing
             */
            Value.decodeDelimited = function decodeDelimited(reader) {
                if (!(reader instanceof $Reader))
                    reader = new $Reader(reader);
                return this.decode(reader, reader.uint32());
            };

            /**
             * Verifies a Value message.
             * @function verify
             * @memberof json_ipc.ValuesSequence.Value
             * @static
             * @param {Object.<string,*>} message Plain object to verify
             * @returns {string|null} `null` if valid, otherwise the reason why it is not
             */
            Value.verify = function verify(message, long) {
                if (typeof message !== "object" || message === null)
                    return "object expected";
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    return "maximum nesting depth exceeded";
                if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                    if (!$util.isString(message.json))
                        return "json: string expected";
                if (message.binaryInJson != null && Object.hasOwnProperty.call(message, "binaryInJson")) {
                    if (!Array.isArray(message.binaryInJson))
                        return "binaryInJson: array expected";
                    for (var i = 0; i < message.binaryInJson.length; ++i) {
                        var error = $root.json_ipc.ValuesSequence.BinaryValue.verify(message.binaryInJson[i], long + 1);
                        if (error)
                            return "binaryInJson." + error;
                    }
                }
                if (message.transferredInJson != null && Object.hasOwnProperty.call(message, "transferredInJson")) {
                    if (!Array.isArray(message.transferredInJson))
                        return "transferredInJson: array expected";
                    for (var i = 0; i < message.transferredInJson.length; ++i) {
                        var error = $root.json_ipc.ValuesSequence.TransferredObj.verify(message.transferredInJson[i], long + 1);
                        if (error)
                            return "transferredInJson." + error;
                    }
                }
                if (message.arr != null && Object.hasOwnProperty.call(message, "arr")) {
                    var error = $root.json_ipc.ValuesSequence.BinaryValue.verify(message.arr, long + 1);
                    if (error)
                        return "arr." + error;
                }
                if (message.transferred != null && Object.hasOwnProperty.call(message, "transferred")) {
                    var error = $root.json_ipc.ValuesSequence.TransferredObj.verify(message.transferred, long + 1);
                    if (error)
                        return "transferred." + error;
                }
                return null;
            };

            /**
             * Creates a Value message from a plain object. Also converts values to their respective internal types.
             * @function fromObject
             * @memberof json_ipc.ValuesSequence.Value
             * @static
             * @param {Object.<string,*>} object Plain object
             * @returns {json_ipc.ValuesSequence.Value} Value
             */
            Value.fromObject = function fromObject(object, long) {
                if (object instanceof $root.json_ipc.ValuesSequence.Value)
                    return object;
                if (!$util.isObject(object))
                    throw TypeError(".json_ipc.ValuesSequence.Value: object expected");
                if (long === undefined)
                    long = 0;
                if (long > $util.recursionLimit)
                    throw Error("maximum nesting depth exceeded");
                var message = new $root.json_ipc.ValuesSequence.Value();
                if (object.json != null)
                    message.json = String(object.json);
                if (object.binaryInJson) {
                    if (!Array.isArray(object.binaryInJson))
                        throw TypeError(".json_ipc.ValuesSequence.Value.binaryInJson: array expected");
                    message.binaryInJson = [];
                    for (var i = 0; i < object.binaryInJson.length; ++i) {
                        if (!$util.isObject(object.binaryInJson[i]))
                            throw TypeError(".json_ipc.ValuesSequence.Value.binaryInJson: object expected");
                        message.binaryInJson[i] = $root.json_ipc.ValuesSequence.BinaryValue.fromObject(object.binaryInJson[i], long + 1);
                    }
                }
                if (object.transferredInJson) {
                    if (!Array.isArray(object.transferredInJson))
                        throw TypeError(".json_ipc.ValuesSequence.Value.transferredInJson: array expected");
                    message.transferredInJson = [];
                    for (var i = 0; i < object.transferredInJson.length; ++i) {
                        if (!$util.isObject(object.transferredInJson[i]))
                            throw TypeError(".json_ipc.ValuesSequence.Value.transferredInJson: object expected");
                        message.transferredInJson[i] = $root.json_ipc.ValuesSequence.TransferredObj.fromObject(object.transferredInJson[i], long + 1);
                    }
                }
                if (object.arr != null) {
                    if (!$util.isObject(object.arr))
                        throw TypeError(".json_ipc.ValuesSequence.Value.arr: object expected");
                    message.arr = $root.json_ipc.ValuesSequence.BinaryValue.fromObject(object.arr, long + 1);
                }
                if (object.transferred != null) {
                    if (!$util.isObject(object.transferred))
                        throw TypeError(".json_ipc.ValuesSequence.Value.transferred: object expected");
                    message.transferred = $root.json_ipc.ValuesSequence.TransferredObj.fromObject(object.transferred, long + 1);
                }
                return message;
            };

            /**
             * Creates a plain object from a Value message. Also converts values to other types if specified.
             * @function toObject
             * @memberof json_ipc.ValuesSequence.Value
             * @static
             * @param {json_ipc.ValuesSequence.Value} message Value
             * @param {$protobuf.IConversionOptions} [options] Conversion options
             * @returns {Object.<string,*>} Plain object
             */
            Value.toObject = function toObject(message, options, q) {
                if (!options)
                    options = {};
                if (q === undefined)
                    q = 0;
                if (q > $util.recursionLimit)
                    throw Error("max depth exceeded");
                var object = {};
                if (options.arrays || options.defaults) {
                    object.binaryInJson = [];
                    object.transferredInJson = [];
                }
                if (options.defaults) {
                    object.json = "";
                    object.arr = null;
                    object.transferred = null;
                }
                if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                    object.json = message.json;
                if (message.binaryInJson && message.binaryInJson.length) {
                    object.binaryInJson = [];
                    for (var j = 0; j < message.binaryInJson.length; ++j)
                        object.binaryInJson[j] = $root.json_ipc.ValuesSequence.BinaryValue.toObject(message.binaryInJson[j], options, q + 1);
                }
                if (message.transferredInJson && message.transferredInJson.length) {
                    object.transferredInJson = [];
                    for (var j = 0; j < message.transferredInJson.length; ++j)
                        object.transferredInJson[j] = $root.json_ipc.ValuesSequence.TransferredObj.toObject(message.transferredInJson[j], options, q + 1);
                }
                if (message.arr != null && Object.hasOwnProperty.call(message, "arr"))
                    object.arr = $root.json_ipc.ValuesSequence.BinaryValue.toObject(message.arr, options, q + 1);
                if (message.transferred != null && Object.hasOwnProperty.call(message, "transferred"))
                    object.transferred = $root.json_ipc.ValuesSequence.TransferredObj.toObject(message.transferred, options, q + 1);
                return object;
            };

            /**
             * Converts this Value to JSON.
             * @function toJSON
             * @memberof json_ipc.ValuesSequence.Value
             * @instance
             * @returns {Object.<string,*>} JSON object
             */
            Value.prototype.toJSON = function toJSON() {
                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
            };

            /**
             * Gets the default type url for Value
             * @function getTypeUrl
             * @memberof json_ipc.ValuesSequence.Value
             * @static
             * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
             * @returns {string} The default type url
             */
            Value.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
                if (typeUrlPrefix === undefined) {
                    typeUrlPrefix = "type.googleapis.com";
                }
                return typeUrlPrefix + "/json_ipc.ValuesSequence.Value";
            };

            return Value;
        })();

        return ValuesSequence;
    })();

    return json_ipc;
})();

$root.common = (function() {

    /**
     * Namespace common.
     * @exports common
     * @namespace
     */
    var common = {};

    common.ObjectReference = (function() {

        /**
         * Properties of an ObjectReference.
         * @memberof common
         * @interface IObjectReference
         * @property {string|null} [objType] ObjectReference objType
         * @property {Array.<string>|null} [path] ObjectReference path
         */

        /**
         * Constructs a new ObjectReference.
         * @memberof common
         * @classdesc Represents an ObjectReference.
         * @implements IObjectReference
         * @constructor
         * @param {common.IObjectReference=} [properties] Properties to set
         */
        function ObjectReference(properties) {
            this.path = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ObjectReference objType.
         * @member {string} objType
         * @memberof common.ObjectReference
         * @instance
         */
        ObjectReference.prototype.objType = "";

        /**
         * ObjectReference path.
         * @member {Array.<string>} path
         * @memberof common.ObjectReference
         * @instance
         */
        ObjectReference.prototype.path = $util.emptyArray;

        /**
         * Creates a new ObjectReference instance using the specified properties.
         * @function create
         * @memberof common.ObjectReference
         * @static
         * @param {common.IObjectReference=} [properties] Properties to set
         * @returns {common.ObjectReference} ObjectReference instance
         */
        ObjectReference.create = function create(properties) {
            return new ObjectReference(properties);
        };

        /**
         * Encodes the specified ObjectReference message. Does not implicitly {@link common.ObjectReference.verify|verify} messages.
         * @function encode
         * @memberof common.ObjectReference
         * @static
         * @param {common.IObjectReference} message ObjectReference message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ObjectReference.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.objType != null && Object.hasOwnProperty.call(message, "objType"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.objType);
            if (message.path != null && message.path.length)
                for (var i = 0; i < message.path.length; ++i)
                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.path[i]);
            return writer;
        };

        /**
         * Encodes the specified ObjectReference message, length delimited. Does not implicitly {@link common.ObjectReference.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.ObjectReference
         * @static
         * @param {common.IObjectReference} message ObjectReference message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ObjectReference.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an ObjectReference message from the specified reader or buffer.
         * @function decode
         * @memberof common.ObjectReference
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.ObjectReference} ObjectReference
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ObjectReference.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ObjectReference();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.objType = reader.string();
                        break;
                    }
                case 2: {
                        if (!(message.path && message.path.length))
                            message.path = [];
                        message.path.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an ObjectReference message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.ObjectReference
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.ObjectReference} ObjectReference
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ObjectReference.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an ObjectReference message.
         * @function verify
         * @memberof common.ObjectReference
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ObjectReference.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.objType != null && Object.hasOwnProperty.call(message, "objType"))
                if (!$util.isString(message.objType))
                    return "objType: string expected";
            if (message.path != null && Object.hasOwnProperty.call(message, "path")) {
                if (!Array.isArray(message.path))
                    return "path: array expected";
                for (var i = 0; i < message.path.length; ++i)
                    if (!$util.isString(message.path[i]))
                        return "path: string[] expected";
            }
            return null;
        };

        /**
         * Creates an ObjectReference message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.ObjectReference
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.ObjectReference} ObjectReference
         */
        ObjectReference.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.ObjectReference)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.ObjectReference: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.ObjectReference();
            if (object.objType != null)
                message.objType = String(object.objType);
            if (object.path) {
                if (!Array.isArray(object.path))
                    throw TypeError(".common.ObjectReference.path: array expected");
                message.path = [];
                for (var i = 0; i < object.path.length; ++i)
                    message.path[i] = String(object.path[i]);
            }
            return message;
        };

        /**
         * Creates a plain object from an ObjectReference message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.ObjectReference
         * @static
         * @param {common.ObjectReference} message ObjectReference
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ObjectReference.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.path = [];
            if (options.defaults)
                object.objType = "";
            if (message.objType != null && Object.hasOwnProperty.call(message, "objType"))
                object.objType = message.objType;
            if (message.path && message.path.length) {
                object.path = [];
                for (var j = 0; j < message.path.length; ++j)
                    object.path[j] = message.path[j];
            }
            return object;
        };

        /**
         * Converts this ObjectReference to JSON.
         * @function toJSON
         * @memberof common.ObjectReference
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ObjectReference.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ObjectReference
         * @function getTypeUrl
         * @memberof common.ObjectReference
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ObjectReference.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.ObjectReference";
        };

        return ObjectReference;
    })();

    common.BooleanValue = (function() {

        /**
         * Properties of a BooleanValue.
         * @memberof common
         * @interface IBooleanValue
         * @property {boolean|null} [value] BooleanValue value
         */

        /**
         * Constructs a new BooleanValue.
         * @memberof common
         * @classdesc Represents a BooleanValue.
         * @implements IBooleanValue
         * @constructor
         * @param {common.IBooleanValue=} [properties] Properties to set
         */
        function BooleanValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * BooleanValue value.
         * @member {boolean} value
         * @memberof common.BooleanValue
         * @instance
         */
        BooleanValue.prototype.value = false;

        /**
         * Creates a new BooleanValue instance using the specified properties.
         * @function create
         * @memberof common.BooleanValue
         * @static
         * @param {common.IBooleanValue=} [properties] Properties to set
         * @returns {common.BooleanValue} BooleanValue instance
         */
        BooleanValue.create = function create(properties) {
            return new BooleanValue(properties);
        };

        /**
         * Encodes the specified BooleanValue message. Does not implicitly {@link common.BooleanValue.verify|verify} messages.
         * @function encode
         * @memberof common.BooleanValue
         * @static
         * @param {common.IBooleanValue} message BooleanValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BooleanValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 0 =*/8).bool(message.value);
            return writer;
        };

        /**
         * Encodes the specified BooleanValue message, length delimited. Does not implicitly {@link common.BooleanValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.BooleanValue
         * @static
         * @param {common.IBooleanValue} message BooleanValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BooleanValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a BooleanValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.BooleanValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.BooleanValue} BooleanValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BooleanValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BooleanValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.bool();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a BooleanValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.BooleanValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.BooleanValue} BooleanValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BooleanValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a BooleanValue message.
         * @function verify
         * @memberof common.BooleanValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        BooleanValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (typeof message.value !== "boolean")
                    return "value: boolean expected";
            return null;
        };

        /**
         * Creates a BooleanValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.BooleanValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.BooleanValue} BooleanValue
         */
        BooleanValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.BooleanValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.BooleanValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.BooleanValue();
            if (object.value != null)
                message.value = Boolean(object.value);
            return message;
        };

        /**
         * Creates a plain object from a BooleanValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.BooleanValue
         * @static
         * @param {common.BooleanValue} message BooleanValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        BooleanValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.value = false;
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = message.value;
            return object;
        };

        /**
         * Converts this BooleanValue to JSON.
         * @function toJSON
         * @memberof common.BooleanValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        BooleanValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for BooleanValue
         * @function getTypeUrl
         * @memberof common.BooleanValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        BooleanValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.BooleanValue";
        };

        return BooleanValue;
    })();

    common.StringArrayValue = (function() {

        /**
         * Properties of a StringArrayValue.
         * @memberof common
         * @interface IStringArrayValue
         * @property {Array.<string>|null} [values] StringArrayValue values
         */

        /**
         * Constructs a new StringArrayValue.
         * @memberof common
         * @classdesc Represents a StringArrayValue.
         * @implements IStringArrayValue
         * @constructor
         * @param {common.IStringArrayValue=} [properties] Properties to set
         */
        function StringArrayValue(properties) {
            this.values = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * StringArrayValue values.
         * @member {Array.<string>} values
         * @memberof common.StringArrayValue
         * @instance
         */
        StringArrayValue.prototype.values = $util.emptyArray;

        /**
         * Creates a new StringArrayValue instance using the specified properties.
         * @function create
         * @memberof common.StringArrayValue
         * @static
         * @param {common.IStringArrayValue=} [properties] Properties to set
         * @returns {common.StringArrayValue} StringArrayValue instance
         */
        StringArrayValue.create = function create(properties) {
            return new StringArrayValue(properties);
        };

        /**
         * Encodes the specified StringArrayValue message. Does not implicitly {@link common.StringArrayValue.verify|verify} messages.
         * @function encode
         * @memberof common.StringArrayValue
         * @static
         * @param {common.IStringArrayValue} message StringArrayValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringArrayValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.values != null && message.values.length)
                for (var i = 0; i < message.values.length; ++i)
                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.values[i]);
            return writer;
        };

        /**
         * Encodes the specified StringArrayValue message, length delimited. Does not implicitly {@link common.StringArrayValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.StringArrayValue
         * @static
         * @param {common.IStringArrayValue} message StringArrayValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringArrayValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a StringArrayValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.StringArrayValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.StringArrayValue} StringArrayValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringArrayValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringArrayValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.values && message.values.length))
                            message.values = [];
                        message.values.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a StringArrayValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.StringArrayValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.StringArrayValue} StringArrayValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringArrayValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a StringArrayValue message.
         * @function verify
         * @memberof common.StringArrayValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        StringArrayValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.values != null && Object.hasOwnProperty.call(message, "values")) {
                if (!Array.isArray(message.values))
                    return "values: array expected";
                for (var i = 0; i < message.values.length; ++i)
                    if (!$util.isString(message.values[i]))
                        return "values: string[] expected";
            }
            return null;
        };

        /**
         * Creates a StringArrayValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.StringArrayValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.StringArrayValue} StringArrayValue
         */
        StringArrayValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.StringArrayValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.StringArrayValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.StringArrayValue();
            if (object.values) {
                if (!Array.isArray(object.values))
                    throw TypeError(".common.StringArrayValue.values: array expected");
                message.values = [];
                for (var i = 0; i < object.values.length; ++i)
                    message.values[i] = String(object.values[i]);
            }
            return message;
        };

        /**
         * Creates a plain object from a StringArrayValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.StringArrayValue
         * @static
         * @param {common.StringArrayValue} message StringArrayValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        StringArrayValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.values = [];
            if (message.values && message.values.length) {
                object.values = [];
                for (var j = 0; j < message.values.length; ++j)
                    object.values[j] = message.values[j];
            }
            return object;
        };

        /**
         * Converts this StringArrayValue to JSON.
         * @function toJSON
         * @memberof common.StringArrayValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        StringArrayValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for StringArrayValue
         * @function getTypeUrl
         * @memberof common.StringArrayValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        StringArrayValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.StringArrayValue";
        };

        return StringArrayValue;
    })();

    common.UInt64Value = (function() {

        /**
         * Properties of a UInt64Value.
         * @memberof common
         * @interface IUInt64Value
         * @property {number|Long|null} [value] UInt64Value value
         */

        /**
         * Constructs a new UInt64Value.
         * @memberof common
         * @classdesc Represents a UInt64Value.
         * @implements IUInt64Value
         * @constructor
         * @param {common.IUInt64Value=} [properties] Properties to set
         */
        function UInt64Value(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * UInt64Value value.
         * @member {number|Long} value
         * @memberof common.UInt64Value
         * @instance
         */
        UInt64Value.prototype.value = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new UInt64Value instance using the specified properties.
         * @function create
         * @memberof common.UInt64Value
         * @static
         * @param {common.IUInt64Value=} [properties] Properties to set
         * @returns {common.UInt64Value} UInt64Value instance
         */
        UInt64Value.create = function create(properties) {
            return new UInt64Value(properties);
        };

        /**
         * Encodes the specified UInt64Value message. Does not implicitly {@link common.UInt64Value.verify|verify} messages.
         * @function encode
         * @memberof common.UInt64Value
         * @static
         * @param {common.IUInt64Value} message UInt64Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt64Value.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.value);
            return writer;
        };

        /**
         * Encodes the specified UInt64Value message, length delimited. Does not implicitly {@link common.UInt64Value.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.UInt64Value
         * @static
         * @param {common.IUInt64Value} message UInt64Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt64Value.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a UInt64Value message from the specified reader or buffer.
         * @function decode
         * @memberof common.UInt64Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.UInt64Value} UInt64Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt64Value.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt64Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a UInt64Value message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.UInt64Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.UInt64Value} UInt64Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt64Value.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a UInt64Value message.
         * @function verify
         * @memberof common.UInt64Value
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        UInt64Value.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!$util.isInteger(message.value) && !(message.value && $util.isInteger(message.value.low) && $util.isInteger(message.value.high)))
                    return "value: integer|Long expected";
            return null;
        };

        /**
         * Creates a UInt64Value message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.UInt64Value
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.UInt64Value} UInt64Value
         */
        UInt64Value.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.UInt64Value)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.UInt64Value: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.UInt64Value();
            if (object.value != null)
                if ($util.Long)
                    message.value = $util.Long.fromValue(object.value, true);
                else if (typeof object.value === "string")
                    message.value = parseInt(object.value, 10);
                else if (typeof object.value === "number")
                    message.value = object.value;
                else if (typeof object.value === "object")
                    message.value = new $util.LongBits(object.value.low >>> 0, object.value.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from a UInt64Value message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.UInt64Value
         * @static
         * @param {common.UInt64Value} message UInt64Value
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        UInt64Value.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.value = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.value = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.value = typeof message.value === "number" ? BigInt(message.value) : $util.Long.fromBits(message.value.low >>> 0, message.value.high >>> 0, true).toBigInt();
                else if (typeof message.value === "number")
                    object.value = options.longs === String ? String(message.value) : message.value;
                else
                    object.value = options.longs === String ? $util.Long.prototype.toString.call(message.value) : options.longs === Number ? new $util.LongBits(message.value.low >>> 0, message.value.high >>> 0).toNumber(true) : message.value;
            return object;
        };

        /**
         * Converts this UInt64Value to JSON.
         * @function toJSON
         * @memberof common.UInt64Value
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        UInt64Value.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for UInt64Value
         * @function getTypeUrl
         * @memberof common.UInt64Value
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        UInt64Value.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.UInt64Value";
        };

        return UInt64Value;
    })();

    common.UInt32Value = (function() {

        /**
         * Properties of a UInt32Value.
         * @memberof common
         * @interface IUInt32Value
         * @property {number|null} [value] UInt32Value value
         */

        /**
         * Constructs a new UInt32Value.
         * @memberof common
         * @classdesc Represents a UInt32Value.
         * @implements IUInt32Value
         * @constructor
         * @param {common.IUInt32Value=} [properties] Properties to set
         */
        function UInt32Value(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * UInt32Value value.
         * @member {number} value
         * @memberof common.UInt32Value
         * @instance
         */
        UInt32Value.prototype.value = 0;

        /**
         * Creates a new UInt32Value instance using the specified properties.
         * @function create
         * @memberof common.UInt32Value
         * @static
         * @param {common.IUInt32Value=} [properties] Properties to set
         * @returns {common.UInt32Value} UInt32Value instance
         */
        UInt32Value.create = function create(properties) {
            return new UInt32Value(properties);
        };

        /**
         * Encodes the specified UInt32Value message. Does not implicitly {@link common.UInt32Value.verify|verify} messages.
         * @function encode
         * @memberof common.UInt32Value
         * @static
         * @param {common.IUInt32Value} message UInt32Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt32Value.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.value);
            return writer;
        };

        /**
         * Encodes the specified UInt32Value message, length delimited. Does not implicitly {@link common.UInt32Value.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.UInt32Value
         * @static
         * @param {common.IUInt32Value} message UInt32Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt32Value.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a UInt32Value message from the specified reader or buffer.
         * @function decode
         * @memberof common.UInt32Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.UInt32Value} UInt32Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt32Value.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt32Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.uint32();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a UInt32Value message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.UInt32Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.UInt32Value} UInt32Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt32Value.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a UInt32Value message.
         * @function verify
         * @memberof common.UInt32Value
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        UInt32Value.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!$util.isInteger(message.value))
                    return "value: integer expected";
            return null;
        };

        /**
         * Creates a UInt32Value message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.UInt32Value
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.UInt32Value} UInt32Value
         */
        UInt32Value.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.UInt32Value)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.UInt32Value: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.UInt32Value();
            if (object.value != null)
                message.value = object.value >>> 0;
            return message;
        };

        /**
         * Creates a plain object from a UInt32Value message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.UInt32Value
         * @static
         * @param {common.UInt32Value} message UInt32Value
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        UInt32Value.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.value = 0;
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = message.value;
            return object;
        };

        /**
         * Converts this UInt32Value to JSON.
         * @function toJSON
         * @memberof common.UInt32Value
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        UInt32Value.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for UInt32Value
         * @function getTypeUrl
         * @memberof common.UInt32Value
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        UInt32Value.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.UInt32Value";
        };

        return UInt32Value;
    })();

    common.StringValue = (function() {

        /**
         * Properties of a StringValue.
         * @memberof common
         * @interface IStringValue
         * @property {string|null} [value] StringValue value
         */

        /**
         * Constructs a new StringValue.
         * @memberof common
         * @classdesc Represents a StringValue.
         * @implements IStringValue
         * @constructor
         * @param {common.IStringValue=} [properties] Properties to set
         */
        function StringValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * StringValue value.
         * @member {string} value
         * @memberof common.StringValue
         * @instance
         */
        StringValue.prototype.value = "";

        /**
         * Creates a new StringValue instance using the specified properties.
         * @function create
         * @memberof common.StringValue
         * @static
         * @param {common.IStringValue=} [properties] Properties to set
         * @returns {common.StringValue} StringValue instance
         */
        StringValue.create = function create(properties) {
            return new StringValue(properties);
        };

        /**
         * Encodes the specified StringValue message. Does not implicitly {@link common.StringValue.verify|verify} messages.
         * @function encode
         * @memberof common.StringValue
         * @static
         * @param {common.IStringValue} message StringValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.value);
            return writer;
        };

        /**
         * Encodes the specified StringValue message, length delimited. Does not implicitly {@link common.StringValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.StringValue
         * @static
         * @param {common.IStringValue} message StringValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a StringValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.StringValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.StringValue} StringValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a StringValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.StringValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.StringValue} StringValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a StringValue message.
         * @function verify
         * @memberof common.StringValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        StringValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!$util.isString(message.value))
                    return "value: string expected";
            return null;
        };

        /**
         * Creates a StringValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.StringValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.StringValue} StringValue
         */
        StringValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.StringValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.StringValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.StringValue();
            if (object.value != null)
                message.value = String(object.value);
            return message;
        };

        /**
         * Creates a plain object from a StringValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.StringValue
         * @static
         * @param {common.StringValue} message StringValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        StringValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.value = "";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = message.value;
            return object;
        };

        /**
         * Converts this StringValue to JSON.
         * @function toJSON
         * @memberof common.StringValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        StringValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for StringValue
         * @function getTypeUrl
         * @memberof common.StringValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        StringValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.StringValue";
        };

        return StringValue;
    })();

    common.BytesValue = (function() {

        /**
         * Properties of a BytesValue.
         * @memberof common
         * @interface IBytesValue
         * @property {Uint8Array|null} [value] BytesValue value
         */

        /**
         * Constructs a new BytesValue.
         * @memberof common
         * @classdesc Represents a BytesValue.
         * @implements IBytesValue
         * @constructor
         * @param {common.IBytesValue=} [properties] Properties to set
         */
        function BytesValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * BytesValue value.
         * @member {Uint8Array} value
         * @memberof common.BytesValue
         * @instance
         */
        BytesValue.prototype.value = $util.newBuffer([]);

        /**
         * Creates a new BytesValue instance using the specified properties.
         * @function create
         * @memberof common.BytesValue
         * @static
         * @param {common.IBytesValue=} [properties] Properties to set
         * @returns {common.BytesValue} BytesValue instance
         */
        BytesValue.create = function create(properties) {
            return new BytesValue(properties);
        };

        /**
         * Encodes the specified BytesValue message. Does not implicitly {@link common.BytesValue.verify|verify} messages.
         * @function encode
         * @memberof common.BytesValue
         * @static
         * @param {common.IBytesValue} message BytesValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BytesValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.value);
            return writer;
        };

        /**
         * Encodes the specified BytesValue message, length delimited. Does not implicitly {@link common.BytesValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.BytesValue
         * @static
         * @param {common.IBytesValue} message BytesValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BytesValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a BytesValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.BytesValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.BytesValue} BytesValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BytesValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BytesValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.bytes();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a BytesValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.BytesValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.BytesValue} BytesValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BytesValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a BytesValue message.
         * @function verify
         * @memberof common.BytesValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        BytesValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!(message.value && typeof message.value.length === "number" || $util.isString(message.value)))
                    return "value: buffer expected";
            return null;
        };

        /**
         * Creates a BytesValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.BytesValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.BytesValue} BytesValue
         */
        BytesValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.BytesValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.BytesValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.BytesValue();
            if (object.value != null)
                if (typeof object.value === "string")
                    $util.base64.decode(object.value, message.value = $util.newBuffer($util.base64.length(object.value)), 0);
                else if (object.value.length >= 0)
                    message.value = object.value;
            return message;
        };

        /**
         * Creates a plain object from a BytesValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.BytesValue
         * @static
         * @param {common.BytesValue} message BytesValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        BytesValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if (options.bytes === String)
                    object.value = "";
                else {
                    object.value = [];
                    if (options.bytes !== Array)
                        object.value = $util.newBuffer(object.value);
                }
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = options.bytes === String ? $util.base64.encode(message.value, 0, message.value.length) : options.bytes === Array ? Array.prototype.slice.call(message.value) : message.value;
            return object;
        };

        /**
         * Converts this BytesValue to JSON.
         * @function toJSON
         * @memberof common.BytesValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        BytesValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for BytesValue
         * @function getTypeUrl
         * @memberof common.BytesValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        BytesValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.BytesValue";
        };

        return BytesValue;
    })();

    common.ErrorValue = (function() {

        /**
         * Properties of an ErrorValue.
         * @memberof common
         * @interface IErrorValue
         * @property {string|null} [runtimeExcJson] ErrorValue runtimeExcJson
         * @property {string|null} [err] ErrorValue err
         */

        /**
         * Constructs a new ErrorValue.
         * @memberof common
         * @classdesc Represents an ErrorValue.
         * @implements IErrorValue
         * @constructor
         * @param {common.IErrorValue=} [properties] Properties to set
         */
        function ErrorValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ErrorValue runtimeExcJson.
         * @member {string} runtimeExcJson
         * @memberof common.ErrorValue
         * @instance
         */
        ErrorValue.prototype.runtimeExcJson = "";

        /**
         * ErrorValue err.
         * @member {string} err
         * @memberof common.ErrorValue
         * @instance
         */
        ErrorValue.prototype.err = "";

        /**
         * Creates a new ErrorValue instance using the specified properties.
         * @function create
         * @memberof common.ErrorValue
         * @static
         * @param {common.IErrorValue=} [properties] Properties to set
         * @returns {common.ErrorValue} ErrorValue instance
         */
        ErrorValue.create = function create(properties) {
            return new ErrorValue(properties);
        };

        /**
         * Encodes the specified ErrorValue message. Does not implicitly {@link common.ErrorValue.verify|verify} messages.
         * @function encode
         * @memberof common.ErrorValue
         * @static
         * @param {common.IErrorValue} message ErrorValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ErrorValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.runtimeExcJson != null && Object.hasOwnProperty.call(message, "runtimeExcJson"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.runtimeExcJson);
            if (message.err != null && Object.hasOwnProperty.call(message, "err"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.err);
            return writer;
        };

        /**
         * Encodes the specified ErrorValue message, length delimited. Does not implicitly {@link common.ErrorValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.ErrorValue
         * @static
         * @param {common.IErrorValue} message ErrorValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ErrorValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an ErrorValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.ErrorValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.ErrorValue} ErrorValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ErrorValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ErrorValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.runtimeExcJson = reader.string();
                        break;
                    }
                case 2: {
                        message.err = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an ErrorValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.ErrorValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.ErrorValue} ErrorValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ErrorValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an ErrorValue message.
         * @function verify
         * @memberof common.ErrorValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ErrorValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.runtimeExcJson != null && Object.hasOwnProperty.call(message, "runtimeExcJson"))
                if (!$util.isString(message.runtimeExcJson))
                    return "runtimeExcJson: string expected";
            if (message.err != null && Object.hasOwnProperty.call(message, "err"))
                if (!$util.isString(message.err))
                    return "err: string expected";
            return null;
        };

        /**
         * Creates an ErrorValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.ErrorValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.ErrorValue} ErrorValue
         */
        ErrorValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.ErrorValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.ErrorValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.ErrorValue();
            if (object.runtimeExcJson != null)
                message.runtimeExcJson = String(object.runtimeExcJson);
            if (object.err != null)
                message.err = String(object.err);
            return message;
        };

        /**
         * Creates a plain object from an ErrorValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.ErrorValue
         * @static
         * @param {common.ErrorValue} message ErrorValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ErrorValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.runtimeExcJson = "";
                object.err = "";
            }
            if (message.runtimeExcJson != null && Object.hasOwnProperty.call(message, "runtimeExcJson"))
                object.runtimeExcJson = message.runtimeExcJson;
            if (message.err != null && Object.hasOwnProperty.call(message, "err"))
                object.err = message.err;
            return object;
        };

        /**
         * Converts this ErrorValue to JSON.
         * @function toJSON
         * @memberof common.ErrorValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ErrorValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ErrorValue
         * @function getTypeUrl
         * @memberof common.ErrorValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ErrorValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.ErrorValue";
        };

        return ErrorValue;
    })();

    common.AnyValue = (function() {

        /**
         * Properties of an AnyValue.
         * @memberof common
         * @interface IAnyValue
         * @property {string|null} [type] AnyValue type
         * @property {common.IStringValue|null} [json] AnyValue json
         * @property {common.IBytesValue|null} [bytes] AnyValue bytes
         */

        /**
         * Constructs a new AnyValue.
         * @memberof common
         * @classdesc Represents an AnyValue.
         * @implements IAnyValue
         * @constructor
         * @param {common.IAnyValue=} [properties] Properties to set
         */
        function AnyValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * AnyValue type.
         * @member {string} type
         * @memberof common.AnyValue
         * @instance
         */
        AnyValue.prototype.type = "";

        /**
         * AnyValue json.
         * @member {common.IStringValue|null|undefined} json
         * @memberof common.AnyValue
         * @instance
         */
        AnyValue.prototype.json = null;

        /**
         * AnyValue bytes.
         * @member {common.IBytesValue|null|undefined} bytes
         * @memberof common.AnyValue
         * @instance
         */
        AnyValue.prototype.bytes = null;

        /**
         * Creates a new AnyValue instance using the specified properties.
         * @function create
         * @memberof common.AnyValue
         * @static
         * @param {common.IAnyValue=} [properties] Properties to set
         * @returns {common.AnyValue} AnyValue instance
         */
        AnyValue.create = function create(properties) {
            return new AnyValue(properties);
        };

        /**
         * Encodes the specified AnyValue message. Does not implicitly {@link common.AnyValue.verify|verify} messages.
         * @function encode
         * @memberof common.AnyValue
         * @static
         * @param {common.IAnyValue} message AnyValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AnyValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.type);
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified AnyValue message, length delimited. Does not implicitly {@link common.AnyValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.AnyValue
         * @static
         * @param {common.IAnyValue} message AnyValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AnyValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an AnyValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.AnyValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.AnyValue} AnyValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AnyValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.AnyValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.type = reader.string();
                        break;
                    }
                case 2: {
                        message.json = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an AnyValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.AnyValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.AnyValue} AnyValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AnyValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an AnyValue message.
         * @function verify
         * @memberof common.AnyValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        AnyValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.json != null && Object.hasOwnProperty.call(message, "json")) {
                var error = $root.common.StringValue.verify(message.json, long + 1);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes, long + 1);
                if (error)
                    return "bytes." + error;
            }
            return null;
        };

        /**
         * Creates an AnyValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.AnyValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.AnyValue} AnyValue
         */
        AnyValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.AnyValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.AnyValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.AnyValue();
            if (object.type != null)
                message.type = String(object.type);
            if (object.json != null) {
                if (!$util.isObject(object.json))
                    throw TypeError(".common.AnyValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json, long + 1);
            }
            if (object.bytes != null) {
                if (!$util.isObject(object.bytes))
                    throw TypeError(".common.AnyValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an AnyValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.AnyValue
         * @static
         * @param {common.AnyValue} message AnyValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        AnyValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.json = null;
                object.bytes = null;
            }
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                object.type = message.type;
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = $root.common.StringValue.toObject(message.json, options, q + 1);
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options, q + 1);
            return object;
        };

        /**
         * Converts this AnyValue to JSON.
         * @function toJSON
         * @memberof common.AnyValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        AnyValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for AnyValue
         * @function getTypeUrl
         * @memberof common.AnyValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        AnyValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.AnyValue";
        };

        return AnyValue;
    })();

    return common;
})();

module.exports = $root;

},{"protobufjs/minimal":84}],78:[function(require,module,exports){
/*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.storage = (function() {

    /**
     * Namespace storage.
     * @exports storage
     * @namespace
     */
    var storage = {};

    storage.GetAppLocalFSRequestBody = (function() {

        /**
         * Properties of a GetAppLocalFSRequestBody.
         * @memberof storage
         * @interface IGetAppLocalFSRequestBody
         * @property {common.IStringValue|null} [appName] GetAppLocalFSRequestBody appName
         */

        /**
         * Constructs a new GetAppLocalFSRequestBody.
         * @memberof storage
         * @classdesc Represents a GetAppLocalFSRequestBody.
         * @implements IGetAppLocalFSRequestBody
         * @constructor
         * @param {storage.IGetAppLocalFSRequestBody=} [properties] Properties to set
         */
        function GetAppLocalFSRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * GetAppLocalFSRequestBody appName.
         * @member {common.IStringValue|null|undefined} appName
         * @memberof storage.GetAppLocalFSRequestBody
         * @instance
         */
        GetAppLocalFSRequestBody.prototype.appName = null;

        /**
         * Creates a new GetAppLocalFSRequestBody instance using the specified properties.
         * @function create
         * @memberof storage.GetAppLocalFSRequestBody
         * @static
         * @param {storage.IGetAppLocalFSRequestBody=} [properties] Properties to set
         * @returns {storage.GetAppLocalFSRequestBody} GetAppLocalFSRequestBody instance
         */
        GetAppLocalFSRequestBody.create = function create(properties) {
            return new GetAppLocalFSRequestBody(properties);
        };

        /**
         * Encodes the specified GetAppLocalFSRequestBody message. Does not implicitly {@link storage.GetAppLocalFSRequestBody.verify|verify} messages.
         * @function encode
         * @memberof storage.GetAppLocalFSRequestBody
         * @static
         * @param {storage.IGetAppLocalFSRequestBody} message GetAppLocalFSRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        GetAppLocalFSRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.appName != null && Object.hasOwnProperty.call(message, "appName"))
                $root.common.StringValue.encode(message.appName, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified GetAppLocalFSRequestBody message, length delimited. Does not implicitly {@link storage.GetAppLocalFSRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof storage.GetAppLocalFSRequestBody
         * @static
         * @param {storage.IGetAppLocalFSRequestBody} message GetAppLocalFSRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        GetAppLocalFSRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a GetAppLocalFSRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof storage.GetAppLocalFSRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {storage.GetAppLocalFSRequestBody} GetAppLocalFSRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        GetAppLocalFSRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.storage.GetAppLocalFSRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.appName = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a GetAppLocalFSRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof storage.GetAppLocalFSRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {storage.GetAppLocalFSRequestBody} GetAppLocalFSRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        GetAppLocalFSRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a GetAppLocalFSRequestBody message.
         * @function verify
         * @memberof storage.GetAppLocalFSRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        GetAppLocalFSRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.appName != null && Object.hasOwnProperty.call(message, "appName")) {
                var error = $root.common.StringValue.verify(message.appName, long + 1);
                if (error)
                    return "appName." + error;
            }
            return null;
        };

        /**
         * Creates a GetAppLocalFSRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof storage.GetAppLocalFSRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {storage.GetAppLocalFSRequestBody} GetAppLocalFSRequestBody
         */
        GetAppLocalFSRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.storage.GetAppLocalFSRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".storage.GetAppLocalFSRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.storage.GetAppLocalFSRequestBody();
            if (object.appName != null) {
                if (!$util.isObject(object.appName))
                    throw TypeError(".storage.GetAppLocalFSRequestBody.appName: object expected");
                message.appName = $root.common.StringValue.fromObject(object.appName, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a GetAppLocalFSRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof storage.GetAppLocalFSRequestBody
         * @static
         * @param {storage.GetAppLocalFSRequestBody} message GetAppLocalFSRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        GetAppLocalFSRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.appName = null;
            if (message.appName != null && Object.hasOwnProperty.call(message, "appName"))
                object.appName = $root.common.StringValue.toObject(message.appName, options, q + 1);
            return object;
        };

        /**
         * Converts this GetAppLocalFSRequestBody to JSON.
         * @function toJSON
         * @memberof storage.GetAppLocalFSRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        GetAppLocalFSRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for GetAppLocalFSRequestBody
         * @function getTypeUrl
         * @memberof storage.GetAppLocalFSRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        GetAppLocalFSRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/storage.GetAppLocalFSRequestBody";
        };

        return GetAppLocalFSRequestBody;
    })();

    storage.GetAppSyncedFSRequestBody = (function() {

        /**
         * Properties of a GetAppSyncedFSRequestBody.
         * @memberof storage
         * @interface IGetAppSyncedFSRequestBody
         * @property {common.IStringValue|null} [appName] GetAppSyncedFSRequestBody appName
         */

        /**
         * Constructs a new GetAppSyncedFSRequestBody.
         * @memberof storage
         * @classdesc Represents a GetAppSyncedFSRequestBody.
         * @implements IGetAppSyncedFSRequestBody
         * @constructor
         * @param {storage.IGetAppSyncedFSRequestBody=} [properties] Properties to set
         */
        function GetAppSyncedFSRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * GetAppSyncedFSRequestBody appName.
         * @member {common.IStringValue|null|undefined} appName
         * @memberof storage.GetAppSyncedFSRequestBody
         * @instance
         */
        GetAppSyncedFSRequestBody.prototype.appName = null;

        /**
         * Creates a new GetAppSyncedFSRequestBody instance using the specified properties.
         * @function create
         * @memberof storage.GetAppSyncedFSRequestBody
         * @static
         * @param {storage.IGetAppSyncedFSRequestBody=} [properties] Properties to set
         * @returns {storage.GetAppSyncedFSRequestBody} GetAppSyncedFSRequestBody instance
         */
        GetAppSyncedFSRequestBody.create = function create(properties) {
            return new GetAppSyncedFSRequestBody(properties);
        };

        /**
         * Encodes the specified GetAppSyncedFSRequestBody message. Does not implicitly {@link storage.GetAppSyncedFSRequestBody.verify|verify} messages.
         * @function encode
         * @memberof storage.GetAppSyncedFSRequestBody
         * @static
         * @param {storage.IGetAppSyncedFSRequestBody} message GetAppSyncedFSRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        GetAppSyncedFSRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.appName != null && Object.hasOwnProperty.call(message, "appName"))
                $root.common.StringValue.encode(message.appName, writer.uint32(/* id 1, wireType 2 =*/10).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified GetAppSyncedFSRequestBody message, length delimited. Does not implicitly {@link storage.GetAppSyncedFSRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof storage.GetAppSyncedFSRequestBody
         * @static
         * @param {storage.IGetAppSyncedFSRequestBody} message GetAppSyncedFSRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        GetAppSyncedFSRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a GetAppSyncedFSRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof storage.GetAppSyncedFSRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {storage.GetAppSyncedFSRequestBody} GetAppSyncedFSRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        GetAppSyncedFSRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.storage.GetAppSyncedFSRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.appName = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a GetAppSyncedFSRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof storage.GetAppSyncedFSRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {storage.GetAppSyncedFSRequestBody} GetAppSyncedFSRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        GetAppSyncedFSRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a GetAppSyncedFSRequestBody message.
         * @function verify
         * @memberof storage.GetAppSyncedFSRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        GetAppSyncedFSRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.appName != null && Object.hasOwnProperty.call(message, "appName")) {
                var error = $root.common.StringValue.verify(message.appName, long + 1);
                if (error)
                    return "appName." + error;
            }
            return null;
        };

        /**
         * Creates a GetAppSyncedFSRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof storage.GetAppSyncedFSRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {storage.GetAppSyncedFSRequestBody} GetAppSyncedFSRequestBody
         */
        GetAppSyncedFSRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.storage.GetAppSyncedFSRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".storage.GetAppSyncedFSRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.storage.GetAppSyncedFSRequestBody();
            if (object.appName != null) {
                if (!$util.isObject(object.appName))
                    throw TypeError(".storage.GetAppSyncedFSRequestBody.appName: object expected");
                message.appName = $root.common.StringValue.fromObject(object.appName, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a GetAppSyncedFSRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof storage.GetAppSyncedFSRequestBody
         * @static
         * @param {storage.GetAppSyncedFSRequestBody} message GetAppSyncedFSRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        GetAppSyncedFSRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.appName = null;
            if (message.appName != null && Object.hasOwnProperty.call(message, "appName"))
                object.appName = $root.common.StringValue.toObject(message.appName, options, q + 1);
            return object;
        };

        /**
         * Converts this GetAppSyncedFSRequestBody to JSON.
         * @function toJSON
         * @memberof storage.GetAppSyncedFSRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        GetAppSyncedFSRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for GetAppSyncedFSRequestBody
         * @function getTypeUrl
         * @memberof storage.GetAppSyncedFSRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        GetAppSyncedFSRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/storage.GetAppSyncedFSRequestBody";
        };

        return GetAppSyncedFSRequestBody;
    })();

    storage.GetUserFSRequestBody = (function() {

        /**
         * Properties of a GetUserFSRequestBody.
         * @memberof storage
         * @interface IGetUserFSRequestBody
         * @property {string|null} [type] GetUserFSRequestBody type
         * @property {common.IStringValue|null} [path] GetUserFSRequestBody path
         */

        /**
         * Constructs a new GetUserFSRequestBody.
         * @memberof storage
         * @classdesc Represents a GetUserFSRequestBody.
         * @implements IGetUserFSRequestBody
         * @constructor
         * @param {storage.IGetUserFSRequestBody=} [properties] Properties to set
         */
        function GetUserFSRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * GetUserFSRequestBody type.
         * @member {string} type
         * @memberof storage.GetUserFSRequestBody
         * @instance
         */
        GetUserFSRequestBody.prototype.type = "";

        /**
         * GetUserFSRequestBody path.
         * @member {common.IStringValue|null|undefined} path
         * @memberof storage.GetUserFSRequestBody
         * @instance
         */
        GetUserFSRequestBody.prototype.path = null;

        /**
         * Creates a new GetUserFSRequestBody instance using the specified properties.
         * @function create
         * @memberof storage.GetUserFSRequestBody
         * @static
         * @param {storage.IGetUserFSRequestBody=} [properties] Properties to set
         * @returns {storage.GetUserFSRequestBody} GetUserFSRequestBody instance
         */
        GetUserFSRequestBody.create = function create(properties) {
            return new GetUserFSRequestBody(properties);
        };

        /**
         * Encodes the specified GetUserFSRequestBody message. Does not implicitly {@link storage.GetUserFSRequestBody.verify|verify} messages.
         * @function encode
         * @memberof storage.GetUserFSRequestBody
         * @static
         * @param {storage.IGetUserFSRequestBody} message GetUserFSRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        GetUserFSRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.type);
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                $root.common.StringValue.encode(message.path, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified GetUserFSRequestBody message, length delimited. Does not implicitly {@link storage.GetUserFSRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof storage.GetUserFSRequestBody
         * @static
         * @param {storage.IGetUserFSRequestBody} message GetUserFSRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        GetUserFSRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a GetUserFSRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof storage.GetUserFSRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {storage.GetUserFSRequestBody} GetUserFSRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        GetUserFSRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.storage.GetUserFSRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.type = reader.string();
                        break;
                    }
                case 2: {
                        message.path = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a GetUserFSRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof storage.GetUserFSRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {storage.GetUserFSRequestBody} GetUserFSRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        GetUserFSRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a GetUserFSRequestBody message.
         * @function verify
         * @memberof storage.GetUserFSRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        GetUserFSRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.path != null && Object.hasOwnProperty.call(message, "path")) {
                var error = $root.common.StringValue.verify(message.path, long + 1);
                if (error)
                    return "path." + error;
            }
            return null;
        };

        /**
         * Creates a GetUserFSRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof storage.GetUserFSRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {storage.GetUserFSRequestBody} GetUserFSRequestBody
         */
        GetUserFSRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.storage.GetUserFSRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".storage.GetUserFSRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.storage.GetUserFSRequestBody();
            if (object.type != null)
                message.type = String(object.type);
            if (object.path != null) {
                if (!$util.isObject(object.path))
                    throw TypeError(".storage.GetUserFSRequestBody.path: object expected");
                message.path = $root.common.StringValue.fromObject(object.path, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a GetUserFSRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof storage.GetUserFSRequestBody
         * @static
         * @param {storage.GetUserFSRequestBody} message GetUserFSRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        GetUserFSRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.path = null;
            }
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                object.type = message.type;
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = $root.common.StringValue.toObject(message.path, options, q + 1);
            return object;
        };

        /**
         * Converts this GetUserFSRequestBody to JSON.
         * @function toJSON
         * @memberof storage.GetUserFSRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        GetUserFSRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for GetUserFSRequestBody
         * @function getTypeUrl
         * @memberof storage.GetUserFSRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        GetUserFSRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/storage.GetUserFSRequestBody";
        };

        return GetUserFSRequestBody;
    })();

    storage.GetSysFSRequestBody = (function() {

        /**
         * Properties of a GetSysFSRequestBody.
         * @memberof storage
         * @interface IGetSysFSRequestBody
         * @property {string|null} [type] GetSysFSRequestBody type
         * @property {common.IStringValue|null} [path] GetSysFSRequestBody path
         */

        /**
         * Constructs a new GetSysFSRequestBody.
         * @memberof storage
         * @classdesc Represents a GetSysFSRequestBody.
         * @implements IGetSysFSRequestBody
         * @constructor
         * @param {storage.IGetSysFSRequestBody=} [properties] Properties to set
         */
        function GetSysFSRequestBody(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * GetSysFSRequestBody type.
         * @member {string} type
         * @memberof storage.GetSysFSRequestBody
         * @instance
         */
        GetSysFSRequestBody.prototype.type = "";

        /**
         * GetSysFSRequestBody path.
         * @member {common.IStringValue|null|undefined} path
         * @memberof storage.GetSysFSRequestBody
         * @instance
         */
        GetSysFSRequestBody.prototype.path = null;

        /**
         * Creates a new GetSysFSRequestBody instance using the specified properties.
         * @function create
         * @memberof storage.GetSysFSRequestBody
         * @static
         * @param {storage.IGetSysFSRequestBody=} [properties] Properties to set
         * @returns {storage.GetSysFSRequestBody} GetSysFSRequestBody instance
         */
        GetSysFSRequestBody.create = function create(properties) {
            return new GetSysFSRequestBody(properties);
        };

        /**
         * Encodes the specified GetSysFSRequestBody message. Does not implicitly {@link storage.GetSysFSRequestBody.verify|verify} messages.
         * @function encode
         * @memberof storage.GetSysFSRequestBody
         * @static
         * @param {storage.IGetSysFSRequestBody} message GetSysFSRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        GetSysFSRequestBody.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.type);
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                $root.common.StringValue.encode(message.path, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified GetSysFSRequestBody message, length delimited. Does not implicitly {@link storage.GetSysFSRequestBody.verify|verify} messages.
         * @function encodeDelimited
         * @memberof storage.GetSysFSRequestBody
         * @static
         * @param {storage.IGetSysFSRequestBody} message GetSysFSRequestBody message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        GetSysFSRequestBody.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a GetSysFSRequestBody message from the specified reader or buffer.
         * @function decode
         * @memberof storage.GetSysFSRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {storage.GetSysFSRequestBody} GetSysFSRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        GetSysFSRequestBody.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.storage.GetSysFSRequestBody();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.type = reader.string();
                        break;
                    }
                case 2: {
                        message.path = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a GetSysFSRequestBody message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof storage.GetSysFSRequestBody
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {storage.GetSysFSRequestBody} GetSysFSRequestBody
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        GetSysFSRequestBody.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a GetSysFSRequestBody message.
         * @function verify
         * @memberof storage.GetSysFSRequestBody
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        GetSysFSRequestBody.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.path != null && Object.hasOwnProperty.call(message, "path")) {
                var error = $root.common.StringValue.verify(message.path, long + 1);
                if (error)
                    return "path." + error;
            }
            return null;
        };

        /**
         * Creates a GetSysFSRequestBody message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof storage.GetSysFSRequestBody
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {storage.GetSysFSRequestBody} GetSysFSRequestBody
         */
        GetSysFSRequestBody.fromObject = function fromObject(object, long) {
            if (object instanceof $root.storage.GetSysFSRequestBody)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".storage.GetSysFSRequestBody: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.storage.GetSysFSRequestBody();
            if (object.type != null)
                message.type = String(object.type);
            if (object.path != null) {
                if (!$util.isObject(object.path))
                    throw TypeError(".storage.GetSysFSRequestBody.path: object expected");
                message.path = $root.common.StringValue.fromObject(object.path, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from a GetSysFSRequestBody message. Also converts values to other types if specified.
         * @function toObject
         * @memberof storage.GetSysFSRequestBody
         * @static
         * @param {storage.GetSysFSRequestBody} message GetSysFSRequestBody
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        GetSysFSRequestBody.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.path = null;
            }
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                object.type = message.type;
            if (message.path != null && Object.hasOwnProperty.call(message, "path"))
                object.path = $root.common.StringValue.toObject(message.path, options, q + 1);
            return object;
        };

        /**
         * Converts this GetSysFSRequestBody to JSON.
         * @function toJSON
         * @memberof storage.GetSysFSRequestBody
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        GetSysFSRequestBody.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for GetSysFSRequestBody
         * @function getTypeUrl
         * @memberof storage.GetSysFSRequestBody
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        GetSysFSRequestBody.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/storage.GetSysFSRequestBody";
        };

        return GetSysFSRequestBody;
    })();

    return storage;
})();

$root.common = (function() {

    /**
     * Namespace common.
     * @exports common
     * @namespace
     */
    var common = {};

    common.ObjectReference = (function() {

        /**
         * Properties of an ObjectReference.
         * @memberof common
         * @interface IObjectReference
         * @property {string|null} [objType] ObjectReference objType
         * @property {Array.<string>|null} [path] ObjectReference path
         */

        /**
         * Constructs a new ObjectReference.
         * @memberof common
         * @classdesc Represents an ObjectReference.
         * @implements IObjectReference
         * @constructor
         * @param {common.IObjectReference=} [properties] Properties to set
         */
        function ObjectReference(properties) {
            this.path = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ObjectReference objType.
         * @member {string} objType
         * @memberof common.ObjectReference
         * @instance
         */
        ObjectReference.prototype.objType = "";

        /**
         * ObjectReference path.
         * @member {Array.<string>} path
         * @memberof common.ObjectReference
         * @instance
         */
        ObjectReference.prototype.path = $util.emptyArray;

        /**
         * Creates a new ObjectReference instance using the specified properties.
         * @function create
         * @memberof common.ObjectReference
         * @static
         * @param {common.IObjectReference=} [properties] Properties to set
         * @returns {common.ObjectReference} ObjectReference instance
         */
        ObjectReference.create = function create(properties) {
            return new ObjectReference(properties);
        };

        /**
         * Encodes the specified ObjectReference message. Does not implicitly {@link common.ObjectReference.verify|verify} messages.
         * @function encode
         * @memberof common.ObjectReference
         * @static
         * @param {common.IObjectReference} message ObjectReference message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ObjectReference.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.objType != null && Object.hasOwnProperty.call(message, "objType"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.objType);
            if (message.path != null && message.path.length)
                for (var i = 0; i < message.path.length; ++i)
                    writer.uint32(/* id 2, wireType 2 =*/18).string(message.path[i]);
            return writer;
        };

        /**
         * Encodes the specified ObjectReference message, length delimited. Does not implicitly {@link common.ObjectReference.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.ObjectReference
         * @static
         * @param {common.IObjectReference} message ObjectReference message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ObjectReference.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an ObjectReference message from the specified reader or buffer.
         * @function decode
         * @memberof common.ObjectReference
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.ObjectReference} ObjectReference
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ObjectReference.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ObjectReference();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.objType = reader.string();
                        break;
                    }
                case 2: {
                        if (!(message.path && message.path.length))
                            message.path = [];
                        message.path.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an ObjectReference message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.ObjectReference
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.ObjectReference} ObjectReference
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ObjectReference.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an ObjectReference message.
         * @function verify
         * @memberof common.ObjectReference
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ObjectReference.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.objType != null && Object.hasOwnProperty.call(message, "objType"))
                if (!$util.isString(message.objType))
                    return "objType: string expected";
            if (message.path != null && Object.hasOwnProperty.call(message, "path")) {
                if (!Array.isArray(message.path))
                    return "path: array expected";
                for (var i = 0; i < message.path.length; ++i)
                    if (!$util.isString(message.path[i]))
                        return "path: string[] expected";
            }
            return null;
        };

        /**
         * Creates an ObjectReference message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.ObjectReference
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.ObjectReference} ObjectReference
         */
        ObjectReference.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.ObjectReference)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.ObjectReference: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.ObjectReference();
            if (object.objType != null)
                message.objType = String(object.objType);
            if (object.path) {
                if (!Array.isArray(object.path))
                    throw TypeError(".common.ObjectReference.path: array expected");
                message.path = [];
                for (var i = 0; i < object.path.length; ++i)
                    message.path[i] = String(object.path[i]);
            }
            return message;
        };

        /**
         * Creates a plain object from an ObjectReference message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.ObjectReference
         * @static
         * @param {common.ObjectReference} message ObjectReference
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ObjectReference.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.path = [];
            if (options.defaults)
                object.objType = "";
            if (message.objType != null && Object.hasOwnProperty.call(message, "objType"))
                object.objType = message.objType;
            if (message.path && message.path.length) {
                object.path = [];
                for (var j = 0; j < message.path.length; ++j)
                    object.path[j] = message.path[j];
            }
            return object;
        };

        /**
         * Converts this ObjectReference to JSON.
         * @function toJSON
         * @memberof common.ObjectReference
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ObjectReference.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ObjectReference
         * @function getTypeUrl
         * @memberof common.ObjectReference
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ObjectReference.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.ObjectReference";
        };

        return ObjectReference;
    })();

    common.BooleanValue = (function() {

        /**
         * Properties of a BooleanValue.
         * @memberof common
         * @interface IBooleanValue
         * @property {boolean|null} [value] BooleanValue value
         */

        /**
         * Constructs a new BooleanValue.
         * @memberof common
         * @classdesc Represents a BooleanValue.
         * @implements IBooleanValue
         * @constructor
         * @param {common.IBooleanValue=} [properties] Properties to set
         */
        function BooleanValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * BooleanValue value.
         * @member {boolean} value
         * @memberof common.BooleanValue
         * @instance
         */
        BooleanValue.prototype.value = false;

        /**
         * Creates a new BooleanValue instance using the specified properties.
         * @function create
         * @memberof common.BooleanValue
         * @static
         * @param {common.IBooleanValue=} [properties] Properties to set
         * @returns {common.BooleanValue} BooleanValue instance
         */
        BooleanValue.create = function create(properties) {
            return new BooleanValue(properties);
        };

        /**
         * Encodes the specified BooleanValue message. Does not implicitly {@link common.BooleanValue.verify|verify} messages.
         * @function encode
         * @memberof common.BooleanValue
         * @static
         * @param {common.IBooleanValue} message BooleanValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BooleanValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 0 =*/8).bool(message.value);
            return writer;
        };

        /**
         * Encodes the specified BooleanValue message, length delimited. Does not implicitly {@link common.BooleanValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.BooleanValue
         * @static
         * @param {common.IBooleanValue} message BooleanValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BooleanValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a BooleanValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.BooleanValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.BooleanValue} BooleanValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BooleanValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BooleanValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.bool();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a BooleanValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.BooleanValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.BooleanValue} BooleanValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BooleanValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a BooleanValue message.
         * @function verify
         * @memberof common.BooleanValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        BooleanValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (typeof message.value !== "boolean")
                    return "value: boolean expected";
            return null;
        };

        /**
         * Creates a BooleanValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.BooleanValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.BooleanValue} BooleanValue
         */
        BooleanValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.BooleanValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.BooleanValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.BooleanValue();
            if (object.value != null)
                message.value = Boolean(object.value);
            return message;
        };

        /**
         * Creates a plain object from a BooleanValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.BooleanValue
         * @static
         * @param {common.BooleanValue} message BooleanValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        BooleanValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.value = false;
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = message.value;
            return object;
        };

        /**
         * Converts this BooleanValue to JSON.
         * @function toJSON
         * @memberof common.BooleanValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        BooleanValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for BooleanValue
         * @function getTypeUrl
         * @memberof common.BooleanValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        BooleanValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.BooleanValue";
        };

        return BooleanValue;
    })();

    common.StringArrayValue = (function() {

        /**
         * Properties of a StringArrayValue.
         * @memberof common
         * @interface IStringArrayValue
         * @property {Array.<string>|null} [values] StringArrayValue values
         */

        /**
         * Constructs a new StringArrayValue.
         * @memberof common
         * @classdesc Represents a StringArrayValue.
         * @implements IStringArrayValue
         * @constructor
         * @param {common.IStringArrayValue=} [properties] Properties to set
         */
        function StringArrayValue(properties) {
            this.values = [];
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * StringArrayValue values.
         * @member {Array.<string>} values
         * @memberof common.StringArrayValue
         * @instance
         */
        StringArrayValue.prototype.values = $util.emptyArray;

        /**
         * Creates a new StringArrayValue instance using the specified properties.
         * @function create
         * @memberof common.StringArrayValue
         * @static
         * @param {common.IStringArrayValue=} [properties] Properties to set
         * @returns {common.StringArrayValue} StringArrayValue instance
         */
        StringArrayValue.create = function create(properties) {
            return new StringArrayValue(properties);
        };

        /**
         * Encodes the specified StringArrayValue message. Does not implicitly {@link common.StringArrayValue.verify|verify} messages.
         * @function encode
         * @memberof common.StringArrayValue
         * @static
         * @param {common.IStringArrayValue} message StringArrayValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringArrayValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.values != null && message.values.length)
                for (var i = 0; i < message.values.length; ++i)
                    writer.uint32(/* id 1, wireType 2 =*/10).string(message.values[i]);
            return writer;
        };

        /**
         * Encodes the specified StringArrayValue message, length delimited. Does not implicitly {@link common.StringArrayValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.StringArrayValue
         * @static
         * @param {common.IStringArrayValue} message StringArrayValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringArrayValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a StringArrayValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.StringArrayValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.StringArrayValue} StringArrayValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringArrayValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringArrayValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        if (!(message.values && message.values.length))
                            message.values = [];
                        message.values.push(reader.string());
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a StringArrayValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.StringArrayValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.StringArrayValue} StringArrayValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringArrayValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a StringArrayValue message.
         * @function verify
         * @memberof common.StringArrayValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        StringArrayValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.values != null && Object.hasOwnProperty.call(message, "values")) {
                if (!Array.isArray(message.values))
                    return "values: array expected";
                for (var i = 0; i < message.values.length; ++i)
                    if (!$util.isString(message.values[i]))
                        return "values: string[] expected";
            }
            return null;
        };

        /**
         * Creates a StringArrayValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.StringArrayValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.StringArrayValue} StringArrayValue
         */
        StringArrayValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.StringArrayValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.StringArrayValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.StringArrayValue();
            if (object.values) {
                if (!Array.isArray(object.values))
                    throw TypeError(".common.StringArrayValue.values: array expected");
                message.values = [];
                for (var i = 0; i < object.values.length; ++i)
                    message.values[i] = String(object.values[i]);
            }
            return message;
        };

        /**
         * Creates a plain object from a StringArrayValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.StringArrayValue
         * @static
         * @param {common.StringArrayValue} message StringArrayValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        StringArrayValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.arrays || options.defaults)
                object.values = [];
            if (message.values && message.values.length) {
                object.values = [];
                for (var j = 0; j < message.values.length; ++j)
                    object.values[j] = message.values[j];
            }
            return object;
        };

        /**
         * Converts this StringArrayValue to JSON.
         * @function toJSON
         * @memberof common.StringArrayValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        StringArrayValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for StringArrayValue
         * @function getTypeUrl
         * @memberof common.StringArrayValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        StringArrayValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.StringArrayValue";
        };

        return StringArrayValue;
    })();

    common.UInt64Value = (function() {

        /**
         * Properties of a UInt64Value.
         * @memberof common
         * @interface IUInt64Value
         * @property {number|Long|null} [value] UInt64Value value
         */

        /**
         * Constructs a new UInt64Value.
         * @memberof common
         * @classdesc Represents a UInt64Value.
         * @implements IUInt64Value
         * @constructor
         * @param {common.IUInt64Value=} [properties] Properties to set
         */
        function UInt64Value(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * UInt64Value value.
         * @member {number|Long} value
         * @memberof common.UInt64Value
         * @instance
         */
        UInt64Value.prototype.value = $util.Long ? $util.Long.fromBits(0,0,true) : 0;

        /**
         * Creates a new UInt64Value instance using the specified properties.
         * @function create
         * @memberof common.UInt64Value
         * @static
         * @param {common.IUInt64Value=} [properties] Properties to set
         * @returns {common.UInt64Value} UInt64Value instance
         */
        UInt64Value.create = function create(properties) {
            return new UInt64Value(properties);
        };

        /**
         * Encodes the specified UInt64Value message. Does not implicitly {@link common.UInt64Value.verify|verify} messages.
         * @function encode
         * @memberof common.UInt64Value
         * @static
         * @param {common.IUInt64Value} message UInt64Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt64Value.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.value);
            return writer;
        };

        /**
         * Encodes the specified UInt64Value message, length delimited. Does not implicitly {@link common.UInt64Value.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.UInt64Value
         * @static
         * @param {common.IUInt64Value} message UInt64Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt64Value.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a UInt64Value message from the specified reader or buffer.
         * @function decode
         * @memberof common.UInt64Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.UInt64Value} UInt64Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt64Value.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt64Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.uint64();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a UInt64Value message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.UInt64Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.UInt64Value} UInt64Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt64Value.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a UInt64Value message.
         * @function verify
         * @memberof common.UInt64Value
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        UInt64Value.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!$util.isInteger(message.value) && !(message.value && $util.isInteger(message.value.low) && $util.isInteger(message.value.high)))
                    return "value: integer|Long expected";
            return null;
        };

        /**
         * Creates a UInt64Value message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.UInt64Value
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.UInt64Value} UInt64Value
         */
        UInt64Value.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.UInt64Value)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.UInt64Value: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.UInt64Value();
            if (object.value != null)
                if ($util.Long)
                    message.value = $util.Long.fromValue(object.value, true);
                else if (typeof object.value === "string")
                    message.value = parseInt(object.value, 10);
                else if (typeof object.value === "number")
                    message.value = object.value;
                else if (typeof object.value === "object")
                    message.value = new $util.LongBits(object.value.low >>> 0, object.value.high >>> 0).toNumber(true);
            return message;
        };

        /**
         * Creates a plain object from a UInt64Value message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.UInt64Value
         * @static
         * @param {common.UInt64Value} message UInt64Value
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        UInt64Value.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if ($util.Long) {
                    var long = new $util.Long(0, 0, true);
                    object.value = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : typeof BigInt !== "undefined" && options.longs === BigInt ? long.toBigInt() : long;
                } else
                    object.value = options.longs === String ? "0" : typeof BigInt !== "undefined" && options.longs === BigInt ? BigInt("0") : 0;
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (typeof BigInt !== "undefined" && options.longs === BigInt)
                    object.value = typeof message.value === "number" ? BigInt(message.value) : $util.Long.fromBits(message.value.low >>> 0, message.value.high >>> 0, true).toBigInt();
                else if (typeof message.value === "number")
                    object.value = options.longs === String ? String(message.value) : message.value;
                else
                    object.value = options.longs === String ? $util.Long.prototype.toString.call(message.value) : options.longs === Number ? new $util.LongBits(message.value.low >>> 0, message.value.high >>> 0).toNumber(true) : message.value;
            return object;
        };

        /**
         * Converts this UInt64Value to JSON.
         * @function toJSON
         * @memberof common.UInt64Value
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        UInt64Value.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for UInt64Value
         * @function getTypeUrl
         * @memberof common.UInt64Value
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        UInt64Value.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.UInt64Value";
        };

        return UInt64Value;
    })();

    common.UInt32Value = (function() {

        /**
         * Properties of a UInt32Value.
         * @memberof common
         * @interface IUInt32Value
         * @property {number|null} [value] UInt32Value value
         */

        /**
         * Constructs a new UInt32Value.
         * @memberof common
         * @classdesc Represents a UInt32Value.
         * @implements IUInt32Value
         * @constructor
         * @param {common.IUInt32Value=} [properties] Properties to set
         */
        function UInt32Value(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * UInt32Value value.
         * @member {number} value
         * @memberof common.UInt32Value
         * @instance
         */
        UInt32Value.prototype.value = 0;

        /**
         * Creates a new UInt32Value instance using the specified properties.
         * @function create
         * @memberof common.UInt32Value
         * @static
         * @param {common.IUInt32Value=} [properties] Properties to set
         * @returns {common.UInt32Value} UInt32Value instance
         */
        UInt32Value.create = function create(properties) {
            return new UInt32Value(properties);
        };

        /**
         * Encodes the specified UInt32Value message. Does not implicitly {@link common.UInt32Value.verify|verify} messages.
         * @function encode
         * @memberof common.UInt32Value
         * @static
         * @param {common.IUInt32Value} message UInt32Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt32Value.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.value);
            return writer;
        };

        /**
         * Encodes the specified UInt32Value message, length delimited. Does not implicitly {@link common.UInt32Value.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.UInt32Value
         * @static
         * @param {common.IUInt32Value} message UInt32Value message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        UInt32Value.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a UInt32Value message from the specified reader or buffer.
         * @function decode
         * @memberof common.UInt32Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.UInt32Value} UInt32Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt32Value.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.UInt32Value();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.uint32();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a UInt32Value message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.UInt32Value
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.UInt32Value} UInt32Value
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        UInt32Value.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a UInt32Value message.
         * @function verify
         * @memberof common.UInt32Value
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        UInt32Value.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!$util.isInteger(message.value))
                    return "value: integer expected";
            return null;
        };

        /**
         * Creates a UInt32Value message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.UInt32Value
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.UInt32Value} UInt32Value
         */
        UInt32Value.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.UInt32Value)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.UInt32Value: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.UInt32Value();
            if (object.value != null)
                message.value = object.value >>> 0;
            return message;
        };

        /**
         * Creates a plain object from a UInt32Value message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.UInt32Value
         * @static
         * @param {common.UInt32Value} message UInt32Value
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        UInt32Value.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.value = 0;
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = message.value;
            return object;
        };

        /**
         * Converts this UInt32Value to JSON.
         * @function toJSON
         * @memberof common.UInt32Value
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        UInt32Value.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for UInt32Value
         * @function getTypeUrl
         * @memberof common.UInt32Value
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        UInt32Value.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.UInt32Value";
        };

        return UInt32Value;
    })();

    common.StringValue = (function() {

        /**
         * Properties of a StringValue.
         * @memberof common
         * @interface IStringValue
         * @property {string|null} [value] StringValue value
         */

        /**
         * Constructs a new StringValue.
         * @memberof common
         * @classdesc Represents a StringValue.
         * @implements IStringValue
         * @constructor
         * @param {common.IStringValue=} [properties] Properties to set
         */
        function StringValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * StringValue value.
         * @member {string} value
         * @memberof common.StringValue
         * @instance
         */
        StringValue.prototype.value = "";

        /**
         * Creates a new StringValue instance using the specified properties.
         * @function create
         * @memberof common.StringValue
         * @static
         * @param {common.IStringValue=} [properties] Properties to set
         * @returns {common.StringValue} StringValue instance
         */
        StringValue.create = function create(properties) {
            return new StringValue(properties);
        };

        /**
         * Encodes the specified StringValue message. Does not implicitly {@link common.StringValue.verify|verify} messages.
         * @function encode
         * @memberof common.StringValue
         * @static
         * @param {common.IStringValue} message StringValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.value);
            return writer;
        };

        /**
         * Encodes the specified StringValue message, length delimited. Does not implicitly {@link common.StringValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.StringValue
         * @static
         * @param {common.IStringValue} message StringValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        StringValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a StringValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.StringValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.StringValue} StringValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.StringValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a StringValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.StringValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.StringValue} StringValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        StringValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a StringValue message.
         * @function verify
         * @memberof common.StringValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        StringValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!$util.isString(message.value))
                    return "value: string expected";
            return null;
        };

        /**
         * Creates a StringValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.StringValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.StringValue} StringValue
         */
        StringValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.StringValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.StringValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.StringValue();
            if (object.value != null)
                message.value = String(object.value);
            return message;
        };

        /**
         * Creates a plain object from a StringValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.StringValue
         * @static
         * @param {common.StringValue} message StringValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        StringValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                object.value = "";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = message.value;
            return object;
        };

        /**
         * Converts this StringValue to JSON.
         * @function toJSON
         * @memberof common.StringValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        StringValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for StringValue
         * @function getTypeUrl
         * @memberof common.StringValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        StringValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.StringValue";
        };

        return StringValue;
    })();

    common.BytesValue = (function() {

        /**
         * Properties of a BytesValue.
         * @memberof common
         * @interface IBytesValue
         * @property {Uint8Array|null} [value] BytesValue value
         */

        /**
         * Constructs a new BytesValue.
         * @memberof common
         * @classdesc Represents a BytesValue.
         * @implements IBytesValue
         * @constructor
         * @param {common.IBytesValue=} [properties] Properties to set
         */
        function BytesValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * BytesValue value.
         * @member {Uint8Array} value
         * @memberof common.BytesValue
         * @instance
         */
        BytesValue.prototype.value = $util.newBuffer([]);

        /**
         * Creates a new BytesValue instance using the specified properties.
         * @function create
         * @memberof common.BytesValue
         * @static
         * @param {common.IBytesValue=} [properties] Properties to set
         * @returns {common.BytesValue} BytesValue instance
         */
        BytesValue.create = function create(properties) {
            return new BytesValue(properties);
        };

        /**
         * Encodes the specified BytesValue message. Does not implicitly {@link common.BytesValue.verify|verify} messages.
         * @function encode
         * @memberof common.BytesValue
         * @static
         * @param {common.IBytesValue} message BytesValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BytesValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.value);
            return writer;
        };

        /**
         * Encodes the specified BytesValue message, length delimited. Does not implicitly {@link common.BytesValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.BytesValue
         * @static
         * @param {common.IBytesValue} message BytesValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        BytesValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes a BytesValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.BytesValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.BytesValue} BytesValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BytesValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.BytesValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.value = reader.bytes();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes a BytesValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.BytesValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.BytesValue} BytesValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        BytesValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies a BytesValue message.
         * @function verify
         * @memberof common.BytesValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        BytesValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                if (!(message.value && typeof message.value.length === "number" || $util.isString(message.value)))
                    return "value: buffer expected";
            return null;
        };

        /**
         * Creates a BytesValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.BytesValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.BytesValue} BytesValue
         */
        BytesValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.BytesValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.BytesValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.BytesValue();
            if (object.value != null)
                if (typeof object.value === "string")
                    $util.base64.decode(object.value, message.value = $util.newBuffer($util.base64.length(object.value)), 0);
                else if (object.value.length >= 0)
                    message.value = object.value;
            return message;
        };

        /**
         * Creates a plain object from a BytesValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.BytesValue
         * @static
         * @param {common.BytesValue} message BytesValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        BytesValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults)
                if (options.bytes === String)
                    object.value = "";
                else {
                    object.value = [];
                    if (options.bytes !== Array)
                        object.value = $util.newBuffer(object.value);
                }
            if (message.value != null && Object.hasOwnProperty.call(message, "value"))
                object.value = options.bytes === String ? $util.base64.encode(message.value, 0, message.value.length) : options.bytes === Array ? Array.prototype.slice.call(message.value) : message.value;
            return object;
        };

        /**
         * Converts this BytesValue to JSON.
         * @function toJSON
         * @memberof common.BytesValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        BytesValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for BytesValue
         * @function getTypeUrl
         * @memberof common.BytesValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        BytesValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.BytesValue";
        };

        return BytesValue;
    })();

    common.ErrorValue = (function() {

        /**
         * Properties of an ErrorValue.
         * @memberof common
         * @interface IErrorValue
         * @property {string|null} [runtimeExcJson] ErrorValue runtimeExcJson
         * @property {string|null} [err] ErrorValue err
         */

        /**
         * Constructs a new ErrorValue.
         * @memberof common
         * @classdesc Represents an ErrorValue.
         * @implements IErrorValue
         * @constructor
         * @param {common.IErrorValue=} [properties] Properties to set
         */
        function ErrorValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * ErrorValue runtimeExcJson.
         * @member {string} runtimeExcJson
         * @memberof common.ErrorValue
         * @instance
         */
        ErrorValue.prototype.runtimeExcJson = "";

        /**
         * ErrorValue err.
         * @member {string} err
         * @memberof common.ErrorValue
         * @instance
         */
        ErrorValue.prototype.err = "";

        /**
         * Creates a new ErrorValue instance using the specified properties.
         * @function create
         * @memberof common.ErrorValue
         * @static
         * @param {common.IErrorValue=} [properties] Properties to set
         * @returns {common.ErrorValue} ErrorValue instance
         */
        ErrorValue.create = function create(properties) {
            return new ErrorValue(properties);
        };

        /**
         * Encodes the specified ErrorValue message. Does not implicitly {@link common.ErrorValue.verify|verify} messages.
         * @function encode
         * @memberof common.ErrorValue
         * @static
         * @param {common.IErrorValue} message ErrorValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ErrorValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.runtimeExcJson != null && Object.hasOwnProperty.call(message, "runtimeExcJson"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.runtimeExcJson);
            if (message.err != null && Object.hasOwnProperty.call(message, "err"))
                writer.uint32(/* id 2, wireType 2 =*/18).string(message.err);
            return writer;
        };

        /**
         * Encodes the specified ErrorValue message, length delimited. Does not implicitly {@link common.ErrorValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.ErrorValue
         * @static
         * @param {common.IErrorValue} message ErrorValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        ErrorValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an ErrorValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.ErrorValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.ErrorValue} ErrorValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ErrorValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.ErrorValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.runtimeExcJson = reader.string();
                        break;
                    }
                case 2: {
                        message.err = reader.string();
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an ErrorValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.ErrorValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.ErrorValue} ErrorValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        ErrorValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an ErrorValue message.
         * @function verify
         * @memberof common.ErrorValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        ErrorValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.runtimeExcJson != null && Object.hasOwnProperty.call(message, "runtimeExcJson"))
                if (!$util.isString(message.runtimeExcJson))
                    return "runtimeExcJson: string expected";
            if (message.err != null && Object.hasOwnProperty.call(message, "err"))
                if (!$util.isString(message.err))
                    return "err: string expected";
            return null;
        };

        /**
         * Creates an ErrorValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.ErrorValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.ErrorValue} ErrorValue
         */
        ErrorValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.ErrorValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.ErrorValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.ErrorValue();
            if (object.runtimeExcJson != null)
                message.runtimeExcJson = String(object.runtimeExcJson);
            if (object.err != null)
                message.err = String(object.err);
            return message;
        };

        /**
         * Creates a plain object from an ErrorValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.ErrorValue
         * @static
         * @param {common.ErrorValue} message ErrorValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        ErrorValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.runtimeExcJson = "";
                object.err = "";
            }
            if (message.runtimeExcJson != null && Object.hasOwnProperty.call(message, "runtimeExcJson"))
                object.runtimeExcJson = message.runtimeExcJson;
            if (message.err != null && Object.hasOwnProperty.call(message, "err"))
                object.err = message.err;
            return object;
        };

        /**
         * Converts this ErrorValue to JSON.
         * @function toJSON
         * @memberof common.ErrorValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        ErrorValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for ErrorValue
         * @function getTypeUrl
         * @memberof common.ErrorValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        ErrorValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.ErrorValue";
        };

        return ErrorValue;
    })();

    common.AnyValue = (function() {

        /**
         * Properties of an AnyValue.
         * @memberof common
         * @interface IAnyValue
         * @property {string|null} [type] AnyValue type
         * @property {common.IStringValue|null} [json] AnyValue json
         * @property {common.IBytesValue|null} [bytes] AnyValue bytes
         */

        /**
         * Constructs a new AnyValue.
         * @memberof common
         * @classdesc Represents an AnyValue.
         * @implements IAnyValue
         * @constructor
         * @param {common.IAnyValue=} [properties] Properties to set
         */
        function AnyValue(properties) {
            if (properties)
                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
                    if (properties[keys[i]] != null && keys[i] !== "__proto__")
                        this[keys[i]] = properties[keys[i]];
        }

        /**
         * AnyValue type.
         * @member {string} type
         * @memberof common.AnyValue
         * @instance
         */
        AnyValue.prototype.type = "";

        /**
         * AnyValue json.
         * @member {common.IStringValue|null|undefined} json
         * @memberof common.AnyValue
         * @instance
         */
        AnyValue.prototype.json = null;

        /**
         * AnyValue bytes.
         * @member {common.IBytesValue|null|undefined} bytes
         * @memberof common.AnyValue
         * @instance
         */
        AnyValue.prototype.bytes = null;

        /**
         * Creates a new AnyValue instance using the specified properties.
         * @function create
         * @memberof common.AnyValue
         * @static
         * @param {common.IAnyValue=} [properties] Properties to set
         * @returns {common.AnyValue} AnyValue instance
         */
        AnyValue.create = function create(properties) {
            return new AnyValue(properties);
        };

        /**
         * Encodes the specified AnyValue message. Does not implicitly {@link common.AnyValue.verify|verify} messages.
         * @function encode
         * @memberof common.AnyValue
         * @static
         * @param {common.IAnyValue} message AnyValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AnyValue.encode = function encode(message, writer, q) {
            if (!writer)
                writer = $Writer.create();
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                writer.uint32(/* id 1, wireType 2 =*/10).string(message.type);
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                $root.common.StringValue.encode(message.json, writer.uint32(/* id 2, wireType 2 =*/18).fork(), q + 1).ldelim();
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                $root.common.BytesValue.encode(message.bytes, writer.uint32(/* id 3, wireType 2 =*/26).fork(), q + 1).ldelim();
            return writer;
        };

        /**
         * Encodes the specified AnyValue message, length delimited. Does not implicitly {@link common.AnyValue.verify|verify} messages.
         * @function encodeDelimited
         * @memberof common.AnyValue
         * @static
         * @param {common.IAnyValue} message AnyValue message or plain object to encode
         * @param {$protobuf.Writer} [writer] Writer to encode to
         * @returns {$protobuf.Writer} Writer
         */
        AnyValue.encodeDelimited = function encodeDelimited(message, writer) {
            return this.encode(message, writer && writer.len ? writer.fork() : writer).ldelim();
        };

        /**
         * Decodes an AnyValue message from the specified reader or buffer.
         * @function decode
         * @memberof common.AnyValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @param {number} [length] Message length if known beforehand
         * @returns {common.AnyValue} AnyValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AnyValue.decode = function decode(reader, length, error, long) {
            if (!(reader instanceof $Reader))
                reader = $Reader.create(reader);
            if (long === undefined)
                long = 0;
            if (long > $Reader.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.common.AnyValue();
            while (reader.pos < end) {
                var tag = reader.uint32();
                if (tag === error)
                    break;
                switch (tag >>> 3) {
                case 1: {
                        message.type = reader.string();
                        break;
                    }
                case 2: {
                        message.json = $root.common.StringValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                case 3: {
                        message.bytes = $root.common.BytesValue.decode(reader, reader.uint32(), undefined, long + 1);
                        break;
                    }
                default:
                    reader.skipType(tag & 7, long);
                    break;
                }
            }
            return message;
        };

        /**
         * Decodes an AnyValue message from the specified reader or buffer, length delimited.
         * @function decodeDelimited
         * @memberof common.AnyValue
         * @static
         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
         * @returns {common.AnyValue} AnyValue
         * @throws {Error} If the payload is not a reader or valid buffer
         * @throws {$protobuf.util.ProtocolError} If required fields are missing
         */
        AnyValue.decodeDelimited = function decodeDelimited(reader) {
            if (!(reader instanceof $Reader))
                reader = new $Reader(reader);
            return this.decode(reader, reader.uint32());
        };

        /**
         * Verifies an AnyValue message.
         * @function verify
         * @memberof common.AnyValue
         * @static
         * @param {Object.<string,*>} message Plain object to verify
         * @returns {string|null} `null` if valid, otherwise the reason why it is not
         */
        AnyValue.verify = function verify(message, long) {
            if (typeof message !== "object" || message === null)
                return "object expected";
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                return "maximum nesting depth exceeded";
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                if (!$util.isString(message.type))
                    return "type: string expected";
            if (message.json != null && Object.hasOwnProperty.call(message, "json")) {
                var error = $root.common.StringValue.verify(message.json, long + 1);
                if (error)
                    return "json." + error;
            }
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes")) {
                var error = $root.common.BytesValue.verify(message.bytes, long + 1);
                if (error)
                    return "bytes." + error;
            }
            return null;
        };

        /**
         * Creates an AnyValue message from a plain object. Also converts values to their respective internal types.
         * @function fromObject
         * @memberof common.AnyValue
         * @static
         * @param {Object.<string,*>} object Plain object
         * @returns {common.AnyValue} AnyValue
         */
        AnyValue.fromObject = function fromObject(object, long) {
            if (object instanceof $root.common.AnyValue)
                return object;
            if (!$util.isObject(object))
                throw TypeError(".common.AnyValue: object expected");
            if (long === undefined)
                long = 0;
            if (long > $util.recursionLimit)
                throw Error("maximum nesting depth exceeded");
            var message = new $root.common.AnyValue();
            if (object.type != null)
                message.type = String(object.type);
            if (object.json != null) {
                if (!$util.isObject(object.json))
                    throw TypeError(".common.AnyValue.json: object expected");
                message.json = $root.common.StringValue.fromObject(object.json, long + 1);
            }
            if (object.bytes != null) {
                if (!$util.isObject(object.bytes))
                    throw TypeError(".common.AnyValue.bytes: object expected");
                message.bytes = $root.common.BytesValue.fromObject(object.bytes, long + 1);
            }
            return message;
        };

        /**
         * Creates a plain object from an AnyValue message. Also converts values to other types if specified.
         * @function toObject
         * @memberof common.AnyValue
         * @static
         * @param {common.AnyValue} message AnyValue
         * @param {$protobuf.IConversionOptions} [options] Conversion options
         * @returns {Object.<string,*>} Plain object
         */
        AnyValue.toObject = function toObject(message, options, q) {
            if (!options)
                options = {};
            if (q === undefined)
                q = 0;
            if (q > $util.recursionLimit)
                throw Error("max depth exceeded");
            var object = {};
            if (options.defaults) {
                object.type = "";
                object.json = null;
                object.bytes = null;
            }
            if (message.type != null && Object.hasOwnProperty.call(message, "type"))
                object.type = message.type;
            if (message.json != null && Object.hasOwnProperty.call(message, "json"))
                object.json = $root.common.StringValue.toObject(message.json, options, q + 1);
            if (message.bytes != null && Object.hasOwnProperty.call(message, "bytes"))
                object.bytes = $root.common.BytesValue.toObject(message.bytes, options, q + 1);
            return object;
        };

        /**
         * Converts this AnyValue to JSON.
         * @function toJSON
         * @memberof common.AnyValue
         * @instance
         * @returns {Object.<string,*>} JSON object
         */
        AnyValue.prototype.toJSON = function toJSON() {
            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
        };

        /**
         * Gets the default type url for AnyValue
         * @function getTypeUrl
         * @memberof common.AnyValue
         * @static
         * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
         * @returns {string} The default type url
         */
        AnyValue.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
            if (typeUrlPrefix === undefined) {
                typeUrlPrefix = "type.googleapis.com";
            }
            return typeUrlPrefix + "/common.AnyValue";
        };

        return AnyValue;
    })();

    return common;
})();

module.exports = $root;

},{"protobufjs/minimal":84}],79:[function(require,module,exports){
/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */
exports.read = function (buffer, offset, isLE, mLen, nBytes) {
  var e, m
  var eLen = (nBytes * 8) - mLen - 1
  var eMax = (1 << eLen) - 1
  var eBias = eMax >> 1
  var nBits = -7
  var i = isLE ? (nBytes - 1) : 0
  var d = isLE ? -1 : 1
  var s = buffer[offset + i]

  i += d

  e = s & ((1 << (-nBits)) - 1)
  s >>= (-nBits)
  nBits += eLen
  for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}

  m = e & ((1 << (-nBits)) - 1)
  e >>= (-nBits)
  nBits += mLen
  for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}

  if (e === 0) {
    e = 1 - eBias
  } else if (e === eMax) {
    return m ? NaN : ((s ? -1 : 1) * Infinity)
  } else {
    m = m + Math.pow(2, mLen)
    e = e - eBias
  }
  return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
}

exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
  var e, m, c
  var eLen = (nBytes * 8) - mLen - 1
  var eMax = (1 << eLen) - 1
  var eBias = eMax >> 1
  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
  var i = isLE ? 0 : (nBytes - 1)
  var d = isLE ? 1 : -1
  var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0

  value = Math.abs(value)

  if (isNaN(value) || value === Infinity) {
    m = isNaN(value) ? 1 : 0
    e = eMax
  } else {
    e = Math.floor(Math.log(value) / Math.LN2)
    if (value * (c = Math.pow(2, -e)) < 1) {
      e--
      c *= 2
    }
    if (e + eBias >= 1) {
      value += rt / c
    } else {
      value += rt * Math.pow(2, 1 - eBias)
    }
    if (value * c >= 2) {
      e++
      c /= 2
    }

    if (e + eBias >= eMax) {
      m = 0
      e = eMax
    } else if (e + eBias >= 1) {
      m = ((value * c) - 1) * Math.pow(2, mLen)
      e = e + eBias
    } else {
      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
      e = 0
    }
  }

  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}

  e = (e << mLen) | m
  eLen += mLen
  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}

  buffer[offset + i - d] |= s * 128
}

},{}],80:[function(require,module,exports){
/*!
 * Determine if an object is a Buffer
 *
 * @author   Feross Aboukhadijeh <https://feross.org>
 * @license  MIT
 */

// The _isBuffer check is for Safari 5-7 support, because it's missing
// Object.prototype.constructor. Remove this eventually
module.exports = function (obj) {
  return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer)
}

function isBuffer (obj) {
  return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)
}

// For Node v0.10 support. Remove this eventually.
function isSlowBuffer (obj) {
  return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0))
}

},{}],81:[function(require,module,exports){
var toString = {}.toString;

module.exports = Array.isArray || function (arr) {
  return toString.call(arr) == '[object Array]';
};

},{}],82:[function(require,module,exports){
// GENERATED FILE. DO NOT EDIT.
(function (global, factory) {
  function preferDefault(exports) {
    return exports.default || exports;
  }
  if (typeof define === "function" && define.amd) {
    define([], function () {
      var exports = {};
      factory(exports);
      return preferDefault(exports);
    });
  } else if (typeof exports === "object") {
    factory(exports);
    if (typeof module === "object") module.exports = preferDefault(exports);
  } else {
    (function () {
      var exports = {};
      factory(exports);
      global.Long = preferDefault(exports);
    })();
  }
})(
  typeof globalThis !== "undefined"
    ? globalThis
    : typeof self !== "undefined"
      ? self
      : this,
  function (_exports) {
    "use strict";

    Object.defineProperty(_exports, "__esModule", {
      value: true,
    });
    _exports.default = void 0;
    /**
     * @license
     * Copyright 2009 The Closure Library Authors
     * Copyright 2020 Daniel Wirtz / The long.js Authors.
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *     http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     *
     * SPDX-License-Identifier: Apache-2.0
     */

    // WebAssembly optimizations to do native i64 multiplication and divide
    var wasm = null;
    try {
      wasm = new WebAssembly.Instance(
        new WebAssembly.Module(
          new Uint8Array([
            // \0asm
            0, 97, 115, 109,
            // version 1
            1, 0, 0, 0,
            // section "type"
            1, 13, 2,
            // 0, () => i32
            96, 0, 1, 127,
            // 1, (i32, i32, i32, i32) => i32
            96, 4, 127, 127, 127, 127, 1, 127,
            // section "function"
            3, 7, 6,
            // 0, type 0
            0,
            // 1, type 1
            1,
            // 2, type 1
            1,
            // 3, type 1
            1,
            // 4, type 1
            1,
            // 5, type 1
            1,
            // section "global"
            6, 6, 1,
            // 0, "high", mutable i32
            127, 1, 65, 0, 11,
            // section "export"
            7, 50, 6,
            // 0, "mul"
            3, 109, 117, 108, 0, 1,
            // 1, "div_s"
            5, 100, 105, 118, 95, 115, 0, 2,
            // 2, "div_u"
            5, 100, 105, 118, 95, 117, 0, 3,
            // 3, "rem_s"
            5, 114, 101, 109, 95, 115, 0, 4,
            // 4, "rem_u"
            5, 114, 101, 109, 95, 117, 0, 5,
            // 5, "get_high"
            8, 103, 101, 116, 95, 104, 105, 103, 104, 0, 0,
            // section "code"
            10, 191, 1, 6,
            // 0, "get_high"
            4, 0, 35, 0, 11,
            // 1, "mul"
            36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173,
            32, 3, 173, 66, 32, 134, 132, 126, 34, 4, 66, 32, 135, 167, 36, 0,
            32, 4, 167, 11,
            // 2, "div_s"
            36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173,
            32, 3, 173, 66, 32, 134, 132, 127, 34, 4, 66, 32, 135, 167, 36, 0,
            32, 4, 167, 11,
            // 3, "div_u"
            36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173,
            32, 3, 173, 66, 32, 134, 132, 128, 34, 4, 66, 32, 135, 167, 36, 0,
            32, 4, 167, 11,
            // 4, "rem_s"
            36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173,
            32, 3, 173, 66, 32, 134, 132, 129, 34, 4, 66, 32, 135, 167, 36, 0,
            32, 4, 167, 11,
            // 5, "rem_u"
            36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173,
            32, 3, 173, 66, 32, 134, 132, 130, 34, 4, 66, 32, 135, 167, 36, 0,
            32, 4, 167, 11,
          ]),
        ),
        {},
      ).exports;
    } catch {
      // no wasm support :(
    }

    /**
     * Constructs a 64 bit two's-complement integer, given its low and high 32 bit values as *signed* integers.
     *  See the from* functions below for more convenient ways of constructing Longs.
     * @exports Long
     * @class A Long class for representing a 64 bit two's-complement integer value.
     * @param {number} low The low (signed) 32 bits of the long
     * @param {number} high The high (signed) 32 bits of the long
     * @param {boolean=} unsigned Whether unsigned or not, defaults to signed
     * @constructor
     */
    function Long(low, high, unsigned) {
      /**
       * The low 32 bits as a signed value.
       * @type {number}
       */
      this.low = low | 0;

      /**
       * The high 32 bits as a signed value.
       * @type {number}
       */
      this.high = high | 0;

      /**
       * Whether unsigned or not.
       * @type {boolean}
       */
      this.unsigned = !!unsigned;
    }

    // The internal representation of a long is the two given signed, 32-bit values.
    // We use 32-bit pieces because these are the size of integers on which
    // Javascript performs bit-operations.  For operations like addition and
    // multiplication, we split each number into 16 bit pieces, which can easily be
    // multiplied within Javascript's floating-point representation without overflow
    // or change in sign.
    //
    // In the algorithms below, we frequently reduce the negative case to the
    // positive case by negating the input(s) and then post-processing the result.
    // Note that we must ALWAYS check specially whether those values are MIN_VALUE
    // (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as
    // a positive number, it overflows back into a negative).  Not handling this
    // case would often result in infinite recursion.
    //
    // Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the from*
    // methods on which they depend.

    /**
     * An indicator used to reliably determine if an object is a Long or not.
     * @type {boolean}
     * @const
     * @private
     */
    Long.prototype.__isLong__;
    Object.defineProperty(Long.prototype, "__isLong__", {
      value: true,
    });

    /**
     * @function
     * @param {*} obj Object
     * @returns {boolean}
     * @inner
     */
    function isLong(obj) {
      return (obj && obj["__isLong__"]) === true;
    }

    /**
     * @function
     * @param {*} value number
     * @returns {number}
     * @inner
     */
    function ctz32(value) {
      var c = Math.clz32(value & -value);
      return value ? 31 - c : c;
    }

    /**
     * Tests if the specified object is a Long.
     * @function
     * @param {*} obj Object
     * @returns {boolean}
     */
    Long.isLong = isLong;

    /**
     * A cache of the Long representations of small integer values.
     * @type {!Object}
     * @inner
     */
    var INT_CACHE = {};

    /**
     * A cache of the Long representations of small unsigned integer values.
     * @type {!Object}
     * @inner
     */
    var UINT_CACHE = {};

    /**
     * @param {number} value
     * @param {boolean=} unsigned
     * @returns {!Long}
     * @inner
     */
    function fromInt(value, unsigned) {
      var obj, cachedObj, cache;
      if (unsigned) {
        value >>>= 0;
        if ((cache = 0 <= value && value < 256)) {
          cachedObj = UINT_CACHE[value];
          if (cachedObj) return cachedObj;
        }
        obj = fromBits(value, 0, true);
        if (cache) UINT_CACHE[value] = obj;
        return obj;
      } else {
        value |= 0;
        if ((cache = -128 <= value && value < 128)) {
          cachedObj = INT_CACHE[value];
          if (cachedObj) return cachedObj;
        }
        obj = fromBits(value, value < 0 ? -1 : 0, false);
        if (cache) INT_CACHE[value] = obj;
        return obj;
      }
    }

    /**
     * Returns a Long representing the given 32 bit integer value.
     * @function
     * @param {number} value The 32 bit integer in question
     * @param {boolean=} unsigned Whether unsigned or not, defaults to signed
     * @returns {!Long} The corresponding Long value
     */
    Long.fromInt = fromInt;

    /**
     * @param {number} value
     * @param {boolean=} unsigned
     * @returns {!Long}
     * @inner
     */
    function fromNumber(value, unsigned) {
      if (isNaN(value)) return unsigned ? UZERO : ZERO;
      if (unsigned) {
        if (value < 0) return UZERO;
        if (value >= TWO_PWR_64_DBL) return MAX_UNSIGNED_VALUE;
      } else {
        if (value <= -TWO_PWR_63_DBL) return MIN_VALUE;
        if (value + 1 >= TWO_PWR_63_DBL) return MAX_VALUE;
      }
      if (value < 0) return fromNumber(-value, unsigned).neg();
      return fromBits(
        value % TWO_PWR_32_DBL | 0,
        (value / TWO_PWR_32_DBL) | 0,
        unsigned,
      );
    }

    /**
     * Returns a Long representing the given value, provided that it is a finite number. Otherwise, zero is returned.
     * @function
     * @param {number} value The number in question
     * @param {boolean=} unsigned Whether unsigned or not, defaults to signed
     * @returns {!Long} The corresponding Long value
     */
    Long.fromNumber = fromNumber;

    /**
     * @param {number} lowBits
     * @param {number} highBits
     * @param {boolean=} unsigned
     * @returns {!Long}
     * @inner
     */
    function fromBits(lowBits, highBits, unsigned) {
      return new Long(lowBits, highBits, unsigned);
    }

    /**
     * Returns a Long representing the 64 bit integer that comes by concatenating the given low and high bits. Each is
     *  assumed to use 32 bits.
     * @function
     * @param {number} lowBits The low 32 bits
     * @param {number} highBits The high 32 bits
     * @param {boolean=} unsigned Whether unsigned or not, defaults to signed
     * @returns {!Long} The corresponding Long value
     */
    Long.fromBits = fromBits;

    /**
     * @function
     * @param {number} base
     * @param {number} exponent
     * @returns {number}
     * @inner
     */
    var pow_dbl = Math.pow; // Used 4 times (4*8 to 15+4)

    /**
     * @param {string} str
     * @param {(boolean|number)=} unsigned
     * @param {number=} radix
     * @returns {!Long}
     * @inner
     */
    function fromString(str, unsigned, radix) {
      if (str.length === 0) throw Error("empty string");
      if (typeof unsigned === "number") {
        // For goog.math.long compatibility
        radix = unsigned;
        unsigned = false;
      } else {
        unsigned = !!unsigned;
      }
      if (
        str === "NaN" ||
        str === "Infinity" ||
        str === "+Infinity" ||
        str === "-Infinity"
      )
        return unsigned ? UZERO : ZERO;
      radix = radix || 10;
      if (radix < 2 || 36 < radix) throw RangeError("radix");
      var p;
      if ((p = str.indexOf("-")) > 0) throw Error("interior hyphen");
      else if (p === 0) {
        return fromString(str.substring(1), unsigned, radix).neg();
      }

      // Do several (8) digits each time through the loop, so as to
      // minimize the calls to the very expensive emulated div.
      var radixToPower = fromNumber(pow_dbl(radix, 8));
      var result = ZERO;
      for (var i = 0; i < str.length; i += 8) {
        var size = Math.min(8, str.length - i),
          value = parseInt(str.substring(i, i + size), radix);
        if (size < 8) {
          var power = fromNumber(pow_dbl(radix, size));
          result = result.mul(power).add(fromNumber(value));
        } else {
          result = result.mul(radixToPower);
          result = result.add(fromNumber(value));
        }
      }
      result.unsigned = unsigned;
      return result;
    }

    /**
     * Returns a Long representation of the given string, written using the specified radix.
     * @function
     * @param {string} str The textual representation of the Long
     * @param {(boolean|number)=} unsigned Whether unsigned or not, defaults to signed
     * @param {number=} radix The radix in which the text is written (2-36), defaults to 10
     * @returns {!Long} The corresponding Long value
     */
    Long.fromString = fromString;

    /**
     * @function
     * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val
     * @param {boolean=} unsigned
     * @returns {!Long}
     * @inner
     */
    function fromValue(val, unsigned) {
      if (typeof val === "number") return fromNumber(val, unsigned);
      if (typeof val === "string") return fromString(val, unsigned);
      // Throws for non-objects, converts non-instanceof Long:
      return fromBits(
        val.low,
        val.high,
        typeof unsigned === "boolean" ? unsigned : val.unsigned,
      );
    }

    /**
     * Converts the specified value to a Long using the appropriate from* function for its type.
     * @function
     * @param {!Long|number|bigint|string|!{low: number, high: number, unsigned: boolean}} val Value
     * @param {boolean=} unsigned Whether unsigned or not, defaults to signed
     * @returns {!Long}
     */
    Long.fromValue = fromValue;

    // NOTE: the compiler should inline these constant values below and then remove these variables, so there should be
    // no runtime penalty for these.

    /**
     * @type {number}
     * @const
     * @inner
     */
    var TWO_PWR_16_DBL = 1 << 16;

    /**
     * @type {number}
     * @const
     * @inner
     */
    var TWO_PWR_24_DBL = 1 << 24;

    /**
     * @type {number}
     * @const
     * @inner
     */
    var TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL;

    /**
     * @type {number}
     * @const
     * @inner
     */
    var TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL;

    /**
     * @type {number}
     * @const
     * @inner
     */
    var TWO_PWR_63_DBL = TWO_PWR_64_DBL / 2;

    /**
     * @type {!Long}
     * @const
     * @inner
     */
    var TWO_PWR_24 = fromInt(TWO_PWR_24_DBL);

    /**
     * @type {!Long}
     * @inner
     */
    var ZERO = fromInt(0);

    /**
     * Signed zero.
     * @type {!Long}
     */
    Long.ZERO = ZERO;

    /**
     * @type {!Long}
     * @inner
     */
    var UZERO = fromInt(0, true);

    /**
     * Unsigned zero.
     * @type {!Long}
     */
    Long.UZERO = UZERO;

    /**
     * @type {!Long}
     * @inner
     */
    var ONE = fromInt(1);

    /**
     * Signed one.
     * @type {!Long}
     */
    Long.ONE = ONE;

    /**
     * @type {!Long}
     * @inner
     */
    var UONE = fromInt(1, true);

    /**
     * Unsigned one.
     * @type {!Long}
     */
    Long.UONE = UONE;

    /**
     * @type {!Long}
     * @inner
     */
    var NEG_ONE = fromInt(-1);

    /**
     * Signed negative one.
     * @type {!Long}
     */
    Long.NEG_ONE = NEG_ONE;

    /**
     * @type {!Long}
     * @inner
     */
    var MAX_VALUE = fromBits(0xffffffff | 0, 0x7fffffff | 0, false);

    /**
     * Maximum signed value.
     * @type {!Long}
     */
    Long.MAX_VALUE = MAX_VALUE;

    /**
     * @type {!Long}
     * @inner
     */
    var MAX_UNSIGNED_VALUE = fromBits(0xffffffff | 0, 0xffffffff | 0, true);

    /**
     * Maximum unsigned value.
     * @type {!Long}
     */
    Long.MAX_UNSIGNED_VALUE = MAX_UNSIGNED_VALUE;

    /**
     * @type {!Long}
     * @inner
     */
    var MIN_VALUE = fromBits(0, 0x80000000 | 0, false);

    /**
     * Minimum signed value.
     * @type {!Long}
     */
    Long.MIN_VALUE = MIN_VALUE;

    /**
     * @alias Long.prototype
     * @inner
     */
    var LongPrototype = Long.prototype;

    /**
     * Converts the Long to a 32 bit integer, assuming it is a 32 bit integer.
     * @this {!Long}
     * @returns {number}
     */
    LongPrototype.toInt = function toInt() {
      return this.unsigned ? this.low >>> 0 : this.low;
    };

    /**
     * Converts the Long to a the nearest floating-point representation of this value (double, 53 bit mantissa).
     * @this {!Long}
     * @returns {number}
     */
    LongPrototype.toNumber = function toNumber() {
      if (this.unsigned)
        return (this.high >>> 0) * TWO_PWR_32_DBL + (this.low >>> 0);
      return this.high * TWO_PWR_32_DBL + (this.low >>> 0);
    };

    /**
     * Converts the Long to a string written in the specified radix.
     * @this {!Long}
     * @param {number=} radix Radix (2-36), defaults to 10
     * @returns {string}
     * @override
     * @throws {RangeError} If `radix` is out of range
     */
    LongPrototype.toString = function toString(radix) {
      radix = radix || 10;
      if (radix < 2 || 36 < radix) throw RangeError("radix");
      if (this.isZero()) return "0";
      if (this.isNegative()) {
        // Unsigned Longs are never negative
        if (this.eq(MIN_VALUE)) {
          // We need to change the Long value before it can be negated, so we remove
          // the bottom-most digit in this base and then recurse to do the rest.
          var radixLong = fromNumber(radix),
            div = this.div(radixLong),
            rem1 = div.mul(radixLong).sub(this);
          return div.toString(radix) + rem1.toInt().toString(radix);
        } else return "-" + this.neg().toString(radix);
      }

      // Do several (6) digits each time through the loop, so as to
      // minimize the calls to the very expensive emulated div.
      var radixToPower = fromNumber(pow_dbl(radix, 6), this.unsigned),
        rem = this;
      var result = "";
      while (true) {
        var remDiv = rem.div(radixToPower),
          intval = rem.sub(remDiv.mul(radixToPower)).toInt() >>> 0,
          digits = intval.toString(radix);
        rem = remDiv;
        if (rem.isZero()) return digits + result;
        else {
          while (digits.length < 6) digits = "0" + digits;
          result = "" + digits + result;
        }
      }
    };

    /**
     * Gets the high 32 bits as a signed integer.
     * @this {!Long}
     * @returns {number} Signed high bits
     */
    LongPrototype.getHighBits = function getHighBits() {
      return this.high;
    };

    /**
     * Gets the high 32 bits as an unsigned integer.
     * @this {!Long}
     * @returns {number} Unsigned high bits
     */
    LongPrototype.getHighBitsUnsigned = function getHighBitsUnsigned() {
      return this.high >>> 0;
    };

    /**
     * Gets the low 32 bits as a signed integer.
     * @this {!Long}
     * @returns {number} Signed low bits
     */
    LongPrototype.getLowBits = function getLowBits() {
      return this.low;
    };

    /**
     * Gets the low 32 bits as an unsigned integer.
     * @this {!Long}
     * @returns {number} Unsigned low bits
     */
    LongPrototype.getLowBitsUnsigned = function getLowBitsUnsigned() {
      return this.low >>> 0;
    };

    /**
     * Gets the number of bits needed to represent the absolute value of this Long.
     * @this {!Long}
     * @returns {number}
     */
    LongPrototype.getNumBitsAbs = function getNumBitsAbs() {
      if (this.isNegative())
        // Unsigned Longs are never negative
        return this.eq(MIN_VALUE) ? 64 : this.neg().getNumBitsAbs();
      var val = this.high != 0 ? this.high : this.low;
      for (var bit = 31; bit > 0; bit--) if ((val & (1 << bit)) != 0) break;
      return this.high != 0 ? bit + 33 : bit + 1;
    };

    /**
     * Tests if this Long can be safely represented as a JavaScript number.
     * @this {!Long}
     * @returns {boolean}
     */
    LongPrototype.isSafeInteger = function isSafeInteger() {
      // 2^53-1 is the maximum safe value
      var top11Bits = this.high >> 21;
      // [0, 2^53-1]
      if (!top11Bits) return true;
      // > 2^53-1
      if (this.unsigned) return false;
      // [-2^53, -1] except -2^53
      return top11Bits === -1 && !(this.low === 0 && this.high === -0x200000);
    };

    /**
     * Tests if this Long's value equals zero.
     * @this {!Long}
     * @returns {boolean}
     */
    LongPrototype.isZero = function isZero() {
      return this.high === 0 && this.low === 0;
    };

    /**
     * Tests if this Long's value equals zero. This is an alias of {@link Long#isZero}.
     * @returns {boolean}
     */
    LongPrototype.eqz = LongPrototype.isZero;

    /**
     * Tests if this Long's value is negative.
     * @this {!Long}
     * @returns {boolean}
     */
    LongPrototype.isNegative = function isNegative() {
      return !this.unsigned && this.high < 0;
    };

    /**
     * Tests if this Long's value is positive or zero.
     * @this {!Long}
     * @returns {boolean}
     */
    LongPrototype.isPositive = function isPositive() {
      return this.unsigned || this.high >= 0;
    };

    /**
     * Tests if this Long's value is odd.
     * @this {!Long}
     * @returns {boolean}
     */
    LongPrototype.isOdd = function isOdd() {
      return (this.low & 1) === 1;
    };

    /**
     * Tests if this Long's value is even.
     * @this {!Long}
     * @returns {boolean}
     */
    LongPrototype.isEven = function isEven() {
      return (this.low & 1) === 0;
    };

    /**
     * Tests if this Long's value equals the specified's.
     * @this {!Long}
     * @param {!Long|number|bigint|string} other Other value
     * @returns {boolean}
     */
    LongPrototype.equals = function equals(other) {
      if (!isLong(other)) other = fromValue(other);
      if (
        this.unsigned !== other.unsigned &&
        this.high >>> 31 === 1 &&
        other.high >>> 31 === 1
      )
        return false;
      return this.high === other.high && this.low === other.low;
    };

    /**
     * Tests if this Long's value equals the specified's. This is an alias of {@link Long#equals}.
     * @function
     * @param {!Long|number|bigint|string} other Other value
     * @returns {boolean}
     */
    LongPrototype.eq = LongPrototype.equals;

    /**
     * Tests if this Long's value differs from the specified's.
     * @this {!Long}
     * @param {!Long|number|bigint|string} other Other value
     * @returns {boolean}
     */
    LongPrototype.notEquals = function notEquals(other) {
      return !this.eq(/* validates */ other);
    };

    /**
     * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.
     * @function
     * @param {!Long|number|bigint|string} other Other value
     * @returns {boolean}
     */
    LongPrototype.neq = LongPrototype.notEquals;

    /**
     * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.
     * @function
     * @param {!Long|number|bigint|string} other Other value
     * @returns {boolean}
     */
    LongPrototype.ne = LongPrototype.notEquals;

    /**
     * Tests if this Long's value is less than the specified's.
     * @this {!Long}
     * @param {!Long|number|bigint|string} other Other value
     * @returns {boolean}
     */
    LongPrototype.lessThan = function lessThan(other) {
      return this.comp(/* validates */ other) < 0;
    };

    /**
     * Tests if this Long's value is less than the specified's. This is an alias of {@link Long#lessThan}.
     * @function
     * @param {!Long|number|bigint|string} other Other value
     * @returns {boolean}
     */
    LongPrototype.lt = LongPrototype.lessThan;

    /**
     * Tests if this Long's value is less than or equal the specified's.
     * @this {!Long}
     * @param {!Long|number|bigint|string} other Other value
     * @returns {boolean}
     */
    LongPrototype.lessThanOrEqual = function lessThanOrEqual(other) {
      return this.comp(/* validates */ other) <= 0;
    };

    /**
     * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.
     * @function
     * @param {!Long|number|bigint|string} other Other value
     * @returns {boolean}
     */
    LongPrototype.lte = LongPrototype.lessThanOrEqual;

    /**
     * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.
     * @function
     * @param {!Long|number|bigint|string} other Other value
     * @returns {boolean}
     */
    LongPrototype.le = LongPrototype.lessThanOrEqual;

    /**
     * Tests if this Long's value is greater than the specified's.
     * @this {!Long}
     * @param {!Long|number|bigint|string} other Other value
     * @returns {boolean}
     */
    LongPrototype.greaterThan = function greaterThan(other) {
      return this.comp(/* validates */ other) > 0;
    };

    /**
     * Tests if this Long's value is greater than the specified's. This is an alias of {@link Long#greaterThan}.
     * @function
     * @param {!Long|number|bigint|string} other Other value
     * @returns {boolean}
     */
    LongPrototype.gt = LongPrototype.greaterThan;

    /**
     * Tests if this Long's value is greater than or equal the specified's.
     * @this {!Long}
     * @param {!Long|number|bigint|string} other Other value
     * @returns {boolean}
     */
    LongPrototype.greaterThanOrEqual = function greaterThanOrEqual(other) {
      return this.comp(/* validates */ other) >= 0;
    };

    /**
     * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.
     * @function
     * @param {!Long|number|bigint|string} other Other value
     * @returns {boolean}
     */
    LongPrototype.gte = LongPrototype.greaterThanOrEqual;

    /**
     * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.
     * @function
     * @param {!Long|number|bigint|string} other Other value
     * @returns {boolean}
     */
    LongPrototype.ge = LongPrototype.greaterThanOrEqual;

    /**
     * Compares this Long's value with the specified's.
     * @this {!Long}
     * @param {!Long|number|bigint|string} other Other value
     * @returns {number} 0 if they are the same, 1 if the this is greater and -1
     *  if the given one is greater
     */
    LongPrototype.compare = function compare(other) {
      if (!isLong(other)) other = fromValue(other);
      if (this.eq(other)) return 0;
      var thisNeg = this.isNegative(),
        otherNeg = other.isNegative();
      if (thisNeg && !otherNeg) return -1;
      if (!thisNeg && otherNeg) return 1;
      // At this point the sign bits are the same
      if (!this.unsigned) return this.sub(other).isNegative() ? -1 : 1;
      // Both are positive if at least one is unsigned
      return other.high >>> 0 > this.high >>> 0 ||
        (other.high === this.high && other.low >>> 0 > this.low >>> 0)
        ? -1
        : 1;
    };

    /**
     * Compares this Long's value with the specified's. This is an alias of {@link Long#compare}.
     * @function
     * @param {!Long|number|bigint|string} other Other value
     * @returns {number} 0 if they are the same, 1 if the this is greater and -1
     *  if the given one is greater
     */
    LongPrototype.comp = LongPrototype.compare;

    /**
     * Negates this Long's value.
     * @this {!Long}
     * @returns {!Long} Negated Long
     */
    LongPrototype.negate = function negate() {
      if (!this.unsigned && this.eq(MIN_VALUE)) return MIN_VALUE;
      return this.not().add(ONE);
    };

    /**
     * Negates this Long's value. This is an alias of {@link Long#negate}.
     * @function
     * @returns {!Long} Negated Long
     */
    LongPrototype.neg = LongPrototype.negate;

    /**
     * Returns the sum of this and the specified Long.
     * @this {!Long}
     * @param {!Long|number|bigint|string} addend Addend
     * @returns {!Long} Sum
     */
    LongPrototype.add = function add(addend) {
      if (!isLong(addend)) addend = fromValue(addend);

      // Divide each number into 4 chunks of 16 bits, and then sum the chunks.

      var a48 = this.high >>> 16;
      var a32 = this.high & 0xffff;
      var a16 = this.low >>> 16;
      var a00 = this.low & 0xffff;
      var b48 = addend.high >>> 16;
      var b32 = addend.high & 0xffff;
      var b16 = addend.low >>> 16;
      var b00 = addend.low & 0xffff;
      var c48 = 0,
        c32 = 0,
        c16 = 0,
        c00 = 0;
      c00 += a00 + b00;
      c16 += c00 >>> 16;
      c00 &= 0xffff;
      c16 += a16 + b16;
      c32 += c16 >>> 16;
      c16 &= 0xffff;
      c32 += a32 + b32;
      c48 += c32 >>> 16;
      c32 &= 0xffff;
      c48 += a48 + b48;
      c48 &= 0xffff;
      return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);
    };

    /**
     * Returns the difference of this and the specified Long.
     * @this {!Long}
     * @param {!Long|number|bigint|string} subtrahend Subtrahend
     * @returns {!Long} Difference
     */
    LongPrototype.subtract = function subtract(subtrahend) {
      if (!isLong(subtrahend)) subtrahend = fromValue(subtrahend);
      return this.add(subtrahend.neg());
    };

    /**
     * Returns the difference of this and the specified Long. This is an alias of {@link Long#subtract}.
     * @function
     * @param {!Long|number|bigint|string} subtrahend Subtrahend
     * @returns {!Long} Difference
     */
    LongPrototype.sub = LongPrototype.subtract;

    /**
     * Returns the product of this and the specified Long.
     * @this {!Long}
     * @param {!Long|number|bigint|string} multiplier Multiplier
     * @returns {!Long} Product
     */
    LongPrototype.multiply = function multiply(multiplier) {
      if (this.isZero()) return this;
      if (!isLong(multiplier)) multiplier = fromValue(multiplier);

      // use wasm support if present
      if (wasm) {
        var low = wasm["mul"](
          this.low,
          this.high,
          multiplier.low,
          multiplier.high,
        );
        return fromBits(low, wasm["get_high"](), this.unsigned);
      }
      if (multiplier.isZero()) return this.unsigned ? UZERO : ZERO;
      if (this.eq(MIN_VALUE)) return multiplier.isOdd() ? MIN_VALUE : ZERO;
      if (multiplier.eq(MIN_VALUE)) return this.isOdd() ? MIN_VALUE : ZERO;
      if (this.isNegative()) {
        if (multiplier.isNegative()) return this.neg().mul(multiplier.neg());
        else return this.neg().mul(multiplier).neg();
      } else if (multiplier.isNegative())
        return this.mul(multiplier.neg()).neg();

      // If both longs are small, use float multiplication
      if (this.lt(TWO_PWR_24) && multiplier.lt(TWO_PWR_24))
        return fromNumber(
          this.toNumber() * multiplier.toNumber(),
          this.unsigned,
        );

      // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.
      // We can skip products that would overflow.

      var a48 = this.high >>> 16;
      var a32 = this.high & 0xffff;
      var a16 = this.low >>> 16;
      var a00 = this.low & 0xffff;
      var b48 = multiplier.high >>> 16;
      var b32 = multiplier.high & 0xffff;
      var b16 = multiplier.low >>> 16;
      var b00 = multiplier.low & 0xffff;
      var c48 = 0,
        c32 = 0,
        c16 = 0,
        c00 = 0;
      c00 += a00 * b00;
      c16 += c00 >>> 16;
      c00 &= 0xffff;
      c16 += a16 * b00;
      c32 += c16 >>> 16;
      c16 &= 0xffff;
      c16 += a00 * b16;
      c32 += c16 >>> 16;
      c16 &= 0xffff;
      c32 += a32 * b00;
      c48 += c32 >>> 16;
      c32 &= 0xffff;
      c32 += a16 * b16;
      c48 += c32 >>> 16;
      c32 &= 0xffff;
      c32 += a00 * b32;
      c48 += c32 >>> 16;
      c32 &= 0xffff;
      c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48;
      c48 &= 0xffff;
      return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);
    };

    /**
     * Returns the product of this and the specified Long. This is an alias of {@link Long#multiply}.
     * @function
     * @param {!Long|number|bigint|string} multiplier Multiplier
     * @returns {!Long} Product
     */
    LongPrototype.mul = LongPrototype.multiply;

    /**
     * Returns this Long divided by the specified. The result is signed if this Long is signed or
     *  unsigned if this Long is unsigned.
     * @this {!Long}
     * @param {!Long|number|bigint|string} divisor Divisor
     * @returns {!Long} Quotient
     */
    LongPrototype.divide = function divide(divisor) {
      if (!isLong(divisor)) divisor = fromValue(divisor);
      if (divisor.isZero()) throw Error("division by zero");

      // use wasm support if present
      if (wasm) {
        // guard against signed division overflow: the largest
        // negative number / -1 would be 1 larger than the largest
        // positive number, due to two's complement.
        if (
          !this.unsigned &&
          this.high === -0x80000000 &&
          divisor.low === -1 &&
          divisor.high === -1
        ) {
          // be consistent with non-wasm code path
          return this;
        }
        var low = (this.unsigned ? wasm["div_u"] : wasm["div_s"])(
          this.low,
          this.high,
          divisor.low,
          divisor.high,
        );
        return fromBits(low, wasm["get_high"](), this.unsigned);
      }
      if (this.isZero()) return this.unsigned ? UZERO : ZERO;
      var approx, rem, res;
      if (!this.unsigned) {
        // This section is only relevant for signed longs and is derived from the
        // closure library as a whole.
        if (this.eq(MIN_VALUE)) {
          if (divisor.eq(ONE) || divisor.eq(NEG_ONE))
            return MIN_VALUE; // recall that -MIN_VALUE == MIN_VALUE
          else if (divisor.eq(MIN_VALUE)) return ONE;
          else {
            // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|.
            var halfThis = this.shr(1);
            approx = halfThis.div(divisor).shl(1);
            if (approx.eq(ZERO)) {
              return divisor.isNegative() ? ONE : NEG_ONE;
            } else {
              rem = this.sub(divisor.mul(approx));
              res = approx.add(rem.div(divisor));
              return res;
            }
          }
        } else if (divisor.eq(MIN_VALUE)) return this.unsigned ? UZERO : ZERO;
        if (this.isNegative()) {
          if (divisor.isNegative()) return this.neg().div(divisor.neg());
          return this.neg().div(divisor).neg();
        } else if (divisor.isNegative()) return this.div(divisor.neg()).neg();
        res = ZERO;
      } else {
        // The algorithm below has not been made for unsigned longs. It's therefore
        // required to take special care of the MSB prior to running it.
        if (!divisor.unsigned) divisor = divisor.toUnsigned();
        if (divisor.gt(this)) return UZERO;
        if (divisor.gt(this.shru(1)))
          // 15 >>> 1 = 7 ; with divisor = 8 ; true
          return UONE;
        res = UZERO;
      }

      // Repeat the following until the remainder is less than other:  find a
      // floating-point that approximates remainder / other *from below*, add this
      // into the result, and subtract it from the remainder.  It is critical that
      // the approximate value is less than or equal to the real value so that the
      // remainder never becomes negative.
      rem = this;
      while (rem.gte(divisor)) {
        // Approximate the result of division. This may be a little greater or
        // smaller than the actual value.
        approx = Math.max(1, Math.floor(rem.toNumber() / divisor.toNumber()));

        // We will tweak the approximate result by changing it in the 48-th digit or
        // the smallest non-fractional digit, whichever is larger.
        var log2 = Math.ceil(Math.log(approx) / Math.LN2),
          delta = log2 <= 48 ? 1 : pow_dbl(2, log2 - 48),
          // Decrease the approximation until it is smaller than the remainder.  Note
          // that if it is too large, the product overflows and is negative.
          approxRes = fromNumber(approx),
          approxRem = approxRes.mul(divisor);
        while (approxRem.isNegative() || approxRem.gt(rem)) {
          approx -= delta;
          approxRes = fromNumber(approx, this.unsigned);
          approxRem = approxRes.mul(divisor);
        }

        // We know the answer can't be zero... and actually, zero would cause
        // infinite recursion since we would make no progress.
        if (approxRes.isZero()) approxRes = ONE;
        res = res.add(approxRes);
        rem = rem.sub(approxRem);
      }
      return res;
    };

    /**
     * Returns this Long divided by the specified. This is an alias of {@link Long#divide}.
     * @function
     * @param {!Long|number|bigint|string} divisor Divisor
     * @returns {!Long} Quotient
     */
    LongPrototype.div = LongPrototype.divide;

    /**
     * Returns this Long modulo the specified.
     * @this {!Long}
     * @param {!Long|number|bigint|string} divisor Divisor
     * @returns {!Long} Remainder
     */
    LongPrototype.modulo = function modulo(divisor) {
      if (!isLong(divisor)) divisor = fromValue(divisor);

      // use wasm support if present
      if (wasm) {
        var low = (this.unsigned ? wasm["rem_u"] : wasm["rem_s"])(
          this.low,
          this.high,
          divisor.low,
          divisor.high,
        );
        return fromBits(low, wasm["get_high"](), this.unsigned);
      }
      return this.sub(this.div(divisor).mul(divisor));
    };

    /**
     * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.
     * @function
     * @param {!Long|number|bigint|string} divisor Divisor
     * @returns {!Long} Remainder
     */
    LongPrototype.mod = LongPrototype.modulo;

    /**
     * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.
     * @function
     * @param {!Long|number|bigint|string} divisor Divisor
     * @returns {!Long} Remainder
     */
    LongPrototype.rem = LongPrototype.modulo;

    /**
     * Returns the bitwise NOT of this Long.
     * @this {!Long}
     * @returns {!Long}
     */
    LongPrototype.not = function not() {
      return fromBits(~this.low, ~this.high, this.unsigned);
    };

    /**
     * Returns count leading zeros of this Long.
     * @this {!Long}
     * @returns {!number}
     */
    LongPrototype.countLeadingZeros = function countLeadingZeros() {
      return this.high ? Math.clz32(this.high) : Math.clz32(this.low) + 32;
    };

    /**
     * Returns count leading zeros. This is an alias of {@link Long#countLeadingZeros}.
     * @function
     * @param {!Long}
     * @returns {!number}
     */
    LongPrototype.clz = LongPrototype.countLeadingZeros;

    /**
     * Returns count trailing zeros of this Long.
     * @this {!Long}
     * @returns {!number}
     */
    LongPrototype.countTrailingZeros = function countTrailingZeros() {
      return this.low ? ctz32(this.low) : ctz32(this.high) + 32;
    };

    /**
     * Returns count trailing zeros. This is an alias of {@link Long#countTrailingZeros}.
     * @function
     * @param {!Long}
     * @returns {!number}
     */
    LongPrototype.ctz = LongPrototype.countTrailingZeros;

    /**
     * Returns the bitwise AND of this Long and the specified.
     * @this {!Long}
     * @param {!Long|number|bigint|string} other Other Long
     * @returns {!Long}
     */
    LongPrototype.and = function and(other) {
      if (!isLong(other)) other = fromValue(other);
      return fromBits(
        this.low & other.low,
        this.high & other.high,
        this.unsigned,
      );
    };

    /**
     * Returns the bitwise OR of this Long and the specified.
     * @this {!Long}
     * @param {!Long|number|bigint|string} other Other Long
     * @returns {!Long}
     */
    LongPrototype.or = function or(other) {
      if (!isLong(other)) other = fromValue(other);
      return fromBits(
        this.low | other.low,
        this.high | other.high,
        this.unsigned,
      );
    };

    /**
     * Returns the bitwise XOR of this Long and the given one.
     * @this {!Long}
     * @param {!Long|number|bigint|string} other Other Long
     * @returns {!Long}
     */
    LongPrototype.xor = function xor(other) {
      if (!isLong(other)) other = fromValue(other);
      return fromBits(
        this.low ^ other.low,
        this.high ^ other.high,
        this.unsigned,
      );
    };

    /**
     * Returns this Long with bits shifted to the left by the given amount.
     * @this {!Long}
     * @param {number|!Long} numBits Number of bits
     * @returns {!Long} Shifted Long
     */
    LongPrototype.shiftLeft = function shiftLeft(numBits) {
      if (isLong(numBits)) numBits = numBits.toInt();
      if ((numBits &= 63) === 0) return this;
      else if (numBits < 32)
        return fromBits(
          this.low << numBits,
          (this.high << numBits) | (this.low >>> (32 - numBits)),
          this.unsigned,
        );
      else return fromBits(0, this.low << (numBits - 32), this.unsigned);
    };

    /**
     * Returns this Long with bits shifted to the left by the given amount. This is an alias of {@link Long#shiftLeft}.
     * @function
     * @param {number|!Long} numBits Number of bits
     * @returns {!Long} Shifted Long
     */
    LongPrototype.shl = LongPrototype.shiftLeft;

    /**
     * Returns this Long with bits arithmetically shifted to the right by the given amount.
     * @this {!Long}
     * @param {number|!Long} numBits Number of bits
     * @returns {!Long} Shifted Long
     */
    LongPrototype.shiftRight = function shiftRight(numBits) {
      if (isLong(numBits)) numBits = numBits.toInt();
      if ((numBits &= 63) === 0) return this;
      else if (numBits < 32)
        return fromBits(
          (this.low >>> numBits) | (this.high << (32 - numBits)),
          this.high >> numBits,
          this.unsigned,
        );
      else
        return fromBits(
          this.high >> (numBits - 32),
          this.high >= 0 ? 0 : -1,
          this.unsigned,
        );
    };

    /**
     * Returns this Long with bits arithmetically shifted to the right by the given amount. This is an alias of {@link Long#shiftRight}.
     * @function
     * @param {number|!Long} numBits Number of bits
     * @returns {!Long} Shifted Long
     */
    LongPrototype.shr = LongPrototype.shiftRight;

    /**
     * Returns this Long with bits logically shifted to the right by the given amount.
     * @this {!Long}
     * @param {number|!Long} numBits Number of bits
     * @returns {!Long} Shifted Long
     */
    LongPrototype.shiftRightUnsigned = function shiftRightUnsigned(numBits) {
      if (isLong(numBits)) numBits = numBits.toInt();
      if ((numBits &= 63) === 0) return this;
      if (numBits < 32)
        return fromBits(
          (this.low >>> numBits) | (this.high << (32 - numBits)),
          this.high >>> numBits,
          this.unsigned,
        );
      if (numBits === 32) return fromBits(this.high, 0, this.unsigned);
      return fromBits(this.high >>> (numBits - 32), 0, this.unsigned);
    };

    /**
     * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.
     * @function
     * @param {number|!Long} numBits Number of bits
     * @returns {!Long} Shifted Long
     */
    LongPrototype.shru = LongPrototype.shiftRightUnsigned;

    /**
     * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.
     * @function
     * @param {number|!Long} numBits Number of bits
     * @returns {!Long} Shifted Long
     */
    LongPrototype.shr_u = LongPrototype.shiftRightUnsigned;

    /**
     * Returns this Long with bits rotated to the left by the given amount.
     * @this {!Long}
     * @param {number|!Long} numBits Number of bits
     * @returns {!Long} Rotated Long
     */
    LongPrototype.rotateLeft = function rotateLeft(numBits) {
      var b;
      if (isLong(numBits)) numBits = numBits.toInt();
      if ((numBits &= 63) === 0) return this;
      if (numBits === 32) return fromBits(this.high, this.low, this.unsigned);
      if (numBits < 32) {
        b = 32 - numBits;
        return fromBits(
          (this.low << numBits) | (this.high >>> b),
          (this.high << numBits) | (this.low >>> b),
          this.unsigned,
        );
      }
      numBits -= 32;
      b = 32 - numBits;
      return fromBits(
        (this.high << numBits) | (this.low >>> b),
        (this.low << numBits) | (this.high >>> b),
        this.unsigned,
      );
    };
    /**
     * Returns this Long with bits rotated to the left by the given amount. This is an alias of {@link Long#rotateLeft}.
     * @function
     * @param {number|!Long} numBits Number of bits
     * @returns {!Long} Rotated Long
     */
    LongPrototype.rotl = LongPrototype.rotateLeft;

    /**
     * Returns this Long with bits rotated to the right by the given amount.
     * @this {!Long}
     * @param {number|!Long} numBits Number of bits
     * @returns {!Long} Rotated Long
     */
    LongPrototype.rotateRight = function rotateRight(numBits) {
      var b;
      if (isLong(numBits)) numBits = numBits.toInt();
      if ((numBits &= 63) === 0) return this;
      if (numBits === 32) return fromBits(this.high, this.low, this.unsigned);
      if (numBits < 32) {
        b = 32 - numBits;
        return fromBits(
          (this.high << b) | (this.low >>> numBits),
          (this.low << b) | (this.high >>> numBits),
          this.unsigned,
        );
      }
      numBits -= 32;
      b = 32 - numBits;
      return fromBits(
        (this.low << b) | (this.high >>> numBits),
        (this.high << b) | (this.low >>> numBits),
        this.unsigned,
      );
    };
    /**
     * Returns this Long with bits rotated to the right by the given amount. This is an alias of {@link Long#rotateRight}.
     * @function
     * @param {number|!Long} numBits Number of bits
     * @returns {!Long} Rotated Long
     */
    LongPrototype.rotr = LongPrototype.rotateRight;

    /**
     * Converts this Long to signed.
     * @this {!Long}
     * @returns {!Long} Signed long
     */
    LongPrototype.toSigned = function toSigned() {
      if (!this.unsigned) return this;
      return fromBits(this.low, this.high, false);
    };

    /**
     * Converts this Long to unsigned.
     * @this {!Long}
     * @returns {!Long} Unsigned long
     */
    LongPrototype.toUnsigned = function toUnsigned() {
      if (this.unsigned) return this;
      return fromBits(this.low, this.high, true);
    };

    /**
     * Converts this Long to its byte representation.
     * @param {boolean=} le Whether little or big endian, defaults to big endian
     * @this {!Long}
     * @returns {!Array.<number>} Byte representation
     */
    LongPrototype.toBytes = function toBytes(le) {
      return le ? this.toBytesLE() : this.toBytesBE();
    };

    /**
     * Converts this Long to its little endian byte representation.
     * @this {!Long}
     * @returns {!Array.<number>} Little endian byte representation
     */
    LongPrototype.toBytesLE = function toBytesLE() {
      var hi = this.high,
        lo = this.low;
      return [
        lo & 0xff,
        (lo >>> 8) & 0xff,
        (lo >>> 16) & 0xff,
        lo >>> 24,
        hi & 0xff,
        (hi >>> 8) & 0xff,
        (hi >>> 16) & 0xff,
        hi >>> 24,
      ];
    };

    /**
     * Converts this Long to its big endian byte representation.
     * @this {!Long}
     * @returns {!Array.<number>} Big endian byte representation
     */
    LongPrototype.toBytesBE = function toBytesBE() {
      var hi = this.high,
        lo = this.low;
      return [
        hi >>> 24,
        (hi >>> 16) & 0xff,
        (hi >>> 8) & 0xff,
        hi & 0xff,
        lo >>> 24,
        (lo >>> 16) & 0xff,
        (lo >>> 8) & 0xff,
        lo & 0xff,
      ];
    };

    /**
     * Creates a Long from its byte representation.
     * @param {!Array.<number>} bytes Byte representation
     * @param {boolean=} unsigned Whether unsigned or not, defaults to signed
     * @param {boolean=} le Whether little or big endian, defaults to big endian
     * @returns {Long} The corresponding Long value
     */
    Long.fromBytes = function fromBytes(bytes, unsigned, le) {
      return le
        ? Long.fromBytesLE(bytes, unsigned)
        : Long.fromBytesBE(bytes, unsigned);
    };

    /**
     * Creates a Long from its little endian byte representation.
     * @param {!Array.<number>} bytes Little endian byte representation
     * @param {boolean=} unsigned Whether unsigned or not, defaults to signed
     * @returns {Long} The corresponding Long value
     */
    Long.fromBytesLE = function fromBytesLE(bytes, unsigned) {
      return new Long(
        bytes[0] | (bytes[1] << 8) | (bytes[2] << 16) | (bytes[3] << 24),
        bytes[4] | (bytes[5] << 8) | (bytes[6] << 16) | (bytes[7] << 24),
        unsigned,
      );
    };

    /**
     * Creates a Long from its big endian byte representation.
     * @param {!Array.<number>} bytes Big endian byte representation
     * @param {boolean=} unsigned Whether unsigned or not, defaults to signed
     * @returns {Long} The corresponding Long value
     */
    Long.fromBytesBE = function fromBytesBE(bytes, unsigned) {
      return new Long(
        (bytes[4] << 24) | (bytes[5] << 16) | (bytes[6] << 8) | bytes[7],
        (bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3],
        unsigned,
      );
    };

    // Support conversion to/from BigInt where available
    if (typeof BigInt === "function") {
      /**
       * Returns a Long representing the given big integer.
       * @function
       * @param {number} value The big integer value
       * @param {boolean=} unsigned Whether unsigned or not, defaults to signed
       * @returns {!Long} The corresponding Long value
       */
      Long.fromBigInt = function fromBigInt(value, unsigned) {
        var lowBits = Number(BigInt.asIntN(32, value));
        var highBits = Number(BigInt.asIntN(32, value >> BigInt(32)));
        return fromBits(lowBits, highBits, unsigned);
      };

      // Override
      Long.fromValue = function fromValueWithBigInt(value, unsigned) {
        if (typeof value === "bigint") return Long.fromBigInt(value, unsigned);
        return fromValue(value, unsigned);
      };

      /**
       * Converts the Long to its big integer representation.
       * @this {!Long}
       * @returns {bigint}
       */
      LongPrototype.toBigInt = function toBigInt() {
        var lowBigInt = BigInt(this.low >>> 0);
        var highBigInt = BigInt(this.unsigned ? this.high >>> 0 : this.high);
        return (highBigInt << BigInt(32)) | lowBigInt;
      };
    }
    var _default = (_exports.default = Long);
  },
);

},{}],83:[function(require,module,exports){
// shim for using process in browser
var process = module.exports = {};

// cached from whatever global is present so that test runners that stub it
// don't break things.  But we need to wrap it in a try catch in case it is
// wrapped in strict mode code which doesn't define any globals.  It's inside a
// function because try/catches deoptimize in certain engines.

var cachedSetTimeout;
var cachedClearTimeout;

function defaultSetTimout() {
    throw new Error('setTimeout has not been defined');
}
function defaultClearTimeout () {
    throw new Error('clearTimeout has not been defined');
}
(function () {
    try {
        if (typeof setTimeout === 'function') {
            cachedSetTimeout = setTimeout;
        } else {
            cachedSetTimeout = defaultSetTimout;
        }
    } catch (e) {
        cachedSetTimeout = defaultSetTimout;
    }
    try {
        if (typeof clearTimeout === 'function') {
            cachedClearTimeout = clearTimeout;
        } else {
            cachedClearTimeout = defaultClearTimeout;
        }
    } catch (e) {
        cachedClearTimeout = defaultClearTimeout;
    }
} ())
function runTimeout(fun) {
    if (cachedSetTimeout === setTimeout) {
        //normal enviroments in sane situations
        return setTimeout(fun, 0);
    }
    // if setTimeout wasn't available but was latter defined
    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
        cachedSetTimeout = setTimeout;
        return setTimeout(fun, 0);
    }
    try {
        // when when somebody has screwed with setTimeout but no I.E. maddness
        return cachedSetTimeout(fun, 0);
    } catch(e){
        try {
            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
            return cachedSetTimeout.call(null, fun, 0);
        } catch(e){
            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
            return cachedSetTimeout.call(this, fun, 0);
        }
    }


}
function runClearTimeout(marker) {
    if (cachedClearTimeout === clearTimeout) {
        //normal enviroments in sane situations
        return clearTimeout(marker);
    }
    // if clearTimeout wasn't available but was latter defined
    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
        cachedClearTimeout = clearTimeout;
        return clearTimeout(marker);
    }
    try {
        // when when somebody has screwed with setTimeout but no I.E. maddness
        return cachedClearTimeout(marker);
    } catch (e){
        try {
            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally
            return cachedClearTimeout.call(null, marker);
        } catch (e){
            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
            // Some versions of I.E. have different rules for clearTimeout vs setTimeout
            return cachedClearTimeout.call(this, marker);
        }
    }



}
var queue = [];
var draining = false;
var currentQueue;
var queueIndex = -1;

function cleanUpNextTick() {
    if (!draining || !currentQueue) {
        return;
    }
    draining = false;
    if (currentQueue.length) {
        queue = currentQueue.concat(queue);
    } else {
        queueIndex = -1;
    }
    if (queue.length) {
        drainQueue();
    }
}

function drainQueue() {
    if (draining) {
        return;
    }
    var timeout = runTimeout(cleanUpNextTick);
    draining = true;

    var len = queue.length;
    while(len) {
        currentQueue = queue;
        queue = [];
        while (++queueIndex < len) {
            if (currentQueue) {
                currentQueue[queueIndex].run();
            }
        }
        queueIndex = -1;
        len = queue.length;
    }
    currentQueue = null;
    draining = false;
    runClearTimeout(timeout);
}

process.nextTick = function (fun) {
    var args = new Array(arguments.length - 1);
    if (arguments.length > 1) {
        for (var i = 1; i < arguments.length; i++) {
            args[i - 1] = arguments[i];
        }
    }
    queue.push(new Item(fun, args));
    if (queue.length === 1 && !draining) {
        runTimeout(drainQueue);
    }
};

// v8 likes predictible objects
function Item(fun, array) {
    this.fun = fun;
    this.array = array;
}
Item.prototype.run = function () {
    this.fun.apply(null, this.array);
};
process.title = 'browser';
process.browser = true;
process.env = {};
process.argv = [];
process.version = ''; // empty string to avoid regexp issues
process.versions = {};

function noop() {}

process.on = noop;
process.addListener = noop;
process.once = noop;
process.off = noop;
process.removeListener = noop;
process.removeAllListeners = noop;
process.emit = noop;
process.prependListener = noop;
process.prependOnceListener = noop;

process.listeners = function (name) { return [] }

process.binding = function (name) {
    throw new Error('process.binding is not supported');
};

process.cwd = function () { return '/' };
process.chdir = function (dir) {
    throw new Error('process.chdir is not supported');
};
process.umask = function() { return 0; };

},{}],84:[function(require,module,exports){
// minimal library entry point.

"use strict";
module.exports = require("./src/index-minimal");

},{"./src/index-minimal":85}],85:[function(require,module,exports){
"use strict";
var protobuf = exports;

/**
 * Build type, one of `"full"`, `"light"` or `"minimal"`.
 * @name build
 * @type {string}
 * @const
 */
protobuf.build = "minimal";

// Serialization
protobuf.Writer       = require("./writer");
protobuf.BufferWriter = require("./writer_buffer");
protobuf.Reader       = require("./reader");
protobuf.BufferReader = require("./reader_buffer");

// Utility
protobuf.util         = require("./util/minimal");
protobuf.rpc          = require("./rpc");
protobuf.roots        = require("./roots");
protobuf.configure    = configure;

/* istanbul ignore next */
/**
 * Reconfigures the library according to the environment.
 * @returns {undefined}
 */
function configure() {
    protobuf.util._configure();
    protobuf.Writer._configure(protobuf.BufferWriter);
    protobuf.Reader._configure(protobuf.BufferReader);
}

// Set up buffer utility according to the environment
configure();

},{"./reader":86,"./reader_buffer":87,"./roots":88,"./rpc":89,"./util/minimal":92,"./writer":93,"./writer_buffer":94}],86:[function(require,module,exports){
"use strict";
module.exports = Reader;

var util      = require("./util/minimal");

var BufferReader; // cyclic

var LongBits  = util.LongBits,
    utf8      = util.utf8;

/* istanbul ignore next */
function indexOutOfRange(reader, writeLength) {
    return RangeError("index out of range: " + reader.pos + " + " + (writeLength || 1) + " > " + reader.len);
}

/**
 * Constructs a new reader instance using the specified buffer.
 * @classdesc Wire format reader using `Uint8Array` if available, otherwise `Array`.
 * @constructor
 * @param {Uint8Array} buffer Buffer to read from
 */
function Reader(buffer) {

    /**
     * Read buffer.
     * @type {Uint8Array}
     */
    this.buf = buffer;

    /**
     * Read buffer position.
     * @type {number}
     */
    this.pos = 0;

    /**
     * Read buffer length.
     * @type {number}
     */
    this.len = buffer.length;
}

var create_array = typeof Uint8Array !== "undefined"
    ? function create_typed_array(buffer) {
        if (buffer instanceof Uint8Array || Array.isArray(buffer))
            return new Reader(buffer);
        throw Error("illegal buffer");
    }
    /* istanbul ignore next */
    : function create_array(buffer) {
        if (Array.isArray(buffer))
            return new Reader(buffer);
        throw Error("illegal buffer");
    };

var create = function create() {
    return util.Buffer
        ? function create_buffer_setup(buffer) {
            return (Reader.create = function create_buffer(buffer) {
                return util.Buffer.isBuffer(buffer)
                    ? new BufferReader(buffer)
                    /* istanbul ignore next */
                    : create_array(buffer);
            })(buffer);
        }
        /* istanbul ignore next */
        : create_array;
};

/**
 * Creates a new reader using the specified buffer.
 * @function
 * @param {Uint8Array|Buffer} buffer Buffer to read from
 * @returns {Reader|BufferReader} A {@link BufferReader} if `buffer` is a Buffer, otherwise a {@link Reader}
 * @throws {Error} If `buffer` is not a valid buffer
 */
Reader.create = create();

Reader.prototype._slice = util.Array.prototype.subarray || /* istanbul ignore next */ util.Array.prototype.slice;

/**
 * Reads a varint as an unsigned 32 bit value.
 * @function
 * @returns {number} Value read
 */
Reader.prototype.uint32 = (function read_uint32_setup() {
    var value = 4294967295; // optimizer type-hint, tends to deopt otherwise (?!)
    return function read_uint32() {
        value = (         this.buf[this.pos] & 127       ) >>> 0; if (this.buf[this.pos++] < 128) return value;
        value = (value | (this.buf[this.pos] & 127) <<  7) >>> 0; if (this.buf[this.pos++] < 128) return value;
        value = (value | (this.buf[this.pos] & 127) << 14) >>> 0; if (this.buf[this.pos++] < 128) return value;
        value = (value | (this.buf[this.pos] & 127) << 21) >>> 0; if (this.buf[this.pos++] < 128) return value;
        value = (value | (this.buf[this.pos] &  15) << 28) >>> 0; if (this.buf[this.pos++] < 128) return value;

        /* istanbul ignore if */
        if ((this.pos += 5) > this.len) {
            this.pos = this.len;
            throw indexOutOfRange(this, 10);
        }
        return value;
    };
})();

/**
 * Reads a varint as a signed 32 bit value.
 * @returns {number} Value read
 */
Reader.prototype.int32 = function read_int32() {
    return this.uint32() | 0;
};

/**
 * Reads a zig-zag encoded varint as a signed 32 bit value.
 * @returns {number} Value read
 */
Reader.prototype.sint32 = function read_sint32() {
    var value = this.uint32();
    return value >>> 1 ^ -(value & 1) | 0;
};

/* eslint-disable no-invalid-this */

function readLongVarint() {
    // tends to deopt with local vars for octet etc.
    var bits = new LongBits(0, 0);
    var i = 0;
    if (this.len - this.pos > 4) { // fast route (lo)
        for (; i < 4; ++i) {
            // 1st..4th
            bits.lo = (bits.lo | (this.buf[this.pos] & 127) << i * 7) >>> 0;
            if (this.buf[this.pos++] < 128)
                return bits;
        }
        // 5th
        bits.lo = (bits.lo | (this.buf[this.pos] & 127) << 28) >>> 0;
        bits.hi = (bits.hi | (this.buf[this.pos] & 127) >>  4) >>> 0;
        if (this.buf[this.pos++] < 128)
            return bits;
        i = 0;
    } else {
        for (; i < 3; ++i) {
            /* istanbul ignore if */
            if (this.pos >= this.len)
                throw indexOutOfRange(this);
            // 1st..3th
            bits.lo = (bits.lo | (this.buf[this.pos] & 127) << i * 7) >>> 0;
            if (this.buf[this.pos++] < 128)
                return bits;
        }
        // 4th
        bits.lo = (bits.lo | (this.buf[this.pos++] & 127) << i * 7) >>> 0;
        return bits;
    }
    if (this.len - this.pos > 4) { // fast route (hi)
        for (; i < 5; ++i) {
            // 6th..10th
            bits.hi = (bits.hi | (this.buf[this.pos] & 127) << i * 7 + 3) >>> 0;
            if (this.buf[this.pos++] < 128)
                return bits;
        }
    } else {
        for (; i < 5; ++i) {
            /* istanbul ignore if */
            if (this.pos >= this.len)
                throw indexOutOfRange(this);
            // 6th..10th
            bits.hi = (bits.hi | (this.buf[this.pos] & 127) << i * 7 + 3) >>> 0;
            if (this.buf[this.pos++] < 128)
                return bits;
        }
    }
    /* istanbul ignore next */
    throw Error("invalid varint encoding");
}

/* eslint-enable no-invalid-this */

/**
 * Reads a varint as a signed 64 bit value.
 * @name Reader#int64
 * @function
 * @returns {Long} Value read
 */

/**
 * Reads a varint as an unsigned 64 bit value.
 * @name Reader#uint64
 * @function
 * @returns {Long} Value read
 */

/**
 * Reads a zig-zag encoded varint as a signed 64 bit value.
 * @name Reader#sint64
 * @function
 * @returns {Long} Value read
 */

/**
 * Reads a varint as a boolean.
 * @returns {boolean} Value read
 */
Reader.prototype.bool = function read_bool() {
    return this.uint32() !== 0;
};

function readFixed32_end(buf, end) { // note that this uses `end`, not `pos`
    return (buf[end - 4]
          | buf[end - 3] << 8
          | buf[end - 2] << 16
          | buf[end - 1] << 24) >>> 0;
}

/**
 * Reads fixed 32 bits as an unsigned 32 bit integer.
 * @returns {number} Value read
 */
Reader.prototype.fixed32 = function read_fixed32() {

    /* istanbul ignore if */
    if (this.pos + 4 > this.len)
        throw indexOutOfRange(this, 4);

    return readFixed32_end(this.buf, this.pos += 4);
};

/**
 * Reads fixed 32 bits as a signed 32 bit integer.
 * @returns {number} Value read
 */
Reader.prototype.sfixed32 = function read_sfixed32() {

    /* istanbul ignore if */
    if (this.pos + 4 > this.len)
        throw indexOutOfRange(this, 4);

    return readFixed32_end(this.buf, this.pos += 4) | 0;
};

/* eslint-disable no-invalid-this */

function readFixed64(/* this: Reader */) {

    /* istanbul ignore if */
    if (this.pos + 8 > this.len)
        throw indexOutOfRange(this, 8);

    return new LongBits(readFixed32_end(this.buf, this.pos += 4), readFixed32_end(this.buf, this.pos += 4));
}

/* eslint-enable no-invalid-this */

/**
 * Reads fixed 64 bits.
 * @name Reader#fixed64
 * @function
 * @returns {Long} Value read
 */

/**
 * Reads zig-zag encoded fixed 64 bits.
 * @name Reader#sfixed64
 * @function
 * @returns {Long} Value read
 */

/**
 * Reads a float (32 bit) as a number.
 * @function
 * @returns {number} Value read
 */
Reader.prototype.float = function read_float() {

    /* istanbul ignore if */
    if (this.pos + 4 > this.len)
        throw indexOutOfRange(this, 4);

    var value = util.float.readFloatLE(this.buf, this.pos);
    this.pos += 4;
    return value;
};

/**
 * Reads a double (64 bit float) as a number.
 * @function
 * @returns {number} Value read
 */
Reader.prototype.double = function read_double() {

    /* istanbul ignore if */
    if (this.pos + 8 > this.len)
        throw indexOutOfRange(this, 4);

    var value = util.float.readDoubleLE(this.buf, this.pos);
    this.pos += 8;
    return value;
};

/**
 * Reads a sequence of bytes preceeded by its length as a varint.
 * @returns {Uint8Array} Value read
 */
Reader.prototype.bytes = function read_bytes() {
    var length = this.uint32(),
        start  = this.pos,
        end    = this.pos + length;

    /* istanbul ignore if */
    if (end > this.len)
        throw indexOutOfRange(this, length);

    this.pos += length;
    if (Array.isArray(this.buf)) // plain array
        return this.buf.slice(start, end);

    if (start === end) { // fix for IE 10/Win8 and others' subarray returning array of size 1
        var nativeBuffer = util.Buffer;
        return nativeBuffer
            ? nativeBuffer.alloc(0)
            : new this.buf.constructor(0);
    }
    return this._slice.call(this.buf, start, end);
};

/**
 * Reads a string preceeded by its byte length as a varint.
 * @returns {string} Value read
 */
Reader.prototype.string = function read_string() {
    var bytes = this.bytes();
    return utf8.read(bytes, 0, bytes.length);
};

/**
 * Skips the specified number of bytes if specified, otherwise skips a varint.
 * @param {number} [length] Length if known, otherwise a varint is assumed
 * @returns {Reader} `this`
 */
Reader.prototype.skip = function skip(length) {
    if (typeof length === "number") {
        /* istanbul ignore if */
        if (this.pos + length > this.len)
            throw indexOutOfRange(this, length);
        this.pos += length;
    } else {
        do {
            /* istanbul ignore if */
            if (this.pos >= this.len)
                throw indexOutOfRange(this);
        } while (this.buf[this.pos++] & 128);
    }
    return this;
};

/**
 * Recursion limit.
 * @type {number}
 */
Reader.recursionLimit = util.recursionLimit;

/**
 * Skips the next element of the specified wire type.
 * @param {number} wireType Wire type received
 * @param {number} [depth] Depth of recursion to control nested calls; 0 if omitted
 * @returns {Reader} `this`
 */
Reader.prototype.skipType = function(wireType, depth) {
    if (depth === undefined) depth = 0;
    if (depth > Reader.recursionLimit)
        throw Error("maximum nesting depth exceeded");
    switch (wireType) {
        case 0:
            this.skip();
            break;
        case 1:
            this.skip(8);
            break;
        case 2:
            this.skip(this.uint32());
            break;
        case 3:
            while ((wireType = this.uint32() & 7) !== 4) {
                this.skipType(wireType, depth + 1);
            }
            break;
        case 5:
            this.skip(4);
            break;

        /* istanbul ignore next */
        default:
            throw Error("invalid wire type " + wireType + " at offset " + this.pos);
    }
    return this;
};

Reader._configure = function(BufferReader_) {
    BufferReader = BufferReader_;
    Reader.create = create();
    BufferReader._configure();

    var fn = util.Long ? "toLong" : /* istanbul ignore next */ "toNumber";
    util.merge(Reader.prototype, {

        int64: function read_int64() {
            return readLongVarint.call(this)[fn](false);
        },

        uint64: function read_uint64() {
            return readLongVarint.call(this)[fn](true);
        },

        sint64: function read_sint64() {
            return readLongVarint.call(this).zzDecode()[fn](false);
        },

        fixed64: function read_fixed64() {
            return readFixed64.call(this)[fn](true);
        },

        sfixed64: function read_sfixed64() {
            return readFixed64.call(this)[fn](false);
        }

    });
};

},{"./util/minimal":92}],87:[function(require,module,exports){
"use strict";
module.exports = BufferReader;

// extends Reader
var Reader = require("./reader");
(BufferReader.prototype = Object.create(Reader.prototype)).constructor = BufferReader;

var util = require("./util/minimal");

/**
 * Constructs a new buffer reader instance.
 * @classdesc Wire format reader using node buffers.
 * @extends Reader
 * @constructor
 * @param {Buffer} buffer Buffer to read from
 */
function BufferReader(buffer) {
    Reader.call(this, buffer);

    /**
     * Read buffer.
     * @name BufferReader#buf
     * @type {Buffer}
     */
}

BufferReader._configure = function () {
    /* istanbul ignore else */
    if (util.Buffer)
        BufferReader.prototype._slice = util.Buffer.prototype.slice;
};


/**
 * @override
 */
BufferReader.prototype.string = function read_string_buffer() {
    var len = this.uint32(); // modifies pos
    return this.buf.utf8Slice
        ? this.buf.utf8Slice(this.pos, this.pos = Math.min(this.pos + len, this.len))
        : this.buf.toString("utf-8", this.pos, this.pos = Math.min(this.pos + len, this.len));
};

/**
 * Reads a sequence of bytes preceeded by its length as a varint.
 * @name BufferReader#bytes
 * @function
 * @returns {Buffer} Value read
 */

BufferReader._configure();

},{"./reader":86,"./util/minimal":92}],88:[function(require,module,exports){
"use strict";
module.exports = Object.create(null);

/**
 * Named roots.
 * This is where pbjs stores generated structures (the option `-r, --root` specifies a name).
 * Can also be used manually to make roots available across modules.
 * @name roots
 * @type {Object.<string,Root>}
 * @example
 * // pbjs -r myroot -o compiled.js ...
 *
 * // in another module:
 * require("./compiled.js");
 *
 * // in any subsequent module:
 * var root = protobuf.roots["myroot"];
 */

},{}],89:[function(require,module,exports){
"use strict";

/**
 * Streaming RPC helpers.
 * @namespace
 */
var rpc = exports;

/**
 * RPC implementation passed to {@link Service#create} performing a service request on network level, i.e. by utilizing http requests or websockets.
 * @typedef RPCImpl
 * @type {function}
 * @param {Method|rpc.ServiceMethod<Message<{}>,Message<{}>>} method Reflected or static method being called
 * @param {Uint8Array} requestData Request data
 * @param {RPCImplCallback} callback Callback function
 * @returns {undefined}
 * @example
 * function rpcImpl(method, requestData, callback) {
 *     if (protobuf.util.lcFirst(method.name) !== "myMethod") // compatible with static code
 *         throw Error("no such method");
 *     asynchronouslyObtainAResponse(requestData, function(err, responseData) {
 *         callback(err, responseData);
 *     });
 * }
 */

/**
 * Node-style callback as used by {@link RPCImpl}.
 * @typedef RPCImplCallback
 * @type {function}
 * @param {Error|null} error Error, if any, otherwise `null`
 * @param {Uint8Array|null} [response] Response data or `null` to signal end of stream, if there hasn't been an error
 * @returns {undefined}
 */

rpc.Service = require("./rpc/service");

},{"./rpc/service":90}],90:[function(require,module,exports){
"use strict";
module.exports = Service;

var util = require("../util/minimal");

// Extends EventEmitter
(Service.prototype = Object.create(util.EventEmitter.prototype)).constructor = Service;

/**
 * A service method callback as used by {@link rpc.ServiceMethod|ServiceMethod}.
 *
 * Differs from {@link RPCImplCallback} in that it is an actual callback of a service method which may not return `response = null`.
 * @typedef rpc.ServiceMethodCallback
 * @template TRes extends Message<TRes>
 * @type {function}
 * @param {Error|null} error Error, if any
 * @param {TRes} [response] Response message
 * @returns {undefined}
 */

/**
 * A service method part of a {@link rpc.Service} as created by {@link Service.create}.
 * @typedef rpc.ServiceMethod
 * @template TReq extends Message<TReq>
 * @template TRes extends Message<TRes>
 * @type {function}
 * @param {TReq|Properties<TReq>} request Request message or plain object
 * @param {rpc.ServiceMethodCallback<TRes>} [callback] Node-style callback called with the error, if any, and the response message
 * @returns {Promise<Message<TRes>>} Promise if `callback` has been omitted, otherwise `undefined`
 */

/**
 * Constructs a new RPC service instance.
 * @classdesc An RPC service as returned by {@link Service#create}.
 * @exports rpc.Service
 * @extends util.EventEmitter
 * @constructor
 * @param {RPCImpl} rpcImpl RPC implementation
 * @param {boolean} [requestDelimited=false] Whether requests are length-delimited
 * @param {boolean} [responseDelimited=false] Whether responses are length-delimited
 */
function Service(rpcImpl, requestDelimited, responseDelimited) {

    if (typeof rpcImpl !== "function")
        throw TypeError("rpcImpl must be a function");

    util.EventEmitter.call(this);

    /**
     * RPC implementation. Becomes `null` once the service is ended.
     * @type {RPCImpl|null}
     */
    this.rpcImpl = rpcImpl;

    /**
     * Whether requests are length-delimited.
     * @type {boolean}
     */
    this.requestDelimited = Boolean(requestDelimited);

    /**
     * Whether responses are length-delimited.
     * @type {boolean}
     */
    this.responseDelimited = Boolean(responseDelimited);
}

/**
 * Calls a service method through {@link rpc.Service#rpcImpl|rpcImpl}.
 * @param {Method|rpc.ServiceMethod<TReq,TRes>} method Reflected or static method
 * @param {Constructor<TReq>} requestCtor Request constructor
 * @param {Constructor<TRes>} responseCtor Response constructor
 * @param {TReq|Properties<TReq>} request Request message or plain object
 * @param {rpc.ServiceMethodCallback<TRes>} callback Service callback
 * @returns {undefined}
 * @template TReq extends Message<TReq>
 * @template TRes extends Message<TRes>
 */
Service.prototype.rpcCall = function rpcCall(method, requestCtor, responseCtor, request, callback) {

    if (!request)
        throw TypeError("request must be specified");

    var self = this;
    if (!callback)
        return util.asPromise(rpcCall, self, method, requestCtor, responseCtor, request);

    if (!self.rpcImpl) {
        setTimeout(function() { callback(Error("already ended")); }, 0);
        return undefined;
    }

    try {
        return self.rpcImpl(
            method,
            requestCtor[self.requestDelimited ? "encodeDelimited" : "encode"](request).finish(),
            function rpcCallback(err, response) {

                if (err) {
                    self.emit("error", err, method);
                    return callback(err);
                }

                if (response === null) {
                    self.end(/* endedByRPC */ true);
                    return undefined;
                }

                if (!(response instanceof responseCtor)) {
                    try {
                        response = responseCtor[self.responseDelimited ? "decodeDelimited" : "decode"](response);
                    } catch (err) {
                        self.emit("error", err, method);
                        return callback(err);
                    }
                }

                self.emit("data", response, method);
                return callback(null, response);
            }
        );
    } catch (err) {
        self.emit("error", err, method);
        setTimeout(function() { callback(err); }, 0);
        return undefined;
    }
};

/**
 * Ends this service and emits the `end` event.
 * @param {boolean} [endedByRPC=false] Whether the service has been ended by the RPC implementation.
 * @returns {rpc.Service} `this`
 */
Service.prototype.end = function end(endedByRPC) {
    if (this.rpcImpl) {
        if (!endedByRPC) // signal end to rpcImpl
            this.rpcImpl(null, null, null);
        this.rpcImpl = null;
        this.emit("end").off();
    }
    return this;
};

},{"../util/minimal":92}],91:[function(require,module,exports){
"use strict";
module.exports = LongBits;

var util = require("../util/minimal");

/**
 * Constructs new long bits.
 * @classdesc Helper class for working with the low and high bits of a 64 bit value.
 * @memberof util
 * @constructor
 * @param {number} lo Low 32 bits, unsigned
 * @param {number} hi High 32 bits, unsigned
 */
function LongBits(lo, hi) {

    // note that the casts below are theoretically unnecessary as of today, but older statically
    // generated converter code might still call the ctor with signed 32bits. kept for compat.

    /**
     * Low bits.
     * @type {number}
     */
    this.lo = lo >>> 0;

    /**
     * High bits.
     * @type {number}
     */
    this.hi = hi >>> 0;
}

/**
 * Zero bits.
 * @memberof util.LongBits
 * @type {util.LongBits}
 */
var zero = LongBits.zero = new LongBits(0, 0);

zero.toNumber = function() { return 0; };
zero.zzEncode = zero.zzDecode = function() { return this; };
zero.length = function() { return 1; };

/**
 * Zero hash.
 * @memberof util.LongBits
 * @type {string}
 */
var zeroHash = LongBits.zeroHash = "\0\0\0\0\0\0\0\0";

/**
 * Constructs new long bits from the specified number.
 * @param {number} value Value
 * @returns {util.LongBits} Instance
 */
LongBits.fromNumber = function fromNumber(value) {
    if (value === 0)
        return zero;
    var sign = value < 0;
    if (sign)
        value = -value;
    var lo = value >>> 0,
        hi = (value - lo) / 4294967296 >>> 0;
    if (sign) {
        hi = ~hi >>> 0;
        lo = ~lo >>> 0;
        if (++lo > 4294967295) {
            lo = 0;
            if (++hi > 4294967295)
                hi = 0;
        }
    }
    return new LongBits(lo, hi);
};

/**
 * Constructs new long bits from a number, long or string.
 * @param {Long|number|string} value Value
 * @returns {util.LongBits} Instance
 */
LongBits.from = function from(value) {
    if (typeof value === "number")
        return LongBits.fromNumber(value);
    if (util.isString(value)) {
        /* istanbul ignore else */
        if (util.Long)
            value = util.Long.fromString(value);
        else
            return LongBits.fromNumber(parseInt(value, 10));
    }
    return value.low || value.high ? new LongBits(value.low >>> 0, value.high >>> 0) : zero;
};

/**
 * Converts this long bits to a possibly unsafe JavaScript number.
 * @param {boolean} [unsigned=false] Whether unsigned or not
 * @returns {number} Possibly unsafe number
 */
LongBits.prototype.toNumber = function toNumber(unsigned) {
    if (!unsigned && this.hi >>> 31) {
        var lo = ~this.lo + 1 >>> 0,
            hi = ~this.hi     >>> 0;
        if (!lo)
            hi = hi + 1 >>> 0;
        return -(lo + hi * 4294967296);
    }
    return this.lo + this.hi * 4294967296;
};

/**
 * Converts this long bits to a long.
 * @param {boolean} [unsigned=false] Whether unsigned or not
 * @returns {Long} Long
 */
LongBits.prototype.toLong = function toLong(unsigned) {
    return util.Long
        ? new util.Long(this.lo | 0, this.hi | 0, Boolean(unsigned))
        /* istanbul ignore next */
        : { low: this.lo | 0, high: this.hi | 0, unsigned: Boolean(unsigned) };
};

var charCodeAt = String.prototype.charCodeAt;

/**
 * Constructs new long bits from the specified 8 characters long hash.
 * @param {string} hash Hash
 * @returns {util.LongBits} Bits
 */
LongBits.fromHash = function fromHash(hash) {
    if (hash === zeroHash)
        return zero;
    return new LongBits(
        ( charCodeAt.call(hash, 0)
        | charCodeAt.call(hash, 1) << 8
        | charCodeAt.call(hash, 2) << 16
        | charCodeAt.call(hash, 3) << 24) >>> 0
    ,
        ( charCodeAt.call(hash, 4)
        | charCodeAt.call(hash, 5) << 8
        | charCodeAt.call(hash, 6) << 16
        | charCodeAt.call(hash, 7) << 24) >>> 0
    );
};

/**
 * Converts this long bits to a 8 characters long hash.
 * @returns {string} Hash
 */
LongBits.prototype.toHash = function toHash() {
    return String.fromCharCode(
        this.lo        & 255,
        this.lo >>> 8  & 255,
        this.lo >>> 16 & 255,
        this.lo >>> 24      ,
        this.hi        & 255,
        this.hi >>> 8  & 255,
        this.hi >>> 16 & 255,
        this.hi >>> 24
    );
};

/**
 * Zig-zag encodes this long bits.
 * @returns {util.LongBits} `this`
 */
LongBits.prototype.zzEncode = function zzEncode() {
    var mask =   this.hi >> 31;
    this.hi  = ((this.hi << 1 | this.lo >>> 31) ^ mask) >>> 0;
    this.lo  = ( this.lo << 1                   ^ mask) >>> 0;
    return this;
};

/**
 * Zig-zag decodes this long bits.
 * @returns {util.LongBits} `this`
 */
LongBits.prototype.zzDecode = function zzDecode() {
    var mask = -(this.lo & 1);
    this.lo  = ((this.lo >>> 1 | this.hi << 31) ^ mask) >>> 0;
    this.hi  = ( this.hi >>> 1                  ^ mask) >>> 0;
    return this;
};

/**
 * Calculates the length of this longbits when encoded as a varint.
 * @returns {number} Length
 */
LongBits.prototype.length = function length() {
    var part0 =  this.lo,
        part1 = (this.lo >>> 28 | this.hi << 4) >>> 0,
        part2 =  this.hi >>> 24;
    return part2 === 0
         ? part1 === 0
           ? part0 < 16384
             ? part0 < 128 ? 1 : 2
             : part0 < 2097152 ? 3 : 4
           : part1 < 16384
             ? part1 < 128 ? 5 : 6
             : part1 < 2097152 ? 7 : 8
         : part2 < 128 ? 9 : 10;
};

},{"../util/minimal":92}],92:[function(require,module,exports){
(function (global){(function (){
"use strict";
var util = exports;

// used to return a Promise where callback is omitted
util.asPromise = require("@protobufjs/aspromise");

// converts to / from base64 encoded strings
util.base64 = require("@protobufjs/base64");

// base class of rpc.Service
util.EventEmitter = require("@protobufjs/eventemitter");

// float handling accross browsers
util.float = require("@protobufjs/float");

// converts to / from utf8 encoded strings
util.utf8 = require("@protobufjs/utf8");

// provides a node-like buffer pool in the browser
util.pool = require("@protobufjs/pool");

// utility to work with the low and high bits of a 64 bit value
util.LongBits = require("./longbits");

/**
 * Tests if the specified key can affect object prototypes.
 * @memberof util
 * @param {string} key Key to test
 * @returns {boolean} `true` if the key is unsafe
 */
function isUnsafeProperty(key) {
    return key === "__proto__" || key === "prototype" || key === "constructor";
}

util.isUnsafeProperty = isUnsafeProperty;

/**
 * Whether running within node or not.
 * @memberof util
 * @type {boolean}
 */
util.isNode = Boolean(typeof global !== "undefined"
                   && global
                   && global.process
                   && global.process.versions
                   && global.process.versions.node);

/**
 * Global object reference.
 * @memberof util
 * @type {Object}
 */
util.global = util.isNode && global
           || typeof window !== "undefined" && window
           || typeof self   !== "undefined" && self
           || this; // eslint-disable-line no-invalid-this

/**
 * An immuable empty array.
 * @memberof util
 * @type {Array.<*>}
 * @const
 */
util.emptyArray = Object.freeze ? Object.freeze([]) : /* istanbul ignore next */ []; // used on prototypes

/**
 * An immutable empty object.
 * @type {Object}
 * @const
 */
util.emptyObject = Object.freeze ? Object.freeze({}) : /* istanbul ignore next */ {}; // used on prototypes

/**
 * Tests if the specified value is an integer.
 * @function
 * @param {*} value Value to test
 * @returns {boolean} `true` if the value is an integer
 */
util.isInteger = Number.isInteger || /* istanbul ignore next */ function isInteger(value) {
    return typeof value === "number" && isFinite(value) && Math.floor(value) === value;
};

/**
 * Tests if the specified value is a string.
 * @param {*} value Value to test
 * @returns {boolean} `true` if the value is a string
 */
util.isString = function isString(value) {
    return typeof value === "string" || value instanceof String;
};

/**
 * Tests if the specified value is a non-null object.
 * @param {*} value Value to test
 * @returns {boolean} `true` if the value is a non-null object
 */
util.isObject = function isObject(value) {
    return value && typeof value === "object";
};

/**
 * Checks if a property on a message is considered to be present.
 * This is an alias of {@link util.isSet}.
 * @function
 * @param {Object} obj Plain object or message instance
 * @param {string} prop Property name
 * @returns {boolean} `true` if considered to be present, otherwise `false`
 */
util.isset =

/**
 * Checks if a property on a message is considered to be present.
 * @param {Object} obj Plain object or message instance
 * @param {string} prop Property name
 * @returns {boolean} `true` if considered to be present, otherwise `false`
 */
util.isSet = function isSet(obj, prop) {
    var value = obj[prop];
    if (value != null && Object.hasOwnProperty.call(obj, prop)) // eslint-disable-line eqeqeq
        return typeof value !== "object" || (Array.isArray(value) ? value.length : Object.keys(value).length) > 0;
    return false;
};

/**
 * Any compatible Buffer instance.
 * This is a minimal stand-alone definition of a Buffer instance. The actual type is that exported by node's typings.
 * @interface Buffer
 * @extends Uint8Array
 */

/**
 * Node's Buffer class if available.
 * @type {Constructor<Buffer>}
 */
util.Buffer = (function() {
    try {
        var Buffer = util.global.Buffer;
        // refuse to use non-node buffers if not explicitly assigned (perf reasons):
        return Buffer.prototype.utf8Write ? Buffer : /* istanbul ignore next */ null;
    } catch (e) {
        /* istanbul ignore next */
        return null;
    }
})();

// Internal alias of or polyfull for Buffer.from.
util._Buffer_from = null;

// Internal alias of or polyfill for Buffer.allocUnsafe.
util._Buffer_allocUnsafe = null;

/**
 * Creates a new buffer of whatever type supported by the environment.
 * @param {number|number[]} [sizeOrArray=0] Buffer size or number array
 * @returns {Uint8Array|Buffer} Buffer
 */
util.newBuffer = function newBuffer(sizeOrArray) {
    /* istanbul ignore next */
    return typeof sizeOrArray === "number"
        ? util.Buffer
            ? util._Buffer_allocUnsafe(sizeOrArray)
            : new util.Array(sizeOrArray)
        : util.Buffer
            ? util._Buffer_from(sizeOrArray)
            : typeof Uint8Array === "undefined"
                ? sizeOrArray
                : new Uint8Array(sizeOrArray);
};

/**
 * Array implementation used in the browser. `Uint8Array` if supported, otherwise `Array`.
 * @type {Constructor<Uint8Array>}
 */
util.Array = typeof Uint8Array !== "undefined" ? Uint8Array /* istanbul ignore next */ : Array;

/**
 * Any compatible Long instance.
 * This is a minimal stand-alone definition of a Long instance. The actual type is that exported by long.js.
 * @interface Long
 * @property {number} low Low bits
 * @property {number} high High bits
 * @property {boolean} unsigned Whether unsigned or not
 */

/**
 * Long.js's Long class if available.
 * @type {Constructor<Long>}
 */
util.Long = /* istanbul ignore next */ util.global.dcodeIO && /* istanbul ignore next */ util.global.dcodeIO.Long
         || /* istanbul ignore next */ util.global.Long
         || (function() {
                try {
                    var Long = require("long");
                    return Long && Long.isLong ? Long : null;
                } catch (e) {
                    /* istanbul ignore next */
                    return null;
                }
            })();

/**
 * Regular expression used to verify 2 bit (`bool`) map keys.
 * @type {RegExp}
 * @const
 */
util.key2Re = /^true|false|0|1$/;

/**
 * Regular expression used to verify 32 bit (`int32` etc.) map keys.
 * @type {RegExp}
 * @const
 */
util.key32Re = /^-?(?:0|[1-9][0-9]*)$/;

/**
 * Regular expression used to verify 64 bit (`int64` etc.) map keys.
 * @type {RegExp}
 * @const
 */
util.key64Re = /^(?:[\\x00-\\xff]{8}|-?(?:0|[1-9][0-9]*))$/;

/**
 * Converts a number or long to an 8 characters long hash string.
 * @param {Long|number} value Value to convert
 * @returns {string} Hash
 */
util.longToHash = function longToHash(value) {
    return value
        ? util.LongBits.from(value).toHash()
        : util.LongBits.zeroHash;
};

/**
 * Converts an 8 characters long hash string to a long or number.
 * @param {string} hash Hash
 * @param {boolean} [unsigned=false] Whether unsigned or not
 * @returns {Long|number} Original value
 */
util.longFromHash = function longFromHash(hash, unsigned) {
    var bits = util.LongBits.fromHash(hash);
    if (util.Long)
        return util.Long.fromBits(bits.lo, bits.hi, unsigned);
    return bits.toNumber(Boolean(unsigned));
};

/**
 * Merges the properties of the source object into the destination object.
 * @memberof util
 * @param {Object.<string,*>} dst Destination object
 * @param {...(Object.<string,*>|boolean)} src Source objects, optionally followed by an `ifNotSet` flag
 * @returns {Object.<string,*>} Destination object
 */
function merge(dst) { // used by converters
    var ifNotSet = typeof arguments[arguments.length - 1] === "boolean",
        limit = ifNotSet ? arguments.length - 1 : arguments.length;
    ifNotSet = ifNotSet && arguments[arguments.length - 1];
    for (var a = 1; a < limit; ++a) {
        var src = arguments[a];
        if (!src)
            continue;
        for (var keys = Object.keys(src), i = 0; i < keys.length; ++i)
            if (!isUnsafeProperty(keys[i]) && (dst[keys[i]] === undefined || !ifNotSet))
                dst[keys[i]] = src[keys[i]];
    }
    return dst;
}

util.merge = merge;

/**
 * Schema declaration nesting limit.
 * @memberof util
 * @type {number}
 */
util.nestingLimit = 32; // protoc: MaxMessageDeclarationNestingDepth

/**
 * Recursion limit.
 * @memberof util
 * @type {number}
 */
util.recursionLimit = 100; // protoc: CodedInputStream::default_recursion_limit_

/**
 * Makes a property safe for assignment as an own property.
 * @memberof util
 * @param {Object.<string,*>} obj Object
 * @param {string} key Property key
 * @returns {undefined}
 */
util.makeProp = function makeProp(obj, key) {
    Object.defineProperty(obj, key, {
        enumerable: true,
        configurable: true,
        writable: true
    });
};

/**
 * Converts the first character of a string to lower case.
 * @param {string} str String to convert
 * @returns {string} Converted string
 */
util.lcFirst = function lcFirst(str) {
    return str.charAt(0).toLowerCase() + str.substring(1);
};

/**
 * Creates a custom error constructor.
 * @memberof util
 * @param {string} name Error name
 * @returns {Constructor<Error>} Custom error constructor
 */
function newError(name) {

    function CustomError(message, properties) {

        if (!(this instanceof CustomError))
            return new CustomError(message, properties);

        // Error.call(this, message);
        // ^ just returns a new error instance because the ctor can be called as a function

        Object.defineProperty(this, "message", { get: function() { return message; } });

        /* istanbul ignore next */
        if (Error.captureStackTrace) // node
            Error.captureStackTrace(this, CustomError);
        else
            Object.defineProperty(this, "stack", { value: new Error().stack || "" });

        if (properties)
            merge(this, properties);
    }

    CustomError.prototype = Object.create(Error.prototype, {
        constructor: {
            value: CustomError,
            writable: true,
            enumerable: false,
            configurable: true,
        },
        name: {
            get: function get() { return name; },
            set: undefined,
            enumerable: false,
            // configurable: false would accurately preserve the behavior of
            // the original, but I'm guessing that was not intentional.
            // For an actual error subclass, this property would
            // be configurable.
            configurable: true,
        },
        toString: {
            value: function value() { return this.name + ": " + this.message; },
            writable: true,
            enumerable: false,
            configurable: true,
        },
    });

    return CustomError;
}

util.newError = newError;

/**
 * Constructs a new protocol error.
 * @classdesc Error subclass indicating a protocol specifc error.
 * @memberof util
 * @extends Error
 * @template T extends Message<T>
 * @constructor
 * @param {string} message Error message
 * @param {Object.<string,*>} [properties] Additional properties
 * @example
 * try {
 *     MyMessage.decode(someBuffer); // throws if required fields are missing
 * } catch (e) {
 *     if (e instanceof ProtocolError && e.instance)
 *         console.log("decoded so far: " + JSON.stringify(e.instance));
 * }
 */
util.ProtocolError = newError("ProtocolError");

/**
 * So far decoded message instance.
 * @name util.ProtocolError#instance
 * @type {Message<T>}
 */

/**
 * A OneOf getter as returned by {@link util.oneOfGetter}.
 * @typedef OneOfGetter
 * @type {function}
 * @returns {string|undefined} Set field name, if any
 */

/**
 * Builds a getter for a oneof's present field name.
 * @param {string[]} fieldNames Field names
 * @returns {OneOfGetter} Unbound getter
 */
util.oneOfGetter = function getOneOf(fieldNames) {
    var fieldMap = {};
    for (var i = 0; i < fieldNames.length; ++i)
        fieldMap[fieldNames[i]] = 1;

    /**
     * @returns {string|undefined} Set field name, if any
     * @this Object
     * @ignore
     */
    return function() { // eslint-disable-line consistent-return
        for (var keys = Object.keys(this), i = keys.length - 1; i > -1; --i)
            if (fieldMap[keys[i]] === 1 && this[keys[i]] !== undefined && this[keys[i]] !== null)
                return keys[i];
    };
};

/**
 * A OneOf setter as returned by {@link util.oneOfSetter}.
 * @typedef OneOfSetter
 * @type {function}
 * @param {string|undefined} value Field name
 * @returns {undefined}
 */

/**
 * Builds a setter for a oneof's present field name.
 * @param {string[]} fieldNames Field names
 * @returns {OneOfSetter} Unbound setter
 */
util.oneOfSetter = function setOneOf(fieldNames) {

    /**
     * @param {string} name Field name
     * @returns {undefined}
     * @this Object
     * @ignore
     */
    return function(name) {
        for (var i = 0; i < fieldNames.length; ++i)
            if (fieldNames[i] !== name)
                delete this[fieldNames[i]];
    };
};

/**
 * Default conversion options used for {@link Message#toJSON} implementations.
 *
 * These options are close to proto3's JSON mapping with the exception that internal types like Any are handled just like messages. More precisely:
 *
 * - Longs become strings
 * - Enums become string keys
 * - Bytes become base64 encoded strings
 * - (Sub-)Messages become plain objects
 * - Maps become plain objects with all string keys
 * - Repeated fields become arrays
 * - NaN and Infinity for float and double fields become strings
 *
 * @type {IConversionOptions}
 * @see https://developers.google.com/protocol-buffers/docs/proto3?hl=en#json
 */
util.toJSONOptions = {
    longs: String,
    enums: String,
    bytes: String,
    json: true
};

// Sets up buffer utility according to the environment (called in index-minimal)
util._configure = function() {
    var Buffer = util.Buffer;
    /* istanbul ignore if */
    if (!Buffer) {
        util._Buffer_from = util._Buffer_allocUnsafe = null;
        return;
    }
    // because node 4.x buffers are incompatible & immutable
    // see: https://github.com/dcodeIO/protobuf.js/pull/665
    util._Buffer_from = Buffer.from !== Uint8Array.from && Buffer.from ||
        /* istanbul ignore next */
        function Buffer_from(value, encoding) {
            return new Buffer(value, encoding);
        };
    util._Buffer_allocUnsafe = Buffer.allocUnsafe ||
        /* istanbul ignore next */
        function Buffer_allocUnsafe(size) {
            return new Buffer(size);
        };
};

}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"./longbits":91,"@protobufjs/aspromise":35,"@protobufjs/base64":36,"@protobufjs/eventemitter":37,"@protobufjs/float":38,"@protobufjs/pool":39,"@protobufjs/utf8":40,"long":82}],93:[function(require,module,exports){
"use strict";
module.exports = Writer;

var util      = require("./util/minimal");

var BufferWriter; // cyclic

var LongBits  = util.LongBits,
    base64    = util.base64,
    utf8      = util.utf8;

/**
 * Constructs a new writer operation instance.
 * @classdesc Scheduled writer operation.
 * @constructor
 * @param {function(*, Uint8Array, number)} fn Function to call
 * @param {number} len Value byte length
 * @param {*} val Value to write
 * @ignore
 */
function Op(fn, len, val) {

    /**
     * Function to call.
     * @type {function(Uint8Array, number, *)}
     */
    this.fn = fn;

    /**
     * Value byte length.
     * @type {number}
     */
    this.len = len;

    /**
     * Next operation.
     * @type {Writer.Op|undefined}
     */
    this.next = undefined;

    /**
     * Value to write.
     * @type {*}
     */
    this.val = val; // type varies
}

/* istanbul ignore next */
function noop() {} // eslint-disable-line no-empty-function

/**
 * Constructs a new writer state instance.
 * @classdesc Copied writer state.
 * @memberof Writer
 * @constructor
 * @param {Writer} writer Writer to copy state from
 * @ignore
 */
function State(writer) {

    /**
     * Current head.
     * @type {Writer.Op}
     */
    this.head = writer.head;

    /**
     * Current tail.
     * @type {Writer.Op}
     */
    this.tail = writer.tail;

    /**
     * Current buffer length.
     * @type {number}
     */
    this.len = writer.len;

    /**
     * Next state.
     * @type {State|null}
     */
    this.next = writer.states;
}

/**
 * Constructs a new writer instance.
 * @classdesc Wire format writer using `Uint8Array` if available, otherwise `Array`.
 * @constructor
 */
function Writer() {

    /**
     * Current length.
     * @type {number}
     */
    this.len = 0;

    /**
     * Operations head.
     * @type {Object}
     */
    this.head = new Op(noop, 0, 0);

    /**
     * Operations tail
     * @type {Object}
     */
    this.tail = this.head;

    /**
     * Linked forked states.
     * @type {Object|null}
     */
    this.states = null;

    // When a value is written, the writer calculates its byte length and puts it into a linked
    // list of operations to perform when finish() is called. This both allows us to allocate
    // buffers of the exact required size and reduces the amount of work we have to do compared
    // to first calculating over objects and then encoding over objects. In our case, the encoding
    // part is just a linked list walk calling operations with already prepared values.
}

var create = function create() {
    return util.Buffer
        ? function create_buffer_setup() {
            return (Writer.create = function create_buffer() {
                return new BufferWriter();
            })();
        }
        /* istanbul ignore next */
        : function create_array() {
            return new Writer();
        };
};

/**
 * Creates a new writer.
 * @function
 * @returns {BufferWriter|Writer} A {@link BufferWriter} when Buffers are supported, otherwise a {@link Writer}
 */
Writer.create = create();

/**
 * Allocates a buffer of the specified size.
 * @param {number} size Buffer size
 * @returns {Uint8Array} Buffer
 */
Writer.alloc = function alloc(size) {
    return new util.Array(size);
};

// Use Uint8Array buffer pool in the browser, just like node does with buffers
/* istanbul ignore else */
if (util.Array !== Array)
    Writer.alloc = util.pool(Writer.alloc, util.Array.prototype.subarray);

/**
 * Pushes a new operation to the queue.
 * @param {function(Uint8Array, number, *)} fn Function to call
 * @param {number} len Value byte length
 * @param {number} val Value to write
 * @returns {Writer} `this`
 * @private
 */
Writer.prototype._push = function push(fn, len, val) {
    this.tail = this.tail.next = new Op(fn, len, val);
    this.len += len;
    return this;
};

function writeByte(val, buf, pos) {
    buf[pos] = val & 255;
}

function writeVarint32(val, buf, pos) {
    while (val > 127) {
        buf[pos++] = val & 127 | 128;
        val >>>= 7;
    }
    buf[pos] = val;
}

/**
 * Constructs a new varint writer operation instance.
 * @classdesc Scheduled varint writer operation.
 * @extends Op
 * @constructor
 * @param {number} len Value byte length
 * @param {number} val Value to write
 * @ignore
 */
function VarintOp(len, val) {
    this.len = len;
    this.next = undefined;
    this.val = val;
}

VarintOp.prototype = Object.create(Op.prototype);
VarintOp.prototype.fn = writeVarint32;

/**
 * Writes an unsigned 32 bit value as a varint.
 * @param {number} value Value to write
 * @returns {Writer} `this`
 */
Writer.prototype.uint32 = function write_uint32(value) {
    // here, the call to this.push has been inlined and a varint specific Op subclass is used.
    // uint32 is by far the most frequently used operation and benefits significantly from this.
    this.len += (this.tail = this.tail.next = new VarintOp(
        (value = value >>> 0)
                < 128       ? 1
        : value < 16384     ? 2
        : value < 2097152   ? 3
        : value < 268435456 ? 4
        :                     5,
    value)).len;
    return this;
};

/**
 * Writes a signed 32 bit value as a varint.
 * @function
 * @param {number} value Value to write
 * @returns {Writer} `this`
 */
Writer.prototype.int32 = function write_int32(value) {
    return (value |= 0) < 0
        ? this._push(writeVarint64, 10, LongBits.fromNumber(value)) // 10 bytes per spec
        : this.uint32(value);
};

/**
 * Writes a 32 bit value as a varint, zig-zag encoded.
 * @param {number} value Value to write
 * @returns {Writer} `this`
 */
Writer.prototype.sint32 = function write_sint32(value) {
    return this.uint32((value << 1 ^ value >> 31) >>> 0);
};

function writeVarint64(val, buf, pos) {
    var lo = val.lo,
        hi = val.hi;
    while (hi) {
        buf[pos++] = lo & 127 | 128;
        lo = (lo >>> 7 | hi << 25) >>> 0;
        hi >>>= 7;
    }
    while (lo > 127) {
        buf[pos++] = lo & 127 | 128;
        lo = lo >>> 7;
    }
    buf[pos++] = lo;
}

/**
 * Writes an unsigned 64 bit value as a varint.
 * @param {Long|number|string} value Value to write
 * @returns {Writer} `this`
 * @throws {TypeError} If `value` is a string and no long library is present.
 */
Writer.prototype.uint64 = function write_uint64(value) {
    var bits = LongBits.from(value);
    return this._push(writeVarint64, bits.length(), bits);
};

/**
 * Writes a signed 64 bit value as a varint.
 * @function
 * @param {Long|number|string} value Value to write
 * @returns {Writer} `this`
 * @throws {TypeError} If `value` is a string and no long library is present.
 */
Writer.prototype.int64 = Writer.prototype.uint64;

/**
 * Writes a signed 64 bit value as a varint, zig-zag encoded.
 * @param {Long|number|string} value Value to write
 * @returns {Writer} `this`
 * @throws {TypeError} If `value` is a string and no long library is present.
 */
Writer.prototype.sint64 = function write_sint64(value) {
    var bits = LongBits.from(value).zzEncode();
    return this._push(writeVarint64, bits.length(), bits);
};

/**
 * Writes a boolish value as a varint.
 * @param {boolean} value Value to write
 * @returns {Writer} `this`
 */
Writer.prototype.bool = function write_bool(value) {
    return this._push(writeByte, 1, value ? 1 : 0);
};

function writeFixed32(val, buf, pos) {
    buf[pos    ] =  val         & 255;
    buf[pos + 1] =  val >>> 8   & 255;
    buf[pos + 2] =  val >>> 16  & 255;
    buf[pos + 3] =  val >>> 24;
}

/**
 * Writes an unsigned 32 bit value as fixed 32 bits.
 * @param {number} value Value to write
 * @returns {Writer} `this`
 */
Writer.prototype.fixed32 = function write_fixed32(value) {
    return this._push(writeFixed32, 4, value >>> 0);
};

/**
 * Writes a signed 32 bit value as fixed 32 bits.
 * @function
 * @param {number} value Value to write
 * @returns {Writer} `this`
 */
Writer.prototype.sfixed32 = Writer.prototype.fixed32;

/**
 * Writes an unsigned 64 bit value as fixed 64 bits.
 * @param {Long|number|string} value Value to write
 * @returns {Writer} `this`
 * @throws {TypeError} If `value` is a string and no long library is present.
 */
Writer.prototype.fixed64 = function write_fixed64(value) {
    var bits = LongBits.from(value);
    return this._push(writeFixed32, 4, bits.lo)._push(writeFixed32, 4, bits.hi);
};

/**
 * Writes a signed 64 bit value as fixed 64 bits.
 * @function
 * @param {Long|number|string} value Value to write
 * @returns {Writer} `this`
 * @throws {TypeError} If `value` is a string and no long library is present.
 */
Writer.prototype.sfixed64 = Writer.prototype.fixed64;

/**
 * Writes a float (32 bit).
 * @function
 * @param {number} value Value to write
 * @returns {Writer} `this`
 */
Writer.prototype.float = function write_float(value) {
    return this._push(util.float.writeFloatLE, 4, value);
};

/**
 * Writes a double (64 bit float).
 * @function
 * @param {number} value Value to write
 * @returns {Writer} `this`
 */
Writer.prototype.double = function write_double(value) {
    return this._push(util.float.writeDoubleLE, 8, value);
};

var writeBytes = util.Array.prototype.set
    ? function writeBytes_set(val, buf, pos) {
        buf.set(val, pos); // also works for plain array values
    }
    /* istanbul ignore next */
    : function writeBytes_for(val, buf, pos) {
        for (var i = 0; i < val.length; ++i)
            buf[pos + i] = val[i];
    };

/**
 * Writes a sequence of bytes.
 * @param {Uint8Array|string} value Buffer or base64 encoded string to write
 * @returns {Writer} `this`
 */
Writer.prototype.bytes = function write_bytes(value) {
    var len = value.length >>> 0;
    if (!len)
        return this._push(writeByte, 1, 0);
    if (util.isString(value)) {
        var buf = Writer.alloc(len = base64.length(value));
        base64.decode(value, buf, 0);
        value = buf;
    }
    return this.uint32(len)._push(writeBytes, len, value);
};

/**
 * Writes a string.
 * @param {string} value Value to write
 * @returns {Writer} `this`
 */
Writer.prototype.string = function write_string(value) {
    var len = utf8.length(value);
    return len
        ? this.uint32(len)._push(utf8.write, len, value)
        : this._push(writeByte, 1, 0);
};

/**
 * Forks this writer's state by pushing it to a stack.
 * Calling {@link Writer#reset|reset} or {@link Writer#ldelim|ldelim} resets the writer to the previous state.
 * @returns {Writer} `this`
 */
Writer.prototype.fork = function fork() {
    this.states = new State(this);
    this.head = this.tail = new Op(noop, 0, 0);
    this.len = 0;
    return this;
};

/**
 * Resets this instance to the last state.
 * @returns {Writer} `this`
 */
Writer.prototype.reset = function reset() {
    if (this.states) {
        this.head   = this.states.head;
        this.tail   = this.states.tail;
        this.len    = this.states.len;
        this.states = this.states.next;
    } else {
        this.head = this.tail = new Op(noop, 0, 0);
        this.len  = 0;
    }
    return this;
};

/**
 * Resets to the last state and appends the fork state's current write length as a varint followed by its operations.
 * @returns {Writer} `this`
 */
Writer.prototype.ldelim = function ldelim() {
    var head = this.head,
        tail = this.tail,
        len  = this.len;
    this.reset().uint32(len);
    if (len) {
        this.tail.next = head.next; // skip noop
        this.tail = tail;
        this.len += len;
    }
    return this;
};

/**
 * Finishes the write operation.
 * @returns {Uint8Array} Finished buffer
 */
Writer.prototype.finish = function finish() {
    var head = this.head.next, // skip noop
        buf  = this.constructor.alloc(this.len),
        pos  = 0;
    while (head) {
        head.fn(head.val, buf, pos);
        pos += head.len;
        head = head.next;
    }
    // this.head = this.tail = null;
    return buf;
};

Writer._configure = function(BufferWriter_) {
    BufferWriter = BufferWriter_;
    Writer.create = create();
    BufferWriter._configure();
};

},{"./util/minimal":92}],94:[function(require,module,exports){
"use strict";
module.exports = BufferWriter;

// extends Writer
var Writer = require("./writer");
(BufferWriter.prototype = Object.create(Writer.prototype)).constructor = BufferWriter;

var util = require("./util/minimal");

/**
 * Constructs a new buffer writer instance.
 * @classdesc Wire format writer using node buffers.
 * @extends Writer
 * @constructor
 */
function BufferWriter() {
    Writer.call(this);
}

BufferWriter._configure = function () {
    /**
     * Allocates a buffer of the specified size.
     * @function
     * @param {number} size Buffer size
     * @returns {Buffer} Buffer
     */
    BufferWriter.alloc = util._Buffer_allocUnsafe;

    BufferWriter.writeBytesBuffer = util.Buffer && util.Buffer.prototype instanceof Uint8Array && util.Buffer.prototype.set.name === "set"
        ? function writeBytesBuffer_set(val, buf, pos) {
          buf.set(val, pos); // faster than copy (requires node >= 4 where Buffers extend Uint8Array and set is properly inherited)
          // also works for plain array values
        }
        /* istanbul ignore next */
        : function writeBytesBuffer_copy(val, buf, pos) {
          if (val.copy) // Buffer values
            val.copy(buf, pos, 0, val.length);
          else for (var i = 0; i < val.length;) // plain array values
            buf[pos++] = val[i++];
        };
};


/**
 * @override
 */
BufferWriter.prototype.bytes = function write_bytes_buffer(value) {
    if (util.isString(value))
        value = util._Buffer_from(value, "base64");
    var len = value.length >>> 0;
    this.uint32(len);
    if (len)
        this._push(BufferWriter.writeBytesBuffer, len, value);
    return this;
};

function writeStringBuffer(val, buf, pos) {
    if (val.length < 40) // plain js is faster for short strings (probably due to redundant assertions)
        util.utf8.write(val, buf, pos);
    else if (buf.utf8Write)
        buf.utf8Write(val, pos);
    else
        buf.write(val, pos);
}

/**
 * @override
 */
BufferWriter.prototype.string = function write_string_buffer(value) {
    var len = util.Buffer.byteLength(value);
    this.uint32(len);
    if (len)
        this._push(writeStringBuffer, len, value);
    return this;
};


/**
 * Finishes the write operation.
 * @name BufferWriter#finish
 * @function
 * @returns {Buffer} Finished buffer
 */

BufferWriter._configure();

},{"./util/minimal":92,"./writer":93}],95:[function(require,module,exports){
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
    for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.interval = exports.iif = exports.generate = exports.fromEventPattern = exports.fromEvent = exports.from = exports.forkJoin = exports.empty = exports.defer = exports.connectable = exports.concat = exports.combineLatest = exports.bindNodeCallback = exports.bindCallback = exports.UnsubscriptionError = exports.TimeoutError = exports.SequenceError = exports.ObjectUnsubscribedError = exports.NotFoundError = exports.EmptyError = exports.ArgumentOutOfRangeError = exports.firstValueFrom = exports.lastValueFrom = exports.isObservable = exports.identity = exports.noop = exports.pipe = exports.NotificationKind = exports.Notification = exports.Subscriber = exports.Subscription = exports.Scheduler = exports.VirtualAction = exports.VirtualTimeScheduler = exports.animationFrameScheduler = exports.animationFrame = exports.queueScheduler = exports.queue = exports.asyncScheduler = exports.async = exports.asapScheduler = exports.asap = exports.AsyncSubject = exports.ReplaySubject = exports.BehaviorSubject = exports.Subject = exports.animationFrames = exports.observable = exports.ConnectableObservable = exports.Observable = void 0;
exports.filter = exports.expand = exports.exhaustMap = exports.exhaustAll = exports.exhaust = exports.every = exports.endWith = exports.elementAt = exports.distinctUntilKeyChanged = exports.distinctUntilChanged = exports.distinct = exports.dematerialize = exports.delayWhen = exports.delay = exports.defaultIfEmpty = exports.debounceTime = exports.debounce = exports.count = exports.connect = exports.concatWith = exports.concatMapTo = exports.concatMap = exports.concatAll = exports.combineLatestWith = exports.combineLatestAll = exports.combineAll = exports.catchError = exports.bufferWhen = exports.bufferToggle = exports.bufferTime = exports.bufferCount = exports.buffer = exports.auditTime = exports.audit = exports.config = exports.NEVER = exports.EMPTY = exports.scheduled = exports.zip = exports.using = exports.timer = exports.throwError = exports.range = exports.race = exports.partition = exports.pairs = exports.onErrorResumeNext = exports.of = exports.never = exports.merge = void 0;
exports.switchMap = exports.switchAll = exports.subscribeOn = exports.startWith = exports.skipWhile = exports.skipUntil = exports.skipLast = exports.skip = exports.single = exports.shareReplay = exports.share = exports.sequenceEqual = exports.scan = exports.sampleTime = exports.sample = exports.refCount = exports.retryWhen = exports.retry = exports.repeatWhen = exports.repeat = exports.reduce = exports.raceWith = exports.publishReplay = exports.publishLast = exports.publishBehavior = exports.publish = exports.pluck = exports.pairwise = exports.onErrorResumeNextWith = exports.observeOn = exports.multicast = exports.min = exports.mergeWith = exports.mergeScan = exports.mergeMapTo = exports.mergeMap = exports.flatMap = exports.mergeAll = exports.max = exports.materialize = exports.mapTo = exports.map = exports.last = exports.isEmpty = exports.ignoreElements = exports.groupBy = exports.first = exports.findIndex = exports.find = exports.finalize = void 0;
exports.zipWith = exports.zipAll = exports.withLatestFrom = exports.windowWhen = exports.windowToggle = exports.windowTime = exports.windowCount = exports.window = exports.toArray = exports.timestamp = exports.timeoutWith = exports.timeout = exports.timeInterval = exports.throwIfEmpty = exports.throttleTime = exports.throttle = exports.tap = exports.takeWhile = exports.takeUntil = exports.takeLast = exports.take = exports.switchScan = exports.switchMapTo = void 0;
var Observable_1 = require("./internal/Observable");
Object.defineProperty(exports, "Observable", { enumerable: true, get: function () { return Observable_1.Observable; } });
var ConnectableObservable_1 = require("./internal/observable/ConnectableObservable");
Object.defineProperty(exports, "ConnectableObservable", { enumerable: true, get: function () { return ConnectableObservable_1.ConnectableObservable; } });
var observable_1 = require("./internal/symbol/observable");
Object.defineProperty(exports, "observable", { enumerable: true, get: function () { return observable_1.observable; } });
var animationFrames_1 = require("./internal/observable/dom/animationFrames");
Object.defineProperty(exports, "animationFrames", { enumerable: true, get: function () { return animationFrames_1.animationFrames; } });
var Subject_1 = require("./internal/Subject");
Object.defineProperty(exports, "Subject", { enumerable: true, get: function () { return Subject_1.Subject; } });
var BehaviorSubject_1 = require("./internal/BehaviorSubject");
Object.defineProperty(exports, "BehaviorSubject", { enumerable: true, get: function () { return BehaviorSubject_1.BehaviorSubject; } });
var ReplaySubject_1 = require("./internal/ReplaySubject");
Object.defineProperty(exports, "ReplaySubject", { enumerable: true, get: function () { return ReplaySubject_1.ReplaySubject; } });
var AsyncSubject_1 = require("./internal/AsyncSubject");
Object.defineProperty(exports, "AsyncSubject", { enumerable: true, get: function () { return AsyncSubject_1.AsyncSubject; } });
var asap_1 = require("./internal/scheduler/asap");
Object.defineProperty(exports, "asap", { enumerable: true, get: function () { return asap_1.asap; } });
Object.defineProperty(exports, "asapScheduler", { enumerable: true, get: function () { return asap_1.asapScheduler; } });
var async_1 = require("./internal/scheduler/async");
Object.defineProperty(exports, "async", { enumerable: true, get: function () { return async_1.async; } });
Object.defineProperty(exports, "asyncScheduler", { enumerable: true, get: function () { return async_1.asyncScheduler; } });
var queue_1 = require("./internal/scheduler/queue");
Object.defineProperty(exports, "queue", { enumerable: true, get: function () { return queue_1.queue; } });
Object.defineProperty(exports, "queueScheduler", { enumerable: true, get: function () { return queue_1.queueScheduler; } });
var animationFrame_1 = require("./internal/scheduler/animationFrame");
Object.defineProperty(exports, "animationFrame", { enumerable: true, get: function () { return animationFrame_1.animationFrame; } });
Object.defineProperty(exports, "animationFrameScheduler", { enumerable: true, get: function () { return animationFrame_1.animationFrameScheduler; } });
var VirtualTimeScheduler_1 = require("./internal/scheduler/VirtualTimeScheduler");
Object.defineProperty(exports, "VirtualTimeScheduler", { enumerable: true, get: function () { return VirtualTimeScheduler_1.VirtualTimeScheduler; } });
Object.defineProperty(exports, "VirtualAction", { enumerable: true, get: function () { return VirtualTimeScheduler_1.VirtualAction; } });
var Scheduler_1 = require("./internal/Scheduler");
Object.defineProperty(exports, "Scheduler", { enumerable: true, get: function () { return Scheduler_1.Scheduler; } });
var Subscription_1 = require("./internal/Subscription");
Object.defineProperty(exports, "Subscription", { enumerable: true, get: function () { return Subscription_1.Subscription; } });
var Subscriber_1 = require("./internal/Subscriber");
Object.defineProperty(exports, "Subscriber", { enumerable: true, get: function () { return Subscriber_1.Subscriber; } });
var Notification_1 = require("./internal/Notification");
Object.defineProperty(exports, "Notification", { enumerable: true, get: function () { return Notification_1.Notification; } });
Object.defineProperty(exports, "NotificationKind", { enumerable: true, get: function () { return Notification_1.NotificationKind; } });
var pipe_1 = require("./internal/util/pipe");
Object.defineProperty(exports, "pipe", { enumerable: true, get: function () { return pipe_1.pipe; } });
var noop_1 = require("./internal/util/noop");
Object.defineProperty(exports, "noop", { enumerable: true, get: function () { return noop_1.noop; } });
var identity_1 = require("./internal/util/identity");
Object.defineProperty(exports, "identity", { enumerable: true, get: function () { return identity_1.identity; } });
var isObservable_1 = require("./internal/util/isObservable");
Object.defineProperty(exports, "isObservable", { enumerable: true, get: function () { return isObservable_1.isObservable; } });
var lastValueFrom_1 = require("./internal/lastValueFrom");
Object.defineProperty(exports, "lastValueFrom", { enumerable: true, get: function () { return lastValueFrom_1.lastValueFrom; } });
var firstValueFrom_1 = require("./internal/firstValueFrom");
Object.defineProperty(exports, "firstValueFrom", { enumerable: true, get: function () { return firstValueFrom_1.firstValueFrom; } });
var ArgumentOutOfRangeError_1 = require("./internal/util/ArgumentOutOfRangeError");
Object.defineProperty(exports, "ArgumentOutOfRangeError", { enumerable: true, get: function () { return ArgumentOutOfRangeError_1.ArgumentOutOfRangeError; } });
var EmptyError_1 = require("./internal/util/EmptyError");
Object.defineProperty(exports, "EmptyError", { enumerable: true, get: function () { return EmptyError_1.EmptyError; } });
var NotFoundError_1 = require("./internal/util/NotFoundError");
Object.defineProperty(exports, "NotFoundError", { enumerable: true, get: function () { return NotFoundError_1.NotFoundError; } });
var ObjectUnsubscribedError_1 = require("./internal/util/ObjectUnsubscribedError");
Object.defineProperty(exports, "ObjectUnsubscribedError", { enumerable: true, get: function () { return ObjectUnsubscribedError_1.ObjectUnsubscribedError; } });
var SequenceError_1 = require("./internal/util/SequenceError");
Object.defineProperty(exports, "SequenceError", { enumerable: true, get: function () { return SequenceError_1.SequenceError; } });
var timeout_1 = require("./internal/operators/timeout");
Object.defineProperty(exports, "TimeoutError", { enumerable: true, get: function () { return timeout_1.TimeoutError; } });
var UnsubscriptionError_1 = require("./internal/util/UnsubscriptionError");
Object.defineProperty(exports, "UnsubscriptionError", { enumerable: true, get: function () { return UnsubscriptionError_1.UnsubscriptionError; } });
var bindCallback_1 = require("./internal/observable/bindCallback");
Object.defineProperty(exports, "bindCallback", { enumerable: true, get: function () { return bindCallback_1.bindCallback; } });
var bindNodeCallback_1 = require("./internal/observable/bindNodeCallback");
Object.defineProperty(exports, "bindNodeCallback", { enumerable: true, get: function () { return bindNodeCallback_1.bindNodeCallback; } });
var combineLatest_1 = require("./internal/observable/combineLatest");
Object.defineProperty(exports, "combineLatest", { enumerable: true, get: function () { return combineLatest_1.combineLatest; } });
var concat_1 = require("./internal/observable/concat");
Object.defineProperty(exports, "concat", { enumerable: true, get: function () { return concat_1.concat; } });
var connectable_1 = require("./internal/observable/connectable");
Object.defineProperty(exports, "connectable", { enumerable: true, get: function () { return connectable_1.connectable; } });
var defer_1 = require("./internal/observable/defer");
Object.defineProperty(exports, "defer", { enumerable: true, get: function () { return defer_1.defer; } });
var empty_1 = require("./internal/observable/empty");
Object.defineProperty(exports, "empty", { enumerable: true, get: function () { return empty_1.empty; } });
var forkJoin_1 = require("./internal/observable/forkJoin");
Object.defineProperty(exports, "forkJoin", { enumerable: true, get: function () { return forkJoin_1.forkJoin; } });
var from_1 = require("./internal/observable/from");
Object.defineProperty(exports, "from", { enumerable: true, get: function () { return from_1.from; } });
var fromEvent_1 = require("./internal/observable/fromEvent");
Object.defineProperty(exports, "fromEvent", { enumerable: true, get: function () { return fromEvent_1.fromEvent; } });
var fromEventPattern_1 = require("./internal/observable/fromEventPattern");
Object.defineProperty(exports, "fromEventPattern", { enumerable: true, get: function () { return fromEventPattern_1.fromEventPattern; } });
var generate_1 = require("./internal/observable/generate");
Object.defineProperty(exports, "generate", { enumerable: true, get: function () { return generate_1.generate; } });
var iif_1 = require("./internal/observable/iif");
Object.defineProperty(exports, "iif", { enumerable: true, get: function () { return iif_1.iif; } });
var interval_1 = require("./internal/observable/interval");
Object.defineProperty(exports, "interval", { enumerable: true, get: function () { return interval_1.interval; } });
var merge_1 = require("./internal/observable/merge");
Object.defineProperty(exports, "merge", { enumerable: true, get: function () { return merge_1.merge; } });
var never_1 = require("./internal/observable/never");
Object.defineProperty(exports, "never", { enumerable: true, get: function () { return never_1.never; } });
var of_1 = require("./internal/observable/of");
Object.defineProperty(exports, "of", { enumerable: true, get: function () { return of_1.of; } });
var onErrorResumeNext_1 = require("./internal/observable/onErrorResumeNext");
Object.defineProperty(exports, "onErrorResumeNext", { enumerable: true, get: function () { return onErrorResumeNext_1.onErrorResumeNext; } });
var pairs_1 = require("./internal/observable/pairs");
Object.defineProperty(exports, "pairs", { enumerable: true, get: function () { return pairs_1.pairs; } });
var partition_1 = require("./internal/observable/partition");
Object.defineProperty(exports, "partition", { enumerable: true, get: function () { return partition_1.partition; } });
var race_1 = require("./internal/observable/race");
Object.defineProperty(exports, "race", { enumerable: true, get: function () { return race_1.race; } });
var range_1 = require("./internal/observable/range");
Object.defineProperty(exports, "range", { enumerable: true, get: function () { return range_1.range; } });
var throwError_1 = require("./internal/observable/throwError");
Object.defineProperty(exports, "throwError", { enumerable: true, get: function () { return throwError_1.throwError; } });
var timer_1 = require("./internal/observable/timer");
Object.defineProperty(exports, "timer", { enumerable: true, get: function () { return timer_1.timer; } });
var using_1 = require("./internal/observable/using");
Object.defineProperty(exports, "using", { enumerable: true, get: function () { return using_1.using; } });
var zip_1 = require("./internal/observable/zip");
Object.defineProperty(exports, "zip", { enumerable: true, get: function () { return zip_1.zip; } });
var scheduled_1 = require("./internal/scheduled/scheduled");
Object.defineProperty(exports, "scheduled", { enumerable: true, get: function () { return scheduled_1.scheduled; } });
var empty_2 = require("./internal/observable/empty");
Object.defineProperty(exports, "EMPTY", { enumerable: true, get: function () { return empty_2.EMPTY; } });
var never_2 = require("./internal/observable/never");
Object.defineProperty(exports, "NEVER", { enumerable: true, get: function () { return never_2.NEVER; } });
__exportStar(require("./internal/types"), exports);
var config_1 = require("./internal/config");
Object.defineProperty(exports, "config", { enumerable: true, get: function () { return config_1.config; } });
var audit_1 = require("./internal/operators/audit");
Object.defineProperty(exports, "audit", { enumerable: true, get: function () { return audit_1.audit; } });
var auditTime_1 = require("./internal/operators/auditTime");
Object.defineProperty(exports, "auditTime", { enumerable: true, get: function () { return auditTime_1.auditTime; } });
var buffer_1 = require("./internal/operators/buffer");
Object.defineProperty(exports, "buffer", { enumerable: true, get: function () { return buffer_1.buffer; } });
var bufferCount_1 = require("./internal/operators/bufferCount");
Object.defineProperty(exports, "bufferCount", { enumerable: true, get: function () { return bufferCount_1.bufferCount; } });
var bufferTime_1 = require("./internal/operators/bufferTime");
Object.defineProperty(exports, "bufferTime", { enumerable: true, get: function () { return bufferTime_1.bufferTime; } });
var bufferToggle_1 = require("./internal/operators/bufferToggle");
Object.defineProperty(exports, "bufferToggle", { enumerable: true, get: function () { return bufferToggle_1.bufferToggle; } });
var bufferWhen_1 = require("./internal/operators/bufferWhen");
Object.defineProperty(exports, "bufferWhen", { enumerable: true, get: function () { return bufferWhen_1.bufferWhen; } });
var catchError_1 = require("./internal/operators/catchError");
Object.defineProperty(exports, "catchError", { enumerable: true, get: function () { return catchError_1.catchError; } });
var combineAll_1 = require("./internal/operators/combineAll");
Object.defineProperty(exports, "combineAll", { enumerable: true, get: function () { return combineAll_1.combineAll; } });
var combineLatestAll_1 = require("./internal/operators/combineLatestAll");
Object.defineProperty(exports, "combineLatestAll", { enumerable: true, get: function () { return combineLatestAll_1.combineLatestAll; } });
var combineLatestWith_1 = require("./internal/operators/combineLatestWith");
Object.defineProperty(exports, "combineLatestWith", { enumerable: true, get: function () { return combineLatestWith_1.combineLatestWith; } });
var concatAll_1 = require("./internal/operators/concatAll");
Object.defineProperty(exports, "concatAll", { enumerable: true, get: function () { return concatAll_1.concatAll; } });
var concatMap_1 = require("./internal/operators/concatMap");
Object.defineProperty(exports, "concatMap", { enumerable: true, get: function () { return concatMap_1.concatMap; } });
var concatMapTo_1 = require("./internal/operators/concatMapTo");
Object.defineProperty(exports, "concatMapTo", { enumerable: true, get: function () { return concatMapTo_1.concatMapTo; } });
var concatWith_1 = require("./internal/operators/concatWith");
Object.defineProperty(exports, "concatWith", { enumerable: true, get: function () { return concatWith_1.concatWith; } });
var connect_1 = require("./internal/operators/connect");
Object.defineProperty(exports, "connect", { enumerable: true, get: function () { return connect_1.connect; } });
var count_1 = require("./internal/operators/count");
Object.defineProperty(exports, "count", { enumerable: true, get: function () { return count_1.count; } });
var debounce_1 = require("./internal/operators/debounce");
Object.defineProperty(exports, "debounce", { enumerable: true, get: function () { return debounce_1.debounce; } });
var debounceTime_1 = require("./internal/operators/debounceTime");
Object.defineProperty(exports, "debounceTime", { enumerable: true, get: function () { return debounceTime_1.debounceTime; } });
var defaultIfEmpty_1 = require("./internal/operators/defaultIfEmpty");
Object.defineProperty(exports, "defaultIfEmpty", { enumerable: true, get: function () { return defaultIfEmpty_1.defaultIfEmpty; } });
var delay_1 = require("./internal/operators/delay");
Object.defineProperty(exports, "delay", { enumerable: true, get: function () { return delay_1.delay; } });
var delayWhen_1 = require("./internal/operators/delayWhen");
Object.defineProperty(exports, "delayWhen", { enumerable: true, get: function () { return delayWhen_1.delayWhen; } });
var dematerialize_1 = require("./internal/operators/dematerialize");
Object.defineProperty(exports, "dematerialize", { enumerable: true, get: function () { return dematerialize_1.dematerialize; } });
var distinct_1 = require("./internal/operators/distinct");
Object.defineProperty(exports, "distinct", { enumerable: true, get: function () { return distinct_1.distinct; } });
var distinctUntilChanged_1 = require("./internal/operators/distinctUntilChanged");
Object.defineProperty(exports, "distinctUntilChanged", { enumerable: true, get: function () { return distinctUntilChanged_1.distinctUntilChanged; } });
var distinctUntilKeyChanged_1 = require("./internal/operators/distinctUntilKeyChanged");
Object.defineProperty(exports, "distinctUntilKeyChanged", { enumerable: true, get: function () { return distinctUntilKeyChanged_1.distinctUntilKeyChanged; } });
var elementAt_1 = require("./internal/operators/elementAt");
Object.defineProperty(exports, "elementAt", { enumerable: true, get: function () { return elementAt_1.elementAt; } });
var endWith_1 = require("./internal/operators/endWith");
Object.defineProperty(exports, "endWith", { enumerable: true, get: function () { return endWith_1.endWith; } });
var every_1 = require("./internal/operators/every");
Object.defineProperty(exports, "every", { enumerable: true, get: function () { return every_1.every; } });
var exhaust_1 = require("./internal/operators/exhaust");
Object.defineProperty(exports, "exhaust", { enumerable: true, get: function () { return exhaust_1.exhaust; } });
var exhaustAll_1 = require("./internal/operators/exhaustAll");
Object.defineProperty(exports, "exhaustAll", { enumerable: true, get: function () { return exhaustAll_1.exhaustAll; } });
var exhaustMap_1 = require("./internal/operators/exhaustMap");
Object.defineProperty(exports, "exhaustMap", { enumerable: true, get: function () { return exhaustMap_1.exhaustMap; } });
var expand_1 = require("./internal/operators/expand");
Object.defineProperty(exports, "expand", { enumerable: true, get: function () { return expand_1.expand; } });
var filter_1 = require("./internal/operators/filter");
Object.defineProperty(exports, "filter", { enumerable: true, get: function () { return filter_1.filter; } });
var finalize_1 = require("./internal/operators/finalize");
Object.defineProperty(exports, "finalize", { enumerable: true, get: function () { return finalize_1.finalize; } });
var find_1 = require("./internal/operators/find");
Object.defineProperty(exports, "find", { enumerable: true, get: function () { return find_1.find; } });
var findIndex_1 = require("./internal/operators/findIndex");
Object.defineProperty(exports, "findIndex", { enumerable: true, get: function () { return findIndex_1.findIndex; } });
var first_1 = require("./internal/operators/first");
Object.defineProperty(exports, "first", { enumerable: true, get: function () { return first_1.first; } });
var groupBy_1 = require("./internal/operators/groupBy");
Object.defineProperty(exports, "groupBy", { enumerable: true, get: function () { return groupBy_1.groupBy; } });
var ignoreElements_1 = require("./internal/operators/ignoreElements");
Object.defineProperty(exports, "ignoreElements", { enumerable: true, get: function () { return ignoreElements_1.ignoreElements; } });
var isEmpty_1 = require("./internal/operators/isEmpty");
Object.defineProperty(exports, "isEmpty", { enumerable: true, get: function () { return isEmpty_1.isEmpty; } });
var last_1 = require("./internal/operators/last");
Object.defineProperty(exports, "last", { enumerable: true, get: function () { return last_1.last; } });
var map_1 = require("./internal/operators/map");
Object.defineProperty(exports, "map", { enumerable: true, get: function () { return map_1.map; } });
var mapTo_1 = require("./internal/operators/mapTo");
Object.defineProperty(exports, "mapTo", { enumerable: true, get: function () { return mapTo_1.mapTo; } });
var materialize_1 = require("./internal/operators/materialize");
Object.defineProperty(exports, "materialize", { enumerable: true, get: function () { return materialize_1.materialize; } });
var max_1 = require("./internal/operators/max");
Object.defineProperty(exports, "max", { enumerable: true, get: function () { return max_1.max; } });
var mergeAll_1 = require("./internal/operators/mergeAll");
Object.defineProperty(exports, "mergeAll", { enumerable: true, get: function () { return mergeAll_1.mergeAll; } });
var flatMap_1 = require("./internal/operators/flatMap");
Object.defineProperty(exports, "flatMap", { enumerable: true, get: function () { return flatMap_1.flatMap; } });
var mergeMap_1 = require("./internal/operators/mergeMap");
Object.defineProperty(exports, "mergeMap", { enumerable: true, get: function () { return mergeMap_1.mergeMap; } });
var mergeMapTo_1 = require("./internal/operators/mergeMapTo");
Object.defineProperty(exports, "mergeMapTo", { enumerable: true, get: function () { return mergeMapTo_1.mergeMapTo; } });
var mergeScan_1 = require("./internal/operators/mergeScan");
Object.defineProperty(exports, "mergeScan", { enumerable: true, get: function () { return mergeScan_1.mergeScan; } });
var mergeWith_1 = require("./internal/operators/mergeWith");
Object.defineProperty(exports, "mergeWith", { enumerable: true, get: function () { return mergeWith_1.mergeWith; } });
var min_1 = require("./internal/operators/min");
Object.defineProperty(exports, "min", { enumerable: true, get: function () { return min_1.min; } });
var multicast_1 = require("./internal/operators/multicast");
Object.defineProperty(exports, "multicast", { enumerable: true, get: function () { return multicast_1.multicast; } });
var observeOn_1 = require("./internal/operators/observeOn");
Object.defineProperty(exports, "observeOn", { enumerable: true, get: function () { return observeOn_1.observeOn; } });
var onErrorResumeNextWith_1 = require("./internal/operators/onErrorResumeNextWith");
Object.defineProperty(exports, "onErrorResumeNextWith", { enumerable: true, get: function () { return onErrorResumeNextWith_1.onErrorResumeNextWith; } });
var pairwise_1 = require("./internal/operators/pairwise");
Object.defineProperty(exports, "pairwise", { enumerable: true, get: function () { return pairwise_1.pairwise; } });
var pluck_1 = require("./internal/operators/pluck");
Object.defineProperty(exports, "pluck", { enumerable: true, get: function () { return pluck_1.pluck; } });
var publish_1 = require("./internal/operators/publish");
Object.defineProperty(exports, "publish", { enumerable: true, get: function () { return publish_1.publish; } });
var publishBehavior_1 = require("./internal/operators/publishBehavior");
Object.defineProperty(exports, "publishBehavior", { enumerable: true, get: function () { return publishBehavior_1.publishBehavior; } });
var publishLast_1 = require("./internal/operators/publishLast");
Object.defineProperty(exports, "publishLast", { enumerable: true, get: function () { return publishLast_1.publishLast; } });
var publishReplay_1 = require("./internal/operators/publishReplay");
Object.defineProperty(exports, "publishReplay", { enumerable: true, get: function () { return publishReplay_1.publishReplay; } });
var raceWith_1 = require("./internal/operators/raceWith");
Object.defineProperty(exports, "raceWith", { enumerable: true, get: function () { return raceWith_1.raceWith; } });
var reduce_1 = require("./internal/operators/reduce");
Object.defineProperty(exports, "reduce", { enumerable: true, get: function () { return reduce_1.reduce; } });
var repeat_1 = require("./internal/operators/repeat");
Object.defineProperty(exports, "repeat", { enumerable: true, get: function () { return repeat_1.repeat; } });
var repeatWhen_1 = require("./internal/operators/repeatWhen");
Object.defineProperty(exports, "repeatWhen", { enumerable: true, get: function () { return repeatWhen_1.repeatWhen; } });
var retry_1 = require("./internal/operators/retry");
Object.defineProperty(exports, "retry", { enumerable: true, get: function () { return retry_1.retry; } });
var retryWhen_1 = require("./internal/operators/retryWhen");
Object.defineProperty(exports, "retryWhen", { enumerable: true, get: function () { return retryWhen_1.retryWhen; } });
var refCount_1 = require("./internal/operators/refCount");
Object.defineProperty(exports, "refCount", { enumerable: true, get: function () { return refCount_1.refCount; } });
var sample_1 = require("./internal/operators/sample");
Object.defineProperty(exports, "sample", { enumerable: true, get: function () { return sample_1.sample; } });
var sampleTime_1 = require("./internal/operators/sampleTime");
Object.defineProperty(exports, "sampleTime", { enumerable: true, get: function () { return sampleTime_1.sampleTime; } });
var scan_1 = require("./internal/operators/scan");
Object.defineProperty(exports, "scan", { enumerable: true, get: function () { return scan_1.scan; } });
var sequenceEqual_1 = require("./internal/operators/sequenceEqual");
Object.defineProperty(exports, "sequenceEqual", { enumerable: true, get: function () { return sequenceEqual_1.sequenceEqual; } });
var share_1 = require("./internal/operators/share");
Object.defineProperty(exports, "share", { enumerable: true, get: function () { return share_1.share; } });
var shareReplay_1 = require("./internal/operators/shareReplay");
Object.defineProperty(exports, "shareReplay", { enumerable: true, get: function () { return shareReplay_1.shareReplay; } });
var single_1 = require("./internal/operators/single");
Object.defineProperty(exports, "single", { enumerable: true, get: function () { return single_1.single; } });
var skip_1 = require("./internal/operators/skip");
Object.defineProperty(exports, "skip", { enumerable: true, get: function () { return skip_1.skip; } });
var skipLast_1 = require("./internal/operators/skipLast");
Object.defineProperty(exports, "skipLast", { enumerable: true, get: function () { return skipLast_1.skipLast; } });
var skipUntil_1 = require("./internal/operators/skipUntil");
Object.defineProperty(exports, "skipUntil", { enumerable: true, get: function () { return skipUntil_1.skipUntil; } });
var skipWhile_1 = require("./internal/operators/skipWhile");
Object.defineProperty(exports, "skipWhile", { enumerable: true, get: function () { return skipWhile_1.skipWhile; } });
var startWith_1 = require("./internal/operators/startWith");
Object.defineProperty(exports, "startWith", { enumerable: true, get: function () { return startWith_1.startWith; } });
var subscribeOn_1 = require("./internal/operators/subscribeOn");
Object.defineProperty(exports, "subscribeOn", { enumerable: true, get: function () { return subscribeOn_1.subscribeOn; } });
var switchAll_1 = require("./internal/operators/switchAll");
Object.defineProperty(exports, "switchAll", { enumerable: true, get: function () { return switchAll_1.switchAll; } });
var switchMap_1 = require("./internal/operators/switchMap");
Object.defineProperty(exports, "switchMap", { enumerable: true, get: function () { return switchMap_1.switchMap; } });
var switchMapTo_1 = require("./internal/operators/switchMapTo");
Object.defineProperty(exports, "switchMapTo", { enumerable: true, get: function () { return switchMapTo_1.switchMapTo; } });
var switchScan_1 = require("./internal/operators/switchScan");
Object.defineProperty(exports, "switchScan", { enumerable: true, get: function () { return switchScan_1.switchScan; } });
var take_1 = require("./internal/operators/take");
Object.defineProperty(exports, "take", { enumerable: true, get: function () { return take_1.take; } });
var takeLast_1 = require("./internal/operators/takeLast");
Object.defineProperty(exports, "takeLast", { enumerable: true, get: function () { return takeLast_1.takeLast; } });
var takeUntil_1 = require("./internal/operators/takeUntil");
Object.defineProperty(exports, "takeUntil", { enumerable: true, get: function () { return takeUntil_1.takeUntil; } });
var takeWhile_1 = require("./internal/operators/takeWhile");
Object.defineProperty(exports, "takeWhile", { enumerable: true, get: function () { return takeWhile_1.takeWhile; } });
var tap_1 = require("./internal/operators/tap");
Object.defineProperty(exports, "tap", { enumerable: true, get: function () { return tap_1.tap; } });
var throttle_1 = require("./internal/operators/throttle");
Object.defineProperty(exports, "throttle", { enumerable: true, get: function () { return throttle_1.throttle; } });
var throttleTime_1 = require("./internal/operators/throttleTime");
Object.defineProperty(exports, "throttleTime", { enumerable: true, get: function () { return throttleTime_1.throttleTime; } });
var throwIfEmpty_1 = require("./internal/operators/throwIfEmpty");
Object.defineProperty(exports, "throwIfEmpty", { enumerable: true, get: function () { return throwIfEmpty_1.throwIfEmpty; } });
var timeInterval_1 = require("./internal/operators/timeInterval");
Object.defineProperty(exports, "timeInterval", { enumerable: true, get: function () { return timeInterval_1.timeInterval; } });
var timeout_2 = require("./internal/operators/timeout");
Object.defineProperty(exports, "timeout", { enumerable: true, get: function () { return timeout_2.timeout; } });
var timeoutWith_1 = require("./internal/operators/timeoutWith");
Object.defineProperty(exports, "timeoutWith", { enumerable: true, get: function () { return timeoutWith_1.timeoutWith; } });
var timestamp_1 = require("./internal/operators/timestamp");
Object.defineProperty(exports, "timestamp", { enumerable: true, get: function () { return timestamp_1.timestamp; } });
var toArray_1 = require("./internal/operators/toArray");
Object.defineProperty(exports, "toArray", { enumerable: true, get: function () { return toArray_1.toArray; } });
var window_1 = require("./internal/operators/window");
Object.defineProperty(exports, "window", { enumerable: true, get: function () { return window_1.window; } });
var windowCount_1 = require("./internal/operators/windowCount");
Object.defineProperty(exports, "windowCount", { enumerable: true, get: function () { return windowCount_1.windowCount; } });
var windowTime_1 = require("./internal/operators/windowTime");
Object.defineProperty(exports, "windowTime", { enumerable: true, get: function () { return windowTime_1.windowTime; } });
var windowToggle_1 = require("./internal/operators/windowToggle");
Object.defineProperty(exports, "windowToggle", { enumerable: true, get: function () { return windowToggle_1.windowToggle; } });
var windowWhen_1 = require("./internal/operators/windowWhen");
Object.defineProperty(exports, "windowWhen", { enumerable: true, get: function () { return windowWhen_1.windowWhen; } });
var withLatestFrom_1 = require("./internal/operators/withLatestFrom");
Object.defineProperty(exports, "withLatestFrom", { enumerable: true, get: function () { return withLatestFrom_1.withLatestFrom; } });
var zipAll_1 = require("./internal/operators/zipAll");
Object.defineProperty(exports, "zipAll", { enumerable: true, get: function () { return zipAll_1.zipAll; } });
var zipWith_1 = require("./internal/operators/zipWith");
Object.defineProperty(exports, "zipWith", { enumerable: true, get: function () { return zipWith_1.zipWith; } });

},{"./internal/AsyncSubject":96,"./internal/BehaviorSubject":97,"./internal/Notification":98,"./internal/Observable":100,"./internal/ReplaySubject":101,"./internal/Scheduler":102,"./internal/Subject":103,"./internal/Subscriber":104,"./internal/Subscription":105,"./internal/config":106,"./internal/firstValueFrom":107,"./internal/lastValueFrom":108,"./internal/observable/ConnectableObservable":109,"./internal/observable/bindCallback":110,"./internal/observable/bindNodeCallback":112,"./internal/observable/combineLatest":113,"./internal/observable/concat":114,"./internal/observable/connectable":115,"./internal/observable/defer":116,"./internal/observable/dom/animationFrames":117,"./internal/observable/empty":118,"./internal/observable/forkJoin":119,"./internal/observable/from":120,"./internal/observable/fromEvent":121,"./internal/observable/fromEventPattern":122,"./internal/observable/generate":124,"./internal/observable/iif":125,"./internal/observable/interval":127,"./internal/observable/merge":128,"./internal/observable/never":129,"./internal/observable/of":130,"./internal/observable/onErrorResumeNext":131,"./internal/observable/pairs":132,"./internal/observable/partition":133,"./internal/observable/race":134,"./internal/observable/range":135,"./internal/observable/throwError":136,"./internal/observable/timer":137,"./internal/observable/using":138,"./internal/observable/zip":139,"./internal/operators/audit":141,"./internal/operators/auditTime":142,"./internal/operators/buffer":143,"./internal/operators/bufferCount":144,"./internal/operators/bufferTime":145,"./internal/operators/bufferToggle":146,"./internal/operators/bufferWhen":147,"./internal/operators/catchError":148,"./internal/operators/combineAll":149,"./internal/operators/combineLatestAll":151,"./internal/operators/combineLatestWith":152,"./internal/operators/concatAll":154,"./internal/operators/concatMap":155,"./internal/operators/concatMapTo":156,"./internal/operators/concatWith":157,"./internal/operators/connect":158,"./internal/operators/count":159,"./internal/operators/debounce":160,"./internal/operators/debounceTime":161,"./internal/operators/defaultIfEmpty":162,"./internal/operators/delay":163,"./internal/operators/delayWhen":164,"./internal/operators/dematerialize":165,"./internal/operators/distinct":166,"./internal/operators/distinctUntilChanged":167,"./internal/operators/distinctUntilKeyChanged":168,"./internal/operators/elementAt":169,"./internal/operators/endWith":170,"./internal/operators/every":171,"./internal/operators/exhaust":172,"./internal/operators/exhaustAll":173,"./internal/operators/exhaustMap":174,"./internal/operators/expand":175,"./internal/operators/filter":176,"./internal/operators/finalize":177,"./internal/operators/find":178,"./internal/operators/findIndex":179,"./internal/operators/first":180,"./internal/operators/flatMap":181,"./internal/operators/groupBy":182,"./internal/operators/ignoreElements":183,"./internal/operators/isEmpty":184,"./internal/operators/last":186,"./internal/operators/map":187,"./internal/operators/mapTo":188,"./internal/operators/materialize":189,"./internal/operators/max":190,"./internal/operators/mergeAll":192,"./internal/operators/mergeMap":194,"./internal/operators/mergeMapTo":195,"./internal/operators/mergeScan":196,"./internal/operators/mergeWith":197,"./internal/operators/min":198,"./internal/operators/multicast":199,"./internal/operators/observeOn":200,"./internal/operators/onErrorResumeNextWith":201,"./internal/operators/pairwise":202,"./internal/operators/pluck":204,"./internal/operators/publish":205,"./internal/operators/publishBehavior":206,"./internal/operators/publishLast":207,"./internal/operators/publishReplay":208,"./internal/operators/raceWith":210,"./internal/operators/reduce":211,"./internal/operators/refCount":212,"./internal/operators/repeat":213,"./internal/operators/repeatWhen":214,"./internal/operators/retry":215,"./internal/operators/retryWhen":216,"./internal/operators/sample":217,"./internal/operators/sampleTime":218,"./internal/operators/scan":219,"./internal/operators/sequenceEqual":221,"./internal/operators/share":222,"./internal/operators/shareReplay":223,"./internal/operators/single":224,"./internal/operators/skip":225,"./internal/operators/skipLast":226,"./internal/operators/skipUntil":227,"./internal/operators/skipWhile":228,"./internal/operators/startWith":229,"./internal/operators/subscribeOn":230,"./internal/operators/switchAll":231,"./internal/operators/switchMap":232,"./internal/operators/switchMapTo":233,"./internal/operators/switchScan":234,"./internal/operators/take":235,"./internal/operators/takeLast":236,"./internal/operators/takeUntil":237,"./internal/operators/takeWhile":238,"./internal/operators/tap":239,"./internal/operators/throttle":240,"./internal/operators/throttleTime":241,"./internal/operators/throwIfEmpty":242,"./internal/operators/timeInterval":243,"./internal/operators/timeout":244,"./internal/operators/timeoutWith":245,"./internal/operators/timestamp":246,"./internal/operators/toArray":247,"./internal/operators/window":248,"./internal/operators/windowCount":249,"./internal/operators/windowTime":250,"./internal/operators/windowToggle":251,"./internal/operators/windowWhen":252,"./internal/operators/withLatestFrom":253,"./internal/operators/zipAll":255,"./internal/operators/zipWith":256,"./internal/scheduled/scheduled":263,"./internal/scheduler/VirtualTimeScheduler":273,"./internal/scheduler/animationFrame":274,"./internal/scheduler/asap":276,"./internal/scheduler/async":277,"./internal/scheduler/queue":282,"./internal/symbol/observable":285,"./internal/types":286,"./internal/util/ArgumentOutOfRangeError":287,"./internal/util/EmptyError":288,"./internal/util/NotFoundError":290,"./internal/util/ObjectUnsubscribedError":291,"./internal/util/SequenceError":292,"./internal/util/UnsubscriptionError":293,"./internal/util/identity":302,"./internal/util/isObservable":309,"./internal/util/noop":315,"./internal/util/pipe":317}],96:[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.AsyncSubject = void 0;
var Subject_1 = require("./Subject");
var AsyncSubject = (function (_super) {
    __extends(AsyncSubject, _super);
    function AsyncSubject() {
        var _this = _super !== null && _super.apply(this, arguments) || this;
        _this._value = null;
        _this._hasValue = false;
        _this._isComplete = false;
        return _this;
    }
    AsyncSubject.prototype._checkFinalizedStatuses = function (subscriber) {
        var _a = this, hasError = _a.hasError, _hasValue = _a._hasValue, _value = _a._value, thrownError = _a.thrownError, isStopped = _a.isStopped, _isComplete = _a._isComplete;
        if (hasError) {
            subscriber.error(thrownError);
        }
        else if (isStopped || _isComplete) {
            _hasValue && subscriber.next(_value);
            subscriber.complete();
        }
    };
    AsyncSubject.prototype.next = function (value) {
        if (!this.isStopped) {
            this._value = value;
            this._hasValue = true;
        }
    };
    AsyncSubject.prototype.complete = function () {
        var _a = this, _hasValue = _a._hasValue, _value = _a._value, _isComplete = _a._isComplete;
        if (!_isComplete) {
            this._isComplete = true;
            _hasValue && _super.prototype.next.call(this, _value);
            _super.prototype.complete.call(this);
        }
    };
    return AsyncSubject;
}(Subject_1.Subject));
exports.AsyncSubject = AsyncSubject;

},{"./Subject":103}],97:[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.BehaviorSubject = void 0;
var Subject_1 = require("./Subject");
var BehaviorSubject = (function (_super) {
    __extends(BehaviorSubject, _super);
    function BehaviorSubject(_value) {
        var _this = _super.call(this) || this;
        _this._value = _value;
        return _this;
    }
    Object.defineProperty(BehaviorSubject.prototype, "value", {
        get: function () {
            return this.getValue();
        },
        enumerable: false,
        configurable: true
    });
    BehaviorSubject.prototype._subscribe = function (subscriber) {
        var subscription = _super.prototype._subscribe.call(this, subscriber);
        !subscription.closed && subscriber.next(this._value);
        return subscription;
    };
    BehaviorSubject.prototype.getValue = function () {
        var _a = this, hasError = _a.hasError, thrownError = _a.thrownError, _value = _a._value;
        if (hasError) {
            throw thrownError;
        }
        this._throwIfClosed();
        return _value;
    };
    BehaviorSubject.prototype.next = function (value) {
        _super.prototype.next.call(this, (this._value = value));
    };
    return BehaviorSubject;
}(Subject_1.Subject));
exports.BehaviorSubject = BehaviorSubject;

},{"./Subject":103}],98:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.observeNotification = exports.Notification = exports.NotificationKind = void 0;
var empty_1 = require("./observable/empty");
var of_1 = require("./observable/of");
var throwError_1 = require("./observable/throwError");
var isFunction_1 = require("./util/isFunction");
var NotificationKind;
(function (NotificationKind) {
    NotificationKind["NEXT"] = "N";
    NotificationKind["ERROR"] = "E";
    NotificationKind["COMPLETE"] = "C";
})(NotificationKind = exports.NotificationKind || (exports.NotificationKind = {}));
var Notification = (function () {
    function Notification(kind, value, error) {
        this.kind = kind;
        this.value = value;
        this.error = error;
        this.hasValue = kind === 'N';
    }
    Notification.prototype.observe = function (observer) {
        return observeNotification(this, observer);
    };
    Notification.prototype.do = function (nextHandler, errorHandler, completeHandler) {
        var _a = this, kind = _a.kind, value = _a.value, error = _a.error;
        return kind === 'N' ? nextHandler === null || nextHandler === void 0 ? void 0 : nextHandler(value) : kind === 'E' ? errorHandler === null || errorHandler === void 0 ? void 0 : errorHandler(error) : completeHandler === null || completeHandler === void 0 ? void 0 : completeHandler();
    };
    Notification.prototype.accept = function (nextOrObserver, error, complete) {
        var _a;
        return isFunction_1.isFunction((_a = nextOrObserver) === null || _a === void 0 ? void 0 : _a.next)
            ? this.observe(nextOrObserver)
            : this.do(nextOrObserver, error, complete);
    };
    Notification.prototype.toObservable = function () {
        var _a = this, kind = _a.kind, value = _a.value, error = _a.error;
        var result = kind === 'N'
            ?
                of_1.of(value)
            :
                kind === 'E'
                    ?
                        throwError_1.throwError(function () { return error; })
                    :
                        kind === 'C'
                            ?
                                empty_1.EMPTY
                            :
                                0;
        if (!result) {
            throw new TypeError("Unexpected notification kind " + kind);
        }
        return result;
    };
    Notification.createNext = function (value) {
        return new Notification('N', value);
    };
    Notification.createError = function (err) {
        return new Notification('E', undefined, err);
    };
    Notification.createComplete = function () {
        return Notification.completeNotification;
    };
    Notification.completeNotification = new Notification('C');
    return Notification;
}());
exports.Notification = Notification;
function observeNotification(notification, observer) {
    var _a, _b, _c;
    var _d = notification, kind = _d.kind, value = _d.value, error = _d.error;
    if (typeof kind !== 'string') {
        throw new TypeError('Invalid notification, missing "kind"');
    }
    kind === 'N' ? (_a = observer.next) === null || _a === void 0 ? void 0 : _a.call(observer, value) : kind === 'E' ? (_b = observer.error) === null || _b === void 0 ? void 0 : _b.call(observer, error) : (_c = observer.complete) === null || _c === void 0 ? void 0 : _c.call(observer);
}
exports.observeNotification = observeNotification;

},{"./observable/empty":118,"./observable/of":130,"./observable/throwError":136,"./util/isFunction":306}],99:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.createNotification = exports.nextNotification = exports.errorNotification = exports.COMPLETE_NOTIFICATION = void 0;
exports.COMPLETE_NOTIFICATION = (function () { return createNotification('C', undefined, undefined); })();
function errorNotification(error) {
    return createNotification('E', undefined, error);
}
exports.errorNotification = errorNotification;
function nextNotification(value) {
    return createNotification('N', value, undefined);
}
exports.nextNotification = nextNotification;
function createNotification(kind, value, error) {
    return {
        kind: kind,
        value: value,
        error: error,
    };
}
exports.createNotification = createNotification;

},{}],100:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Observable = void 0;
var Subscriber_1 = require("./Subscriber");
var Subscription_1 = require("./Subscription");
var observable_1 = require("./symbol/observable");
var pipe_1 = require("./util/pipe");
var config_1 = require("./config");
var isFunction_1 = require("./util/isFunction");
var errorContext_1 = require("./util/errorContext");
var Observable = (function () {
    function Observable(subscribe) {
        if (subscribe) {
            this._subscribe = subscribe;
        }
    }
    Observable.prototype.lift = function (operator) {
        var observable = new Observable();
        observable.source = this;
        observable.operator = operator;
        return observable;
    };
    Observable.prototype.subscribe = function (observerOrNext, error, complete) {
        var _this = this;
        var subscriber = isSubscriber(observerOrNext) ? observerOrNext : new Subscriber_1.SafeSubscriber(observerOrNext, error, complete);
        errorContext_1.errorContext(function () {
            var _a = _this, operator = _a.operator, source = _a.source;
            subscriber.add(operator
                ?
                    operator.call(subscriber, source)
                : source
                    ?
                        _this._subscribe(subscriber)
                    :
                        _this._trySubscribe(subscriber));
        });
        return subscriber;
    };
    Observable.prototype._trySubscribe = function (sink) {
        try {
            return this._subscribe(sink);
        }
        catch (err) {
            sink.error(err);
        }
    };
    Observable.prototype.forEach = function (next, promiseCtor) {
        var _this = this;
        promiseCtor = getPromiseCtor(promiseCtor);
        return new promiseCtor(function (resolve, reject) {
            var subscriber = new Subscriber_1.SafeSubscriber({
                next: function (value) {
                    try {
                        next(value);
                    }
                    catch (err) {
                        reject(err);
                        subscriber.unsubscribe();
                    }
                },
                error: reject,
                complete: resolve,
            });
            _this.subscribe(subscriber);
        });
    };
    Observable.prototype._subscribe = function (subscriber) {
        var _a;
        return (_a = this.source) === null || _a === void 0 ? void 0 : _a.subscribe(subscriber);
    };
    Observable.prototype[observable_1.observable] = function () {
        return this;
    };
    Observable.prototype.pipe = function () {
        var operations = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            operations[_i] = arguments[_i];
        }
        return pipe_1.pipeFromArray(operations)(this);
    };
    Observable.prototype.toPromise = function (promiseCtor) {
        var _this = this;
        promiseCtor = getPromiseCtor(promiseCtor);
        return new promiseCtor(function (resolve, reject) {
            var value;
            _this.subscribe(function (x) { return (value = x); }, function (err) { return reject(err); }, function () { return resolve(value); });
        });
    };
    Observable.create = function (subscribe) {
        return new Observable(subscribe);
    };
    return Observable;
}());
exports.Observable = Observable;
function getPromiseCtor(promiseCtor) {
    var _a;
    return (_a = promiseCtor !== null && promiseCtor !== void 0 ? promiseCtor : config_1.config.Promise) !== null && _a !== void 0 ? _a : Promise;
}
function isObserver(value) {
    return value && isFunction_1.isFunction(value.next) && isFunction_1.isFunction(value.error) && isFunction_1.isFunction(value.complete);
}
function isSubscriber(value) {
    return (value && value instanceof Subscriber_1.Subscriber) || (isObserver(value) && Subscription_1.isSubscription(value));
}

},{"./Subscriber":104,"./Subscription":105,"./config":106,"./symbol/observable":285,"./util/errorContext":300,"./util/isFunction":306,"./util/pipe":317}],101:[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.ReplaySubject = void 0;
var Subject_1 = require("./Subject");
var dateTimestampProvider_1 = require("./scheduler/dateTimestampProvider");
var ReplaySubject = (function (_super) {
    __extends(ReplaySubject, _super);
    function ReplaySubject(_bufferSize, _windowTime, _timestampProvider) {
        if (_bufferSize === void 0) { _bufferSize = Infinity; }
        if (_windowTime === void 0) { _windowTime = Infinity; }
        if (_timestampProvider === void 0) { _timestampProvider = dateTimestampProvider_1.dateTimestampProvider; }
        var _this = _super.call(this) || this;
        _this._bufferSize = _bufferSize;
        _this._windowTime = _windowTime;
        _this._timestampProvider = _timestampProvider;
        _this._buffer = [];
        _this._infiniteTimeWindow = true;
        _this._infiniteTimeWindow = _windowTime === Infinity;
        _this._bufferSize = Math.max(1, _bufferSize);
        _this._windowTime = Math.max(1, _windowTime);
        return _this;
    }
    ReplaySubject.prototype.next = function (value) {
        var _a = this, isStopped = _a.isStopped, _buffer = _a._buffer, _infiniteTimeWindow = _a._infiniteTimeWindow, _timestampProvider = _a._timestampProvider, _windowTime = _a._windowTime;
        if (!isStopped) {
            _buffer.push(value);
            !_infiniteTimeWindow && _buffer.push(_timestampProvider.now() + _windowTime);
        }
        this._trimBuffer();
        _super.prototype.next.call(this, value);
    };
    ReplaySubject.prototype._subscribe = function (subscriber) {
        this._throwIfClosed();
        this._trimBuffer();
        var subscription = this._innerSubscribe(subscriber);
        var _a = this, _infiniteTimeWindow = _a._infiniteTimeWindow, _buffer = _a._buffer;
        var copy = _buffer.slice();
        for (var i = 0; i < copy.length && !subscriber.closed; i += _infiniteTimeWindow ? 1 : 2) {
            subscriber.next(copy[i]);
        }
        this._checkFinalizedStatuses(subscriber);
        return subscription;
    };
    ReplaySubject.prototype._trimBuffer = function () {
        var _a = this, _bufferSize = _a._bufferSize, _timestampProvider = _a._timestampProvider, _buffer = _a._buffer, _infiniteTimeWindow = _a._infiniteTimeWindow;
        var adjustedBufferSize = (_infiniteTimeWindow ? 1 : 2) * _bufferSize;
        _bufferSize < Infinity && adjustedBufferSize < _buffer.length && _buffer.splice(0, _buffer.length - adjustedBufferSize);
        if (!_infiniteTimeWindow) {
            var now = _timestampProvider.now();
            var last = 0;
            for (var i = 1; i < _buffer.length && _buffer[i] <= now; i += 2) {
                last = i;
            }
            last && _buffer.splice(0, last + 1);
        }
    };
    return ReplaySubject;
}(Subject_1.Subject));
exports.ReplaySubject = ReplaySubject;

},{"./Subject":103,"./scheduler/dateTimestampProvider":278}],102:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Scheduler = void 0;
var dateTimestampProvider_1 = require("./scheduler/dateTimestampProvider");
var Scheduler = (function () {
    function Scheduler(schedulerActionCtor, now) {
        if (now === void 0) { now = Scheduler.now; }
        this.schedulerActionCtor = schedulerActionCtor;
        this.now = now;
    }
    Scheduler.prototype.schedule = function (work, delay, state) {
        if (delay === void 0) { delay = 0; }
        return new this.schedulerActionCtor(this, work).schedule(state, delay);
    };
    Scheduler.now = dateTimestampProvider_1.dateTimestampProvider.now;
    return Scheduler;
}());
exports.Scheduler = Scheduler;

},{"./scheduler/dateTimestampProvider":278}],103:[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
var __values = (this && this.__values) || function(o) {
    var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
    if (m) return m.call(o);
    if (o && typeof o.length === "number") return {
        next: function () {
            if (o && i >= o.length) o = void 0;
            return { value: o && o[i++], done: !o };
        }
    };
    throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.AnonymousSubject = exports.Subject = void 0;
var Observable_1 = require("./Observable");
var Subscription_1 = require("./Subscription");
var ObjectUnsubscribedError_1 = require("./util/ObjectUnsubscribedError");
var arrRemove_1 = require("./util/arrRemove");
var errorContext_1 = require("./util/errorContext");
var Subject = (function (_super) {
    __extends(Subject, _super);
    function Subject() {
        var _this = _super.call(this) || this;
        _this.closed = false;
        _this.currentObservers = null;
        _this.observers = [];
        _this.isStopped = false;
        _this.hasError = false;
        _this.thrownError = null;
        return _this;
    }
    Subject.prototype.lift = function (operator) {
        var subject = new AnonymousSubject(this, this);
        subject.operator = operator;
        return subject;
    };
    Subject.prototype._throwIfClosed = function () {
        if (this.closed) {
            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
        }
    };
    Subject.prototype.next = function (value) {
        var _this = this;
        errorContext_1.errorContext(function () {
            var e_1, _a;
            _this._throwIfClosed();
            if (!_this.isStopped) {
                if (!_this.currentObservers) {
                    _this.currentObservers = Array.from(_this.observers);
                }
                try {
                    for (var _b = __values(_this.currentObservers), _c = _b.next(); !_c.done; _c = _b.next()) {
                        var observer = _c.value;
                        observer.next(value);
                    }
                }
                catch (e_1_1) { e_1 = { error: e_1_1 }; }
                finally {
                    try {
                        if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
                    }
                    finally { if (e_1) throw e_1.error; }
                }
            }
        });
    };
    Subject.prototype.error = function (err) {
        var _this = this;
        errorContext_1.errorContext(function () {
            _this._throwIfClosed();
            if (!_this.isStopped) {
                _this.hasError = _this.isStopped = true;
                _this.thrownError = err;
                var observers = _this.observers;
                while (observers.length) {
                    observers.shift().error(err);
                }
            }
        });
    };
    Subject.prototype.complete = function () {
        var _this = this;
        errorContext_1.errorContext(function () {
            _this._throwIfClosed();
            if (!_this.isStopped) {
                _this.isStopped = true;
                var observers = _this.observers;
                while (observers.length) {
                    observers.shift().complete();
                }
            }
        });
    };
    Subject.prototype.unsubscribe = function () {
        this.isStopped = this.closed = true;
        this.observers = this.currentObservers = null;
    };
    Object.defineProperty(Subject.prototype, "observed", {
        get: function () {
            var _a;
            return ((_a = this.observers) === null || _a === void 0 ? void 0 : _a.length) > 0;
        },
        enumerable: false,
        configurable: true
    });
    Subject.prototype._trySubscribe = function (subscriber) {
        this._throwIfClosed();
        return _super.prototype._trySubscribe.call(this, subscriber);
    };
    Subject.prototype._subscribe = function (subscriber) {
        this._throwIfClosed();
        this._checkFinalizedStatuses(subscriber);
        return this._innerSubscribe(subscriber);
    };
    Subject.prototype._innerSubscribe = function (subscriber) {
        var _this = this;
        var _a = this, hasError = _a.hasError, isStopped = _a.isStopped, observers = _a.observers;
        if (hasError || isStopped) {
            return Subscription_1.EMPTY_SUBSCRIPTION;
        }
        this.currentObservers = null;
        observers.push(subscriber);
        return new Subscription_1.Subscription(function () {
            _this.currentObservers = null;
            arrRemove_1.arrRemove(observers, subscriber);
        });
    };
    Subject.prototype._checkFinalizedStatuses = function (subscriber) {
        var _a = this, hasError = _a.hasError, thrownError = _a.thrownError, isStopped = _a.isStopped;
        if (hasError) {
            subscriber.error(thrownError);
        }
        else if (isStopped) {
            subscriber.complete();
        }
    };
    Subject.prototype.asObservable = function () {
        var observable = new Observable_1.Observable();
        observable.source = this;
        return observable;
    };
    Subject.create = function (destination, source) {
        return new AnonymousSubject(destination, source);
    };
    return Subject;
}(Observable_1.Observable));
exports.Subject = Subject;
var AnonymousSubject = (function (_super) {
    __extends(AnonymousSubject, _super);
    function AnonymousSubject(destination, source) {
        var _this = _super.call(this) || this;
        _this.destination = destination;
        _this.source = source;
        return _this;
    }
    AnonymousSubject.prototype.next = function (value) {
        var _a, _b;
        (_b = (_a = this.destination) === null || _a === void 0 ? void 0 : _a.next) === null || _b === void 0 ? void 0 : _b.call(_a, value);
    };
    AnonymousSubject.prototype.error = function (err) {
        var _a, _b;
        (_b = (_a = this.destination) === null || _a === void 0 ? void 0 : _a.error) === null || _b === void 0 ? void 0 : _b.call(_a, err);
    };
    AnonymousSubject.prototype.complete = function () {
        var _a, _b;
        (_b = (_a = this.destination) === null || _a === void 0 ? void 0 : _a.complete) === null || _b === void 0 ? void 0 : _b.call(_a);
    };
    AnonymousSubject.prototype._subscribe = function (subscriber) {
        var _a, _b;
        return (_b = (_a = this.source) === null || _a === void 0 ? void 0 : _a.subscribe(subscriber)) !== null && _b !== void 0 ? _b : Subscription_1.EMPTY_SUBSCRIPTION;
    };
    return AnonymousSubject;
}(Subject));
exports.AnonymousSubject = AnonymousSubject;

},{"./Observable":100,"./Subscription":105,"./util/ObjectUnsubscribedError":291,"./util/arrRemove":297,"./util/errorContext":300}],104:[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.EMPTY_OBSERVER = exports.SafeSubscriber = exports.Subscriber = void 0;
var isFunction_1 = require("./util/isFunction");
var Subscription_1 = require("./Subscription");
var config_1 = require("./config");
var reportUnhandledError_1 = require("./util/reportUnhandledError");
var noop_1 = require("./util/noop");
var NotificationFactories_1 = require("./NotificationFactories");
var timeoutProvider_1 = require("./scheduler/timeoutProvider");
var errorContext_1 = require("./util/errorContext");
var Subscriber = (function (_super) {
    __extends(Subscriber, _super);
    function Subscriber(destination) {
        var _this = _super.call(this) || this;
        _this.isStopped = false;
        if (destination) {
            _this.destination = destination;
            if (Subscription_1.isSubscription(destination)) {
                destination.add(_this);
            }
        }
        else {
            _this.destination = exports.EMPTY_OBSERVER;
        }
        return _this;
    }
    Subscriber.create = function (next, error, complete) {
        return new SafeSubscriber(next, error, complete);
    };
    Subscriber.prototype.next = function (value) {
        if (this.isStopped) {
            handleStoppedNotification(NotificationFactories_1.nextNotification(value), this);
        }
        else {
            this._next(value);
        }
    };
    Subscriber.prototype.error = function (err) {
        if (this.isStopped) {
            handleStoppedNotification(NotificationFactories_1.errorNotification(err), this);
        }
        else {
            this.isStopped = true;
            this._error(err);
        }
    };
    Subscriber.prototype.complete = function () {
        if (this.isStopped) {
            handleStoppedNotification(NotificationFactories_1.COMPLETE_NOTIFICATION, this);
        }
        else {
            this.isStopped = true;
            this._complete();
        }
    };
    Subscriber.prototype.unsubscribe = function () {
        if (!this.closed) {
            this.isStopped = true;
            _super.prototype.unsubscribe.call(this);
            this.destination = null;
        }
    };
    Subscriber.prototype._next = function (value) {
        this.destination.next(value);
    };
    Subscriber.prototype._error = function (err) {
        try {
            this.destination.error(err);
        }
        finally {
            this.unsubscribe();
        }
    };
    Subscriber.prototype._complete = function () {
        try {
            this.destination.complete();
        }
        finally {
            this.unsubscribe();
        }
    };
    return Subscriber;
}(Subscription_1.Subscription));
exports.Subscriber = Subscriber;
var _bind = Function.prototype.bind;
function bind(fn, thisArg) {
    return _bind.call(fn, thisArg);
}
var ConsumerObserver = (function () {
    function ConsumerObserver(partialObserver) {
        this.partialObserver = partialObserver;
    }
    ConsumerObserver.prototype.next = function (value) {
        var partialObserver = this.partialObserver;
        if (partialObserver.next) {
            try {
                partialObserver.next(value);
            }
            catch (error) {
                handleUnhandledError(error);
            }
        }
    };
    ConsumerObserver.prototype.error = function (err) {
        var partialObserver = this.partialObserver;
        if (partialObserver.error) {
            try {
                partialObserver.error(err);
            }
            catch (error) {
                handleUnhandledError(error);
            }
        }
        else {
            handleUnhandledError(err);
        }
    };
    ConsumerObserver.prototype.complete = function () {
        var partialObserver = this.partialObserver;
        if (partialObserver.complete) {
            try {
                partialObserver.complete();
            }
            catch (error) {
                handleUnhandledError(error);
            }
        }
    };
    return ConsumerObserver;
}());
var SafeSubscriber = (function (_super) {
    __extends(SafeSubscriber, _super);
    function SafeSubscriber(observerOrNext, error, complete) {
        var _this = _super.call(this) || this;
        var partialObserver;
        if (isFunction_1.isFunction(observerOrNext) || !observerOrNext) {
            partialObserver = {
                next: (observerOrNext !== null && observerOrNext !== void 0 ? observerOrNext : undefined),
                error: error !== null && error !== void 0 ? error : undefined,
                complete: complete !== null && complete !== void 0 ? complete : undefined,
            };
        }
        else {
            var context_1;
            if (_this && config_1.config.useDeprecatedNextContext) {
                context_1 = Object.create(observerOrNext);
                context_1.unsubscribe = function () { return _this.unsubscribe(); };
                partialObserver = {
                    next: observerOrNext.next && bind(observerOrNext.next, context_1),
                    error: observerOrNext.error && bind(observerOrNext.error, context_1),
                    complete: observerOrNext.complete && bind(observerOrNext.complete, context_1),
                };
            }
            else {
                partialObserver = observerOrNext;
            }
        }
        _this.destination = new ConsumerObserver(partialObserver);
        return _this;
    }
    return SafeSubscriber;
}(Subscriber));
exports.SafeSubscriber = SafeSubscriber;
function handleUnhandledError(error) {
    if (config_1.config.useDeprecatedSynchronousErrorHandling) {
        errorContext_1.captureError(error);
    }
    else {
        reportUnhandledError_1.reportUnhandledError(error);
    }
}
function defaultErrorHandler(err) {
    throw err;
}
function handleStoppedNotification(notification, subscriber) {
    var onStoppedNotification = config_1.config.onStoppedNotification;
    onStoppedNotification && timeoutProvider_1.timeoutProvider.setTimeout(function () { return onStoppedNotification(notification, subscriber); });
}
exports.EMPTY_OBSERVER = {
    closed: true,
    next: noop_1.noop,
    error: defaultErrorHandler,
    complete: noop_1.noop,
};

},{"./NotificationFactories":99,"./Subscription":105,"./config":106,"./scheduler/timeoutProvider":283,"./util/errorContext":300,"./util/isFunction":306,"./util/noop":315,"./util/reportUnhandledError":318}],105:[function(require,module,exports){
"use strict";
var __values = (this && this.__values) || function(o) {
    var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
    if (m) return m.call(o);
    if (o && typeof o.length === "number") return {
        next: function () {
            if (o && i >= o.length) o = void 0;
            return { value: o && o[i++], done: !o };
        }
    };
    throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
};
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.isSubscription = exports.EMPTY_SUBSCRIPTION = exports.Subscription = void 0;
var isFunction_1 = require("./util/isFunction");
var UnsubscriptionError_1 = require("./util/UnsubscriptionError");
var arrRemove_1 = require("./util/arrRemove");
var Subscription = (function () {
    function Subscription(initialTeardown) {
        this.initialTeardown = initialTeardown;
        this.closed = false;
        this._parentage = null;
        this._finalizers = null;
    }
    Subscription.prototype.unsubscribe = function () {
        var e_1, _a, e_2, _b;
        var errors;
        if (!this.closed) {
            this.closed = true;
            var _parentage = this._parentage;
            if (_parentage) {
                this._parentage = null;
                if (Array.isArray(_parentage)) {
                    try {
                        for (var _parentage_1 = __values(_parentage), _parentage_1_1 = _parentage_1.next(); !_parentage_1_1.done; _parentage_1_1 = _parentage_1.next()) {
                            var parent_1 = _parentage_1_1.value;
                            parent_1.remove(this);
                        }
                    }
                    catch (e_1_1) { e_1 = { error: e_1_1 }; }
                    finally {
                        try {
                            if (_parentage_1_1 && !_parentage_1_1.done && (_a = _parentage_1.return)) _a.call(_parentage_1);
                        }
                        finally { if (e_1) throw e_1.error; }
                    }
                }
                else {
                    _parentage.remove(this);
                }
            }
            var initialFinalizer = this.initialTeardown;
            if (isFunction_1.isFunction(initialFinalizer)) {
                try {
                    initialFinalizer();
                }
                catch (e) {
                    errors = e instanceof UnsubscriptionError_1.UnsubscriptionError ? e.errors : [e];
                }
            }
            var _finalizers = this._finalizers;
            if (_finalizers) {
                this._finalizers = null;
                try {
                    for (var _finalizers_1 = __values(_finalizers), _finalizers_1_1 = _finalizers_1.next(); !_finalizers_1_1.done; _finalizers_1_1 = _finalizers_1.next()) {
                        var finalizer = _finalizers_1_1.value;
                        try {
                            execFinalizer(finalizer);
                        }
                        catch (err) {
                            errors = errors !== null && errors !== void 0 ? errors : [];
                            if (err instanceof UnsubscriptionError_1.UnsubscriptionError) {
                                errors = __spreadArray(__spreadArray([], __read(errors)), __read(err.errors));
                            }
                            else {
                                errors.push(err);
                            }
                        }
                    }
                }
                catch (e_2_1) { e_2 = { error: e_2_1 }; }
                finally {
                    try {
                        if (_finalizers_1_1 && !_finalizers_1_1.done && (_b = _finalizers_1.return)) _b.call(_finalizers_1);
                    }
                    finally { if (e_2) throw e_2.error; }
                }
            }
            if (errors) {
                throw new UnsubscriptionError_1.UnsubscriptionError(errors);
            }
        }
    };
    Subscription.prototype.add = function (teardown) {
        var _a;
        if (teardown && teardown !== this) {
            if (this.closed) {
                execFinalizer(teardown);
            }
            else {
                if (teardown instanceof Subscription) {
                    if (teardown.closed || teardown._hasParent(this)) {
                        return;
                    }
                    teardown._addParent(this);
                }
                (this._finalizers = (_a = this._finalizers) !== null && _a !== void 0 ? _a : []).push(teardown);
            }
        }
    };
    Subscription.prototype._hasParent = function (parent) {
        var _parentage = this._parentage;
        return _parentage === parent || (Array.isArray(_parentage) && _parentage.includes(parent));
    };
    Subscription.prototype._addParent = function (parent) {
        var _parentage = this._parentage;
        this._parentage = Array.isArray(_parentage) ? (_parentage.push(parent), _parentage) : _parentage ? [_parentage, parent] : parent;
    };
    Subscription.prototype._removeParent = function (parent) {
        var _parentage = this._parentage;
        if (_parentage === parent) {
            this._parentage = null;
        }
        else if (Array.isArray(_parentage)) {
            arrRemove_1.arrRemove(_parentage, parent);
        }
    };
    Subscription.prototype.remove = function (teardown) {
        var _finalizers = this._finalizers;
        _finalizers && arrRemove_1.arrRemove(_finalizers, teardown);
        if (teardown instanceof Subscription) {
            teardown._removeParent(this);
        }
    };
    Subscription.EMPTY = (function () {
        var empty = new Subscription();
        empty.closed = true;
        return empty;
    })();
    return Subscription;
}());
exports.Subscription = Subscription;
exports.EMPTY_SUBSCRIPTION = Subscription.EMPTY;
function isSubscription(value) {
    return (value instanceof Subscription ||
        (value && 'closed' in value && isFunction_1.isFunction(value.remove) && isFunction_1.isFunction(value.add) && isFunction_1.isFunction(value.unsubscribe)));
}
exports.isSubscription = isSubscription;
function execFinalizer(finalizer) {
    if (isFunction_1.isFunction(finalizer)) {
        finalizer();
    }
    else {
        finalizer.unsubscribe();
    }
}

},{"./util/UnsubscriptionError":293,"./util/arrRemove":297,"./util/isFunction":306}],106:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.config = void 0;
exports.config = {
    onUnhandledError: null,
    onStoppedNotification: null,
    Promise: undefined,
    useDeprecatedSynchronousErrorHandling: false,
    useDeprecatedNextContext: false,
};

},{}],107:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.firstValueFrom = void 0;
var EmptyError_1 = require("./util/EmptyError");
var Subscriber_1 = require("./Subscriber");
function firstValueFrom(source, config) {
    var hasConfig = typeof config === 'object';
    return new Promise(function (resolve, reject) {
        var subscriber = new Subscriber_1.SafeSubscriber({
            next: function (value) {
                resolve(value);
                subscriber.unsubscribe();
            },
            error: reject,
            complete: function () {
                if (hasConfig) {
                    resolve(config.defaultValue);
                }
                else {
                    reject(new EmptyError_1.EmptyError());
                }
            },
        });
        source.subscribe(subscriber);
    });
}
exports.firstValueFrom = firstValueFrom;

},{"./Subscriber":104,"./util/EmptyError":288}],108:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.lastValueFrom = void 0;
var EmptyError_1 = require("./util/EmptyError");
function lastValueFrom(source, config) {
    var hasConfig = typeof config === 'object';
    return new Promise(function (resolve, reject) {
        var _hasValue = false;
        var _value;
        source.subscribe({
            next: function (value) {
                _value = value;
                _hasValue = true;
            },
            error: reject,
            complete: function () {
                if (_hasValue) {
                    resolve(_value);
                }
                else if (hasConfig) {
                    resolve(config.defaultValue);
                }
                else {
                    reject(new EmptyError_1.EmptyError());
                }
            },
        });
    });
}
exports.lastValueFrom = lastValueFrom;

},{"./util/EmptyError":288}],109:[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.ConnectableObservable = void 0;
var Observable_1 = require("../Observable");
var Subscription_1 = require("../Subscription");
var refCount_1 = require("../operators/refCount");
var OperatorSubscriber_1 = require("../operators/OperatorSubscriber");
var lift_1 = require("../util/lift");
var ConnectableObservable = (function (_super) {
    __extends(ConnectableObservable, _super);
    function ConnectableObservable(source, subjectFactory) {
        var _this = _super.call(this) || this;
        _this.source = source;
        _this.subjectFactory = subjectFactory;
        _this._subject = null;
        _this._refCount = 0;
        _this._connection = null;
        if (lift_1.hasLift(source)) {
            _this.lift = source.lift;
        }
        return _this;
    }
    ConnectableObservable.prototype._subscribe = function (subscriber) {
        return this.getSubject().subscribe(subscriber);
    };
    ConnectableObservable.prototype.getSubject = function () {
        var subject = this._subject;
        if (!subject || subject.isStopped) {
            this._subject = this.subjectFactory();
        }
        return this._subject;
    };
    ConnectableObservable.prototype._teardown = function () {
        this._refCount = 0;
        var _connection = this._connection;
        this._subject = this._connection = null;
        _connection === null || _connection === void 0 ? void 0 : _connection.unsubscribe();
    };
    ConnectableObservable.prototype.connect = function () {
        var _this = this;
        var connection = this._connection;
        if (!connection) {
            connection = this._connection = new Subscription_1.Subscription();
            var subject_1 = this.getSubject();
            connection.add(this.source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subject_1, undefined, function () {
                _this._teardown();
                subject_1.complete();
            }, function (err) {
                _this._teardown();
                subject_1.error(err);
            }, function () { return _this._teardown(); })));
            if (connection.closed) {
                this._connection = null;
                connection = Subscription_1.Subscription.EMPTY;
            }
        }
        return connection;
    };
    ConnectableObservable.prototype.refCount = function () {
        return refCount_1.refCount()(this);
    };
    return ConnectableObservable;
}(Observable_1.Observable));
exports.ConnectableObservable = ConnectableObservable;

},{"../Observable":100,"../Subscription":105,"../operators/OperatorSubscriber":140,"../operators/refCount":212,"../util/lift":313}],110:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.bindCallback = void 0;
var bindCallbackInternals_1 = require("./bindCallbackInternals");
function bindCallback(callbackFunc, resultSelector, scheduler) {
    return bindCallbackInternals_1.bindCallbackInternals(false, callbackFunc, resultSelector, scheduler);
}
exports.bindCallback = bindCallback;

},{"./bindCallbackInternals":111}],111:[function(require,module,exports){
"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.bindCallbackInternals = void 0;
var isScheduler_1 = require("../util/isScheduler");
var Observable_1 = require("../Observable");
var subscribeOn_1 = require("../operators/subscribeOn");
var mapOneOrManyArgs_1 = require("../util/mapOneOrManyArgs");
var observeOn_1 = require("../operators/observeOn");
var AsyncSubject_1 = require("../AsyncSubject");
function bindCallbackInternals(isNodeStyle, callbackFunc, resultSelector, scheduler) {
    if (resultSelector) {
        if (isScheduler_1.isScheduler(resultSelector)) {
            scheduler = resultSelector;
        }
        else {
            return function () {
                var args = [];
                for (var _i = 0; _i < arguments.length; _i++) {
                    args[_i] = arguments[_i];
                }
                return bindCallbackInternals(isNodeStyle, callbackFunc, scheduler)
                    .apply(this, args)
                    .pipe(mapOneOrManyArgs_1.mapOneOrManyArgs(resultSelector));
            };
        }
    }
    if (scheduler) {
        return function () {
            var args = [];
            for (var _i = 0; _i < arguments.length; _i++) {
                args[_i] = arguments[_i];
            }
            return bindCallbackInternals(isNodeStyle, callbackFunc)
                .apply(this, args)
                .pipe(subscribeOn_1.subscribeOn(scheduler), observeOn_1.observeOn(scheduler));
        };
    }
    return function () {
        var _this = this;
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
        }
        var subject = new AsyncSubject_1.AsyncSubject();
        var uninitialized = true;
        return new Observable_1.Observable(function (subscriber) {
            var subs = subject.subscribe(subscriber);
            if (uninitialized) {
                uninitialized = false;
                var isAsync_1 = false;
                var isComplete_1 = false;
                callbackFunc.apply(_this, __spreadArray(__spreadArray([], __read(args)), [
                    function () {
                        var results = [];
                        for (var _i = 0; _i < arguments.length; _i++) {
                            results[_i] = arguments[_i];
                        }
                        if (isNodeStyle) {
                            var err = results.shift();
                            if (err != null) {
                                subject.error(err);
                                return;
                            }
                        }
                        subject.next(1 < results.length ? results : results[0]);
                        isComplete_1 = true;
                        if (isAsync_1) {
                            subject.complete();
                        }
                    },
                ]));
                if (isComplete_1) {
                    subject.complete();
                }
                isAsync_1 = true;
            }
            return subs;
        });
    };
}
exports.bindCallbackInternals = bindCallbackInternals;

},{"../AsyncSubject":96,"../Observable":100,"../operators/observeOn":200,"../operators/subscribeOn":230,"../util/isScheduler":312,"../util/mapOneOrManyArgs":314}],112:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.bindNodeCallback = void 0;
var bindCallbackInternals_1 = require("./bindCallbackInternals");
function bindNodeCallback(callbackFunc, resultSelector, scheduler) {
    return bindCallbackInternals_1.bindCallbackInternals(true, callbackFunc, resultSelector, scheduler);
}
exports.bindNodeCallback = bindNodeCallback;

},{"./bindCallbackInternals":111}],113:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.combineLatestInit = exports.combineLatest = void 0;
var Observable_1 = require("../Observable");
var argsArgArrayOrObject_1 = require("../util/argsArgArrayOrObject");
var from_1 = require("./from");
var identity_1 = require("../util/identity");
var mapOneOrManyArgs_1 = require("../util/mapOneOrManyArgs");
var args_1 = require("../util/args");
var createObject_1 = require("../util/createObject");
var OperatorSubscriber_1 = require("../operators/OperatorSubscriber");
var executeSchedule_1 = require("../util/executeSchedule");
function combineLatest() {
    var args = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        args[_i] = arguments[_i];
    }
    var scheduler = args_1.popScheduler(args);
    var resultSelector = args_1.popResultSelector(args);
    var _a = argsArgArrayOrObject_1.argsArgArrayOrObject(args), observables = _a.args, keys = _a.keys;
    if (observables.length === 0) {
        return from_1.from([], scheduler);
    }
    var result = new Observable_1.Observable(combineLatestInit(observables, scheduler, keys
        ?
            function (values) { return createObject_1.createObject(keys, values); }
        :
            identity_1.identity));
    return resultSelector ? result.pipe(mapOneOrManyArgs_1.mapOneOrManyArgs(resultSelector)) : result;
}
exports.combineLatest = combineLatest;
function combineLatestInit(observables, scheduler, valueTransform) {
    if (valueTransform === void 0) { valueTransform = identity_1.identity; }
    return function (subscriber) {
        maybeSchedule(scheduler, function () {
            var length = observables.length;
            var values = new Array(length);
            var active = length;
            var remainingFirstValues = length;
            var _loop_1 = function (i) {
                maybeSchedule(scheduler, function () {
                    var source = from_1.from(observables[i], scheduler);
                    var hasFirstValue = false;
                    source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
                        values[i] = value;
                        if (!hasFirstValue) {
                            hasFirstValue = true;
                            remainingFirstValues--;
                        }
                        if (!remainingFirstValues) {
                            subscriber.next(valueTransform(values.slice()));
                        }
                    }, function () {
                        if (!--active) {
                            subscriber.complete();
                        }
                    }));
                }, subscriber);
            };
            for (var i = 0; i < length; i++) {
                _loop_1(i);
            }
        }, subscriber);
    };
}
exports.combineLatestInit = combineLatestInit;
function maybeSchedule(scheduler, execute, subscription) {
    if (scheduler) {
        executeSchedule_1.executeSchedule(subscription, scheduler, execute);
    }
    else {
        execute();
    }
}

},{"../Observable":100,"../operators/OperatorSubscriber":140,"../util/args":294,"../util/argsArgArrayOrObject":295,"../util/createObject":299,"../util/executeSchedule":301,"../util/identity":302,"../util/mapOneOrManyArgs":314,"./from":120}],114:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.concat = void 0;
var concatAll_1 = require("../operators/concatAll");
var args_1 = require("../util/args");
var from_1 = require("./from");
function concat() {
    var args = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        args[_i] = arguments[_i];
    }
    return concatAll_1.concatAll()(from_1.from(args, args_1.popScheduler(args)));
}
exports.concat = concat;

},{"../operators/concatAll":154,"../util/args":294,"./from":120}],115:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.connectable = void 0;
var Subject_1 = require("../Subject");
var Observable_1 = require("../Observable");
var defer_1 = require("./defer");
var DEFAULT_CONFIG = {
    connector: function () { return new Subject_1.Subject(); },
    resetOnDisconnect: true,
};
function connectable(source, config) {
    if (config === void 0) { config = DEFAULT_CONFIG; }
    var connection = null;
    var connector = config.connector, _a = config.resetOnDisconnect, resetOnDisconnect = _a === void 0 ? true : _a;
    var subject = connector();
    var result = new Observable_1.Observable(function (subscriber) {
        return subject.subscribe(subscriber);
    });
    result.connect = function () {
        if (!connection || connection.closed) {
            connection = defer_1.defer(function () { return source; }).subscribe(subject);
            if (resetOnDisconnect) {
                connection.add(function () { return (subject = connector()); });
            }
        }
        return connection;
    };
    return result;
}
exports.connectable = connectable;

},{"../Observable":100,"../Subject":103,"./defer":116}],116:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.defer = void 0;
var Observable_1 = require("../Observable");
var innerFrom_1 = require("./innerFrom");
function defer(observableFactory) {
    return new Observable_1.Observable(function (subscriber) {
        innerFrom_1.innerFrom(observableFactory()).subscribe(subscriber);
    });
}
exports.defer = defer;

},{"../Observable":100,"./innerFrom":126}],117:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.animationFrames = void 0;
var Observable_1 = require("../../Observable");
var performanceTimestampProvider_1 = require("../../scheduler/performanceTimestampProvider");
var animationFrameProvider_1 = require("../../scheduler/animationFrameProvider");
function animationFrames(timestampProvider) {
    return timestampProvider ? animationFramesFactory(timestampProvider) : DEFAULT_ANIMATION_FRAMES;
}
exports.animationFrames = animationFrames;
function animationFramesFactory(timestampProvider) {
    return new Observable_1.Observable(function (subscriber) {
        var provider = timestampProvider || performanceTimestampProvider_1.performanceTimestampProvider;
        var start = provider.now();
        var id = 0;
        var run = function () {
            if (!subscriber.closed) {
                id = animationFrameProvider_1.animationFrameProvider.requestAnimationFrame(function (timestamp) {
                    id = 0;
                    var now = provider.now();
                    subscriber.next({
                        timestamp: timestampProvider ? now : timestamp,
                        elapsed: now - start,
                    });
                    run();
                });
            }
        };
        run();
        return function () {
            if (id) {
                animationFrameProvider_1.animationFrameProvider.cancelAnimationFrame(id);
            }
        };
    });
}
var DEFAULT_ANIMATION_FRAMES = animationFramesFactory();

},{"../../Observable":100,"../../scheduler/animationFrameProvider":275,"../../scheduler/performanceTimestampProvider":281}],118:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.empty = exports.EMPTY = void 0;
var Observable_1 = require("../Observable");
exports.EMPTY = new Observable_1.Observable(function (subscriber) { return subscriber.complete(); });
function empty(scheduler) {
    return scheduler ? emptyScheduled(scheduler) : exports.EMPTY;
}
exports.empty = empty;
function emptyScheduled(scheduler) {
    return new Observable_1.Observable(function (subscriber) { return scheduler.schedule(function () { return subscriber.complete(); }); });
}

},{"../Observable":100}],119:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.forkJoin = void 0;
var Observable_1 = require("../Observable");
var argsArgArrayOrObject_1 = require("../util/argsArgArrayOrObject");
var innerFrom_1 = require("./innerFrom");
var args_1 = require("../util/args");
var OperatorSubscriber_1 = require("../operators/OperatorSubscriber");
var mapOneOrManyArgs_1 = require("../util/mapOneOrManyArgs");
var createObject_1 = require("../util/createObject");
function forkJoin() {
    var args = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        args[_i] = arguments[_i];
    }
    var resultSelector = args_1.popResultSelector(args);
    var _a = argsArgArrayOrObject_1.argsArgArrayOrObject(args), sources = _a.args, keys = _a.keys;
    var result = new Observable_1.Observable(function (subscriber) {
        var length = sources.length;
        if (!length) {
            subscriber.complete();
            return;
        }
        var values = new Array(length);
        var remainingCompletions = length;
        var remainingEmissions = length;
        var _loop_1 = function (sourceIndex) {
            var hasValue = false;
            innerFrom_1.innerFrom(sources[sourceIndex]).subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
                if (!hasValue) {
                    hasValue = true;
                    remainingEmissions--;
                }
                values[sourceIndex] = value;
            }, function () { return remainingCompletions--; }, undefined, function () {
                if (!remainingCompletions || !hasValue) {
                    if (!remainingEmissions) {
                        subscriber.next(keys ? createObject_1.createObject(keys, values) : values);
                    }
                    subscriber.complete();
                }
            }));
        };
        for (var sourceIndex = 0; sourceIndex < length; sourceIndex++) {
            _loop_1(sourceIndex);
        }
    });
    return resultSelector ? result.pipe(mapOneOrManyArgs_1.mapOneOrManyArgs(resultSelector)) : result;
}
exports.forkJoin = forkJoin;

},{"../Observable":100,"../operators/OperatorSubscriber":140,"../util/args":294,"../util/argsArgArrayOrObject":295,"../util/createObject":299,"../util/mapOneOrManyArgs":314,"./innerFrom":126}],120:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.from = void 0;
var scheduled_1 = require("../scheduled/scheduled");
var innerFrom_1 = require("./innerFrom");
function from(input, scheduler) {
    return scheduler ? scheduled_1.scheduled(input, scheduler) : innerFrom_1.innerFrom(input);
}
exports.from = from;

},{"../scheduled/scheduled":263,"./innerFrom":126}],121:[function(require,module,exports){
"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.fromEvent = void 0;
var innerFrom_1 = require("../observable/innerFrom");
var Observable_1 = require("../Observable");
var mergeMap_1 = require("../operators/mergeMap");
var isArrayLike_1 = require("../util/isArrayLike");
var isFunction_1 = require("../util/isFunction");
var mapOneOrManyArgs_1 = require("../util/mapOneOrManyArgs");
var nodeEventEmitterMethods = ['addListener', 'removeListener'];
var eventTargetMethods = ['addEventListener', 'removeEventListener'];
var jqueryMethods = ['on', 'off'];
function fromEvent(target, eventName, options, resultSelector) {
    if (isFunction_1.isFunction(options)) {
        resultSelector = options;
        options = undefined;
    }
    if (resultSelector) {
        return fromEvent(target, eventName, options).pipe(mapOneOrManyArgs_1.mapOneOrManyArgs(resultSelector));
    }
    var _a = __read(isEventTarget(target)
        ? eventTargetMethods.map(function (methodName) { return function (handler) { return target[methodName](eventName, handler, options); }; })
        :
            isNodeStyleEventEmitter(target)
                ? nodeEventEmitterMethods.map(toCommonHandlerRegistry(target, eventName))
                : isJQueryStyleEventEmitter(target)
                    ? jqueryMethods.map(toCommonHandlerRegistry(target, eventName))
                    : [], 2), add = _a[0], remove = _a[1];
    if (!add) {
        if (isArrayLike_1.isArrayLike(target)) {
            return mergeMap_1.mergeMap(function (subTarget) { return fromEvent(subTarget, eventName, options); })(innerFrom_1.innerFrom(target));
        }
    }
    if (!add) {
        throw new TypeError('Invalid event target');
    }
    return new Observable_1.Observable(function (subscriber) {
        var handler = function () {
            var args = [];
            for (var _i = 0; _i < arguments.length; _i++) {
                args[_i] = arguments[_i];
            }
            return subscriber.next(1 < args.length ? args : args[0]);
        };
        add(handler);
        return function () { return remove(handler); };
    });
}
exports.fromEvent = fromEvent;
function toCommonHandlerRegistry(target, eventName) {
    return function (methodName) { return function (handler) { return target[methodName](eventName, handler); }; };
}
function isNodeStyleEventEmitter(target) {
    return isFunction_1.isFunction(target.addListener) && isFunction_1.isFunction(target.removeListener);
}
function isJQueryStyleEventEmitter(target) {
    return isFunction_1.isFunction(target.on) && isFunction_1.isFunction(target.off);
}
function isEventTarget(target) {
    return isFunction_1.isFunction(target.addEventListener) && isFunction_1.isFunction(target.removeEventListener);
}

},{"../Observable":100,"../observable/innerFrom":126,"../operators/mergeMap":194,"../util/isArrayLike":303,"../util/isFunction":306,"../util/mapOneOrManyArgs":314}],122:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.fromEventPattern = void 0;
var Observable_1 = require("../Observable");
var isFunction_1 = require("../util/isFunction");
var mapOneOrManyArgs_1 = require("../util/mapOneOrManyArgs");
function fromEventPattern(addHandler, removeHandler, resultSelector) {
    if (resultSelector) {
        return fromEventPattern(addHandler, removeHandler).pipe(mapOneOrManyArgs_1.mapOneOrManyArgs(resultSelector));
    }
    return new Observable_1.Observable(function (subscriber) {
        var handler = function () {
            var e = [];
            for (var _i = 0; _i < arguments.length; _i++) {
                e[_i] = arguments[_i];
            }
            return subscriber.next(e.length === 1 ? e[0] : e);
        };
        var retValue = addHandler(handler);
        return isFunction_1.isFunction(removeHandler) ? function () { return removeHandler(handler, retValue); } : undefined;
    });
}
exports.fromEventPattern = fromEventPattern;

},{"../Observable":100,"../util/isFunction":306,"../util/mapOneOrManyArgs":314}],123:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.fromSubscribable = void 0;
var Observable_1 = require("../Observable");
function fromSubscribable(subscribable) {
    return new Observable_1.Observable(function (subscriber) { return subscribable.subscribe(subscriber); });
}
exports.fromSubscribable = fromSubscribable;

},{"../Observable":100}],124:[function(require,module,exports){
"use strict";
var __generator = (this && this.__generator) || function (thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.generate = void 0;
var identity_1 = require("../util/identity");
var isScheduler_1 = require("../util/isScheduler");
var defer_1 = require("./defer");
var scheduleIterable_1 = require("../scheduled/scheduleIterable");
function generate(initialStateOrOptions, condition, iterate, resultSelectorOrScheduler, scheduler) {
    var _a, _b;
    var resultSelector;
    var initialState;
    if (arguments.length === 1) {
        (_a = initialStateOrOptions, initialState = _a.initialState, condition = _a.condition, iterate = _a.iterate, _b = _a.resultSelector, resultSelector = _b === void 0 ? identity_1.identity : _b, scheduler = _a.scheduler);
    }
    else {
        initialState = initialStateOrOptions;
        if (!resultSelectorOrScheduler || isScheduler_1.isScheduler(resultSelectorOrScheduler)) {
            resultSelector = identity_1.identity;
            scheduler = resultSelectorOrScheduler;
        }
        else {
            resultSelector = resultSelectorOrScheduler;
        }
    }
    function gen() {
        var state;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    state = initialState;
                    _a.label = 1;
                case 1:
                    if (!(!condition || condition(state))) return [3, 4];
                    return [4, resultSelector(state)];
                case 2:
                    _a.sent();
                    _a.label = 3;
                case 3:
                    state = iterate(state);
                    return [3, 1];
                case 4: return [2];
            }
        });
    }
    return defer_1.defer((scheduler
        ?
            function () { return scheduleIterable_1.scheduleIterable(gen(), scheduler); }
        :
            gen));
}
exports.generate = generate;

},{"../scheduled/scheduleIterable":259,"../util/identity":302,"../util/isScheduler":312,"./defer":116}],125:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.iif = void 0;
var defer_1 = require("./defer");
function iif(condition, trueResult, falseResult) {
    return defer_1.defer(function () { return (condition() ? trueResult : falseResult); });
}
exports.iif = iif;

},{"./defer":116}],126:[function(require,module,exports){
(function (process){(function (){
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __generator = (this && this.__generator) || function (thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
};
var __asyncValues = (this && this.__asyncValues) || function (o) {
    if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
    var m = o[Symbol.asyncIterator], i;
    return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
};
var __values = (this && this.__values) || function(o) {
    var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
    if (m) return m.call(o);
    if (o && typeof o.length === "number") return {
        next: function () {
            if (o && i >= o.length) o = void 0;
            return { value: o && o[i++], done: !o };
        }
    };
    throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.fromReadableStreamLike = exports.fromAsyncIterable = exports.fromIterable = exports.fromPromise = exports.fromArrayLike = exports.fromInteropObservable = exports.innerFrom = void 0;
var isArrayLike_1 = require("../util/isArrayLike");
var isPromise_1 = require("../util/isPromise");
var Observable_1 = require("../Observable");
var isInteropObservable_1 = require("../util/isInteropObservable");
var isAsyncIterable_1 = require("../util/isAsyncIterable");
var throwUnobservableError_1 = require("../util/throwUnobservableError");
var isIterable_1 = require("../util/isIterable");
var isReadableStreamLike_1 = require("../util/isReadableStreamLike");
var isFunction_1 = require("../util/isFunction");
var reportUnhandledError_1 = require("../util/reportUnhandledError");
var observable_1 = require("../symbol/observable");
function innerFrom(input) {
    if (input instanceof Observable_1.Observable) {
        return input;
    }
    if (input != null) {
        if (isInteropObservable_1.isInteropObservable(input)) {
            return fromInteropObservable(input);
        }
        if (isArrayLike_1.isArrayLike(input)) {
            return fromArrayLike(input);
        }
        if (isPromise_1.isPromise(input)) {
            return fromPromise(input);
        }
        if (isAsyncIterable_1.isAsyncIterable(input)) {
            return fromAsyncIterable(input);
        }
        if (isIterable_1.isIterable(input)) {
            return fromIterable(input);
        }
        if (isReadableStreamLike_1.isReadableStreamLike(input)) {
            return fromReadableStreamLike(input);
        }
    }
    throw throwUnobservableError_1.createInvalidObservableTypeError(input);
}
exports.innerFrom = innerFrom;
function fromInteropObservable(obj) {
    return new Observable_1.Observable(function (subscriber) {
        var obs = obj[observable_1.observable]();
        if (isFunction_1.isFunction(obs.subscribe)) {
            return obs.subscribe(subscriber);
        }
        throw new TypeError('Provided object does not correctly implement Symbol.observable');
    });
}
exports.fromInteropObservable = fromInteropObservable;
function fromArrayLike(array) {
    return new Observable_1.Observable(function (subscriber) {
        for (var i = 0; i < array.length && !subscriber.closed; i++) {
            subscriber.next(array[i]);
        }
        subscriber.complete();
    });
}
exports.fromArrayLike = fromArrayLike;
function fromPromise(promise) {
    return new Observable_1.Observable(function (subscriber) {
        promise
            .then(function (value) {
            if (!subscriber.closed) {
                subscriber.next(value);
                subscriber.complete();
            }
        }, function (err) { return subscriber.error(err); })
            .then(null, reportUnhandledError_1.reportUnhandledError);
    });
}
exports.fromPromise = fromPromise;
function fromIterable(iterable) {
    return new Observable_1.Observable(function (subscriber) {
        var e_1, _a;
        try {
            for (var iterable_1 = __values(iterable), iterable_1_1 = iterable_1.next(); !iterable_1_1.done; iterable_1_1 = iterable_1.next()) {
                var value = iterable_1_1.value;
                subscriber.next(value);
                if (subscriber.closed) {
                    return;
                }
            }
        }
        catch (e_1_1) { e_1 = { error: e_1_1 }; }
        finally {
            try {
                if (iterable_1_1 && !iterable_1_1.done && (_a = iterable_1.return)) _a.call(iterable_1);
            }
            finally { if (e_1) throw e_1.error; }
        }
        subscriber.complete();
    });
}
exports.fromIterable = fromIterable;
function fromAsyncIterable(asyncIterable) {
    return new Observable_1.Observable(function (subscriber) {
        process(asyncIterable, subscriber).catch(function (err) { return subscriber.error(err); });
    });
}
exports.fromAsyncIterable = fromAsyncIterable;
function fromReadableStreamLike(readableStream) {
    return fromAsyncIterable(isReadableStreamLike_1.readableStreamLikeToAsyncGenerator(readableStream));
}
exports.fromReadableStreamLike = fromReadableStreamLike;
function process(asyncIterable, subscriber) {
    var asyncIterable_1, asyncIterable_1_1;
    var e_2, _a;
    return __awaiter(this, void 0, void 0, function () {
        var value, e_2_1;
        return __generator(this, function (_b) {
            switch (_b.label) {
                case 0:
                    _b.trys.push([0, 5, 6, 11]);
                    asyncIterable_1 = __asyncValues(asyncIterable);
                    _b.label = 1;
                case 1: return [4, asyncIterable_1.next()];
                case 2:
                    if (!(asyncIterable_1_1 = _b.sent(), !asyncIterable_1_1.done)) return [3, 4];
                    value = asyncIterable_1_1.value;
                    subscriber.next(value);
                    if (subscriber.closed) {
                        return [2];
                    }
                    _b.label = 3;
                case 3: return [3, 1];
                case 4: return [3, 11];
                case 5:
                    e_2_1 = _b.sent();
                    e_2 = { error: e_2_1 };
                    return [3, 11];
                case 6:
                    _b.trys.push([6, , 9, 10]);
                    if (!(asyncIterable_1_1 && !asyncIterable_1_1.done && (_a = asyncIterable_1.return))) return [3, 8];
                    return [4, _a.call(asyncIterable_1)];
                case 7:
                    _b.sent();
                    _b.label = 8;
                case 8: return [3, 10];
                case 9:
                    if (e_2) throw e_2.error;
                    return [7];
                case 10: return [7];
                case 11:
                    subscriber.complete();
                    return [2];
            }
        });
    });
}

}).call(this)}).call(this,require('_process'))
},{"../Observable":100,"../symbol/observable":285,"../util/isArrayLike":303,"../util/isAsyncIterable":304,"../util/isFunction":306,"../util/isInteropObservable":307,"../util/isIterable":308,"../util/isPromise":310,"../util/isReadableStreamLike":311,"../util/reportUnhandledError":318,"../util/throwUnobservableError":319,"_process":83}],127:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.interval = void 0;
var async_1 = require("../scheduler/async");
var timer_1 = require("./timer");
function interval(period, scheduler) {
    if (period === void 0) { period = 0; }
    if (scheduler === void 0) { scheduler = async_1.asyncScheduler; }
    if (period < 0) {
        period = 0;
    }
    return timer_1.timer(period, period, scheduler);
}
exports.interval = interval;

},{"../scheduler/async":277,"./timer":137}],128:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.merge = void 0;
var mergeAll_1 = require("../operators/mergeAll");
var innerFrom_1 = require("./innerFrom");
var empty_1 = require("./empty");
var args_1 = require("../util/args");
var from_1 = require("./from");
function merge() {
    var args = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        args[_i] = arguments[_i];
    }
    var scheduler = args_1.popScheduler(args);
    var concurrent = args_1.popNumber(args, Infinity);
    var sources = args;
    return !sources.length
        ?
            empty_1.EMPTY
        : sources.length === 1
            ?
                innerFrom_1.innerFrom(sources[0])
            :
                mergeAll_1.mergeAll(concurrent)(from_1.from(sources, scheduler));
}
exports.merge = merge;

},{"../operators/mergeAll":192,"../util/args":294,"./empty":118,"./from":120,"./innerFrom":126}],129:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.never = exports.NEVER = void 0;
var Observable_1 = require("../Observable");
var noop_1 = require("../util/noop");
exports.NEVER = new Observable_1.Observable(noop_1.noop);
function never() {
    return exports.NEVER;
}
exports.never = never;

},{"../Observable":100,"../util/noop":315}],130:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.of = void 0;
var args_1 = require("../util/args");
var from_1 = require("./from");
function of() {
    var args = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        args[_i] = arguments[_i];
    }
    var scheduler = args_1.popScheduler(args);
    return from_1.from(args, scheduler);
}
exports.of = of;

},{"../util/args":294,"./from":120}],131:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.onErrorResumeNext = void 0;
var Observable_1 = require("../Observable");
var argsOrArgArray_1 = require("../util/argsOrArgArray");
var OperatorSubscriber_1 = require("../operators/OperatorSubscriber");
var noop_1 = require("../util/noop");
var innerFrom_1 = require("./innerFrom");
function onErrorResumeNext() {
    var sources = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        sources[_i] = arguments[_i];
    }
    var nextSources = argsOrArgArray_1.argsOrArgArray(sources);
    return new Observable_1.Observable(function (subscriber) {
        var sourceIndex = 0;
        var subscribeNext = function () {
            if (sourceIndex < nextSources.length) {
                var nextSource = void 0;
                try {
                    nextSource = innerFrom_1.innerFrom(nextSources[sourceIndex++]);
                }
                catch (err) {
                    subscribeNext();
                    return;
                }
                var innerSubscriber = new OperatorSubscriber_1.OperatorSubscriber(subscriber, undefined, noop_1.noop, noop_1.noop);
                nextSource.subscribe(innerSubscriber);
                innerSubscriber.add(subscribeNext);
            }
            else {
                subscriber.complete();
            }
        };
        subscribeNext();
    });
}
exports.onErrorResumeNext = onErrorResumeNext;

},{"../Observable":100,"../operators/OperatorSubscriber":140,"../util/argsOrArgArray":296,"../util/noop":315,"./innerFrom":126}],132:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.pairs = void 0;
var from_1 = require("./from");
function pairs(obj, scheduler) {
    return from_1.from(Object.entries(obj), scheduler);
}
exports.pairs = pairs;

},{"./from":120}],133:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.partition = void 0;
var not_1 = require("../util/not");
var filter_1 = require("../operators/filter");
var innerFrom_1 = require("./innerFrom");
function partition(source, predicate, thisArg) {
    return [filter_1.filter(predicate, thisArg)(innerFrom_1.innerFrom(source)), filter_1.filter(not_1.not(predicate, thisArg))(innerFrom_1.innerFrom(source))];
}
exports.partition = partition;

},{"../operators/filter":176,"../util/not":316,"./innerFrom":126}],134:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.raceInit = exports.race = void 0;
var Observable_1 = require("../Observable");
var innerFrom_1 = require("./innerFrom");
var argsOrArgArray_1 = require("../util/argsOrArgArray");
var OperatorSubscriber_1 = require("../operators/OperatorSubscriber");
function race() {
    var sources = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        sources[_i] = arguments[_i];
    }
    sources = argsOrArgArray_1.argsOrArgArray(sources);
    return sources.length === 1 ? innerFrom_1.innerFrom(sources[0]) : new Observable_1.Observable(raceInit(sources));
}
exports.race = race;
function raceInit(sources) {
    return function (subscriber) {
        var subscriptions = [];
        var _loop_1 = function (i) {
            subscriptions.push(innerFrom_1.innerFrom(sources[i]).subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
                if (subscriptions) {
                    for (var s = 0; s < subscriptions.length; s++) {
                        s !== i && subscriptions[s].unsubscribe();
                    }
                    subscriptions = null;
                }
                subscriber.next(value);
            })));
        };
        for (var i = 0; subscriptions && !subscriber.closed && i < sources.length; i++) {
            _loop_1(i);
        }
    };
}
exports.raceInit = raceInit;

},{"../Observable":100,"../operators/OperatorSubscriber":140,"../util/argsOrArgArray":296,"./innerFrom":126}],135:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.range = void 0;
var Observable_1 = require("../Observable");
var empty_1 = require("./empty");
function range(start, count, scheduler) {
    if (count == null) {
        count = start;
        start = 0;
    }
    if (count <= 0) {
        return empty_1.EMPTY;
    }
    var end = count + start;
    return new Observable_1.Observable(scheduler
        ?
            function (subscriber) {
                var n = start;
                return scheduler.schedule(function () {
                    if (n < end) {
                        subscriber.next(n++);
                        this.schedule();
                    }
                    else {
                        subscriber.complete();
                    }
                });
            }
        :
            function (subscriber) {
                var n = start;
                while (n < end && !subscriber.closed) {
                    subscriber.next(n++);
                }
                subscriber.complete();
            });
}
exports.range = range;

},{"../Observable":100,"./empty":118}],136:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.throwError = void 0;
var Observable_1 = require("../Observable");
var isFunction_1 = require("../util/isFunction");
function throwError(errorOrErrorFactory, scheduler) {
    var errorFactory = isFunction_1.isFunction(errorOrErrorFactory) ? errorOrErrorFactory : function () { return errorOrErrorFactory; };
    var init = function (subscriber) { return subscriber.error(errorFactory()); };
    return new Observable_1.Observable(scheduler ? function (subscriber) { return scheduler.schedule(init, 0, subscriber); } : init);
}
exports.throwError = throwError;

},{"../Observable":100,"../util/isFunction":306}],137:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.timer = void 0;
var Observable_1 = require("../Observable");
var async_1 = require("../scheduler/async");
var isScheduler_1 = require("../util/isScheduler");
var isDate_1 = require("../util/isDate");
function timer(dueTime, intervalOrScheduler, scheduler) {
    if (dueTime === void 0) { dueTime = 0; }
    if (scheduler === void 0) { scheduler = async_1.async; }
    var intervalDuration = -1;
    if (intervalOrScheduler != null) {
        if (isScheduler_1.isScheduler(intervalOrScheduler)) {
            scheduler = intervalOrScheduler;
        }
        else {
            intervalDuration = intervalOrScheduler;
        }
    }
    return new Observable_1.Observable(function (subscriber) {
        var due = isDate_1.isValidDate(dueTime) ? +dueTime - scheduler.now() : dueTime;
        if (due < 0) {
            due = 0;
        }
        var n = 0;
        return scheduler.schedule(function () {
            if (!subscriber.closed) {
                subscriber.next(n++);
                if (0 <= intervalDuration) {
                    this.schedule(undefined, intervalDuration);
                }
                else {
                    subscriber.complete();
                }
            }
        }, due);
    });
}
exports.timer = timer;

},{"../Observable":100,"../scheduler/async":277,"../util/isDate":305,"../util/isScheduler":312}],138:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.using = void 0;
var Observable_1 = require("../Observable");
var innerFrom_1 = require("./innerFrom");
var empty_1 = require("./empty");
function using(resourceFactory, observableFactory) {
    return new Observable_1.Observable(function (subscriber) {
        var resource = resourceFactory();
        var result = observableFactory(resource);
        var source = result ? innerFrom_1.innerFrom(result) : empty_1.EMPTY;
        source.subscribe(subscriber);
        return function () {
            if (resource) {
                resource.unsubscribe();
            }
        };
    });
}
exports.using = using;

},{"../Observable":100,"./empty":118,"./innerFrom":126}],139:[function(require,module,exports){
"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.zip = void 0;
var Observable_1 = require("../Observable");
var innerFrom_1 = require("./innerFrom");
var argsOrArgArray_1 = require("../util/argsOrArgArray");
var empty_1 = require("./empty");
var OperatorSubscriber_1 = require("../operators/OperatorSubscriber");
var args_1 = require("../util/args");
function zip() {
    var args = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        args[_i] = arguments[_i];
    }
    var resultSelector = args_1.popResultSelector(args);
    var sources = argsOrArgArray_1.argsOrArgArray(args);
    return sources.length
        ? new Observable_1.Observable(function (subscriber) {
            var buffers = sources.map(function () { return []; });
            var completed = sources.map(function () { return false; });
            subscriber.add(function () {
                buffers = completed = null;
            });
            var _loop_1 = function (sourceIndex) {
                innerFrom_1.innerFrom(sources[sourceIndex]).subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
                    buffers[sourceIndex].push(value);
                    if (buffers.every(function (buffer) { return buffer.length; })) {
                        var result = buffers.map(function (buffer) { return buffer.shift(); });
                        subscriber.next(resultSelector ? resultSelector.apply(void 0, __spreadArray([], __read(result))) : result);
                        if (buffers.some(function (buffer, i) { return !buffer.length && completed[i]; })) {
                            subscriber.complete();
                        }
                    }
                }, function () {
                    completed[sourceIndex] = true;
                    !buffers[sourceIndex].length && subscriber.complete();
                }));
            };
            for (var sourceIndex = 0; !subscriber.closed && sourceIndex < sources.length; sourceIndex++) {
                _loop_1(sourceIndex);
            }
            return function () {
                buffers = completed = null;
            };
        })
        : empty_1.EMPTY;
}
exports.zip = zip;

},{"../Observable":100,"../operators/OperatorSubscriber":140,"../util/args":294,"../util/argsOrArgArray":296,"./empty":118,"./innerFrom":126}],140:[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.OperatorSubscriber = exports.createOperatorSubscriber = void 0;
var Subscriber_1 = require("../Subscriber");
function createOperatorSubscriber(destination, onNext, onComplete, onError, onFinalize) {
    return new OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize);
}
exports.createOperatorSubscriber = createOperatorSubscriber;
var OperatorSubscriber = (function (_super) {
    __extends(OperatorSubscriber, _super);
    function OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize, shouldUnsubscribe) {
        var _this = _super.call(this, destination) || this;
        _this.onFinalize = onFinalize;
        _this.shouldUnsubscribe = shouldUnsubscribe;
        _this._next = onNext
            ? function (value) {
                try {
                    onNext(value);
                }
                catch (err) {
                    destination.error(err);
                }
            }
            : _super.prototype._next;
        _this._error = onError
            ? function (err) {
                try {
                    onError(err);
                }
                catch (err) {
                    destination.error(err);
                }
                finally {
                    this.unsubscribe();
                }
            }
            : _super.prototype._error;
        _this._complete = onComplete
            ? function () {
                try {
                    onComplete();
                }
                catch (err) {
                    destination.error(err);
                }
                finally {
                    this.unsubscribe();
                }
            }
            : _super.prototype._complete;
        return _this;
    }
    OperatorSubscriber.prototype.unsubscribe = function () {
        var _a;
        if (!this.shouldUnsubscribe || this.shouldUnsubscribe()) {
            var closed_1 = this.closed;
            _super.prototype.unsubscribe.call(this);
            !closed_1 && ((_a = this.onFinalize) === null || _a === void 0 ? void 0 : _a.call(this));
        }
    };
    return OperatorSubscriber;
}(Subscriber_1.Subscriber));
exports.OperatorSubscriber = OperatorSubscriber;

},{"../Subscriber":104}],141:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.audit = void 0;
var lift_1 = require("../util/lift");
var innerFrom_1 = require("../observable/innerFrom");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function audit(durationSelector) {
    return lift_1.operate(function (source, subscriber) {
        var hasValue = false;
        var lastValue = null;
        var durationSubscriber = null;
        var isComplete = false;
        var endDuration = function () {
            durationSubscriber === null || durationSubscriber === void 0 ? void 0 : durationSubscriber.unsubscribe();
            durationSubscriber = null;
            if (hasValue) {
                hasValue = false;
                var value = lastValue;
                lastValue = null;
                subscriber.next(value);
            }
            isComplete && subscriber.complete();
        };
        var cleanupDuration = function () {
            durationSubscriber = null;
            isComplete && subscriber.complete();
        };
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            hasValue = true;
            lastValue = value;
            if (!durationSubscriber) {
                innerFrom_1.innerFrom(durationSelector(value)).subscribe((durationSubscriber = OperatorSubscriber_1.createOperatorSubscriber(subscriber, endDuration, cleanupDuration)));
            }
        }, function () {
            isComplete = true;
            (!hasValue || !durationSubscriber || durationSubscriber.closed) && subscriber.complete();
        }));
    });
}
exports.audit = audit;

},{"../observable/innerFrom":126,"../util/lift":313,"./OperatorSubscriber":140}],142:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.auditTime = void 0;
var async_1 = require("../scheduler/async");
var audit_1 = require("./audit");
var timer_1 = require("../observable/timer");
function auditTime(duration, scheduler) {
    if (scheduler === void 0) { scheduler = async_1.asyncScheduler; }
    return audit_1.audit(function () { return timer_1.timer(duration, scheduler); });
}
exports.auditTime = auditTime;

},{"../observable/timer":137,"../scheduler/async":277,"./audit":141}],143:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.buffer = void 0;
var lift_1 = require("../util/lift");
var noop_1 = require("../util/noop");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var innerFrom_1 = require("../observable/innerFrom");
function buffer(closingNotifier) {
    return lift_1.operate(function (source, subscriber) {
        var currentBuffer = [];
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) { return currentBuffer.push(value); }, function () {
            subscriber.next(currentBuffer);
            subscriber.complete();
        }));
        innerFrom_1.innerFrom(closingNotifier).subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function () {
            var b = currentBuffer;
            currentBuffer = [];
            subscriber.next(b);
        }, noop_1.noop));
        return function () {
            currentBuffer = null;
        };
    });
}
exports.buffer = buffer;

},{"../observable/innerFrom":126,"../util/lift":313,"../util/noop":315,"./OperatorSubscriber":140}],144:[function(require,module,exports){
"use strict";
var __values = (this && this.__values) || function(o) {
    var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
    if (m) return m.call(o);
    if (o && typeof o.length === "number") return {
        next: function () {
            if (o && i >= o.length) o = void 0;
            return { value: o && o[i++], done: !o };
        }
    };
    throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.bufferCount = void 0;
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var arrRemove_1 = require("../util/arrRemove");
function bufferCount(bufferSize, startBufferEvery) {
    if (startBufferEvery === void 0) { startBufferEvery = null; }
    startBufferEvery = startBufferEvery !== null && startBufferEvery !== void 0 ? startBufferEvery : bufferSize;
    return lift_1.operate(function (source, subscriber) {
        var buffers = [];
        var count = 0;
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            var e_1, _a, e_2, _b;
            var toEmit = null;
            if (count++ % startBufferEvery === 0) {
                buffers.push([]);
            }
            try {
                for (var buffers_1 = __values(buffers), buffers_1_1 = buffers_1.next(); !buffers_1_1.done; buffers_1_1 = buffers_1.next()) {
                    var buffer = buffers_1_1.value;
                    buffer.push(value);
                    if (bufferSize <= buffer.length) {
                        toEmit = toEmit !== null && toEmit !== void 0 ? toEmit : [];
                        toEmit.push(buffer);
                    }
                }
            }
            catch (e_1_1) { e_1 = { error: e_1_1 }; }
            finally {
                try {
                    if (buffers_1_1 && !buffers_1_1.done && (_a = buffers_1.return)) _a.call(buffers_1);
                }
                finally { if (e_1) throw e_1.error; }
            }
            if (toEmit) {
                try {
                    for (var toEmit_1 = __values(toEmit), toEmit_1_1 = toEmit_1.next(); !toEmit_1_1.done; toEmit_1_1 = toEmit_1.next()) {
                        var buffer = toEmit_1_1.value;
                        arrRemove_1.arrRemove(buffers, buffer);
                        subscriber.next(buffer);
                    }
                }
                catch (e_2_1) { e_2 = { error: e_2_1 }; }
                finally {
                    try {
                        if (toEmit_1_1 && !toEmit_1_1.done && (_b = toEmit_1.return)) _b.call(toEmit_1);
                    }
                    finally { if (e_2) throw e_2.error; }
                }
            }
        }, function () {
            var e_3, _a;
            try {
                for (var buffers_2 = __values(buffers), buffers_2_1 = buffers_2.next(); !buffers_2_1.done; buffers_2_1 = buffers_2.next()) {
                    var buffer = buffers_2_1.value;
                    subscriber.next(buffer);
                }
            }
            catch (e_3_1) { e_3 = { error: e_3_1 }; }
            finally {
                try {
                    if (buffers_2_1 && !buffers_2_1.done && (_a = buffers_2.return)) _a.call(buffers_2);
                }
                finally { if (e_3) throw e_3.error; }
            }
            subscriber.complete();
        }, undefined, function () {
            buffers = null;
        }));
    });
}
exports.bufferCount = bufferCount;

},{"../util/arrRemove":297,"../util/lift":313,"./OperatorSubscriber":140}],145:[function(require,module,exports){
"use strict";
var __values = (this && this.__values) || function(o) {
    var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
    if (m) return m.call(o);
    if (o && typeof o.length === "number") return {
        next: function () {
            if (o && i >= o.length) o = void 0;
            return { value: o && o[i++], done: !o };
        }
    };
    throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.bufferTime = void 0;
var Subscription_1 = require("../Subscription");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var arrRemove_1 = require("../util/arrRemove");
var async_1 = require("../scheduler/async");
var args_1 = require("../util/args");
var executeSchedule_1 = require("../util/executeSchedule");
function bufferTime(bufferTimeSpan) {
    var _a, _b;
    var otherArgs = [];
    for (var _i = 1; _i < arguments.length; _i++) {
        otherArgs[_i - 1] = arguments[_i];
    }
    var scheduler = (_a = args_1.popScheduler(otherArgs)) !== null && _a !== void 0 ? _a : async_1.asyncScheduler;
    var bufferCreationInterval = (_b = otherArgs[0]) !== null && _b !== void 0 ? _b : null;
    var maxBufferSize = otherArgs[1] || Infinity;
    return lift_1.operate(function (source, subscriber) {
        var bufferRecords = [];
        var restartOnEmit = false;
        var emit = function (record) {
            var buffer = record.buffer, subs = record.subs;
            subs.unsubscribe();
            arrRemove_1.arrRemove(bufferRecords, record);
            subscriber.next(buffer);
            restartOnEmit && startBuffer();
        };
        var startBuffer = function () {
            if (bufferRecords) {
                var subs = new Subscription_1.Subscription();
                subscriber.add(subs);
                var buffer = [];
                var record_1 = {
                    buffer: buffer,
                    subs: subs,
                };
                bufferRecords.push(record_1);
                executeSchedule_1.executeSchedule(subs, scheduler, function () { return emit(record_1); }, bufferTimeSpan);
            }
        };
        if (bufferCreationInterval !== null && bufferCreationInterval >= 0) {
            executeSchedule_1.executeSchedule(subscriber, scheduler, startBuffer, bufferCreationInterval, true);
        }
        else {
            restartOnEmit = true;
        }
        startBuffer();
        var bufferTimeSubscriber = OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            var e_1, _a;
            var recordsCopy = bufferRecords.slice();
            try {
                for (var recordsCopy_1 = __values(recordsCopy), recordsCopy_1_1 = recordsCopy_1.next(); !recordsCopy_1_1.done; recordsCopy_1_1 = recordsCopy_1.next()) {
                    var record = recordsCopy_1_1.value;
                    var buffer = record.buffer;
                    buffer.push(value);
                    maxBufferSize <= buffer.length && emit(record);
                }
            }
            catch (e_1_1) { e_1 = { error: e_1_1 }; }
            finally {
                try {
                    if (recordsCopy_1_1 && !recordsCopy_1_1.done && (_a = recordsCopy_1.return)) _a.call(recordsCopy_1);
                }
                finally { if (e_1) throw e_1.error; }
            }
        }, function () {
            while (bufferRecords === null || bufferRecords === void 0 ? void 0 : bufferRecords.length) {
                subscriber.next(bufferRecords.shift().buffer);
            }
            bufferTimeSubscriber === null || bufferTimeSubscriber === void 0 ? void 0 : bufferTimeSubscriber.unsubscribe();
            subscriber.complete();
            subscriber.unsubscribe();
        }, undefined, function () { return (bufferRecords = null); });
        source.subscribe(bufferTimeSubscriber);
    });
}
exports.bufferTime = bufferTime;

},{"../Subscription":105,"../scheduler/async":277,"../util/args":294,"../util/arrRemove":297,"../util/executeSchedule":301,"../util/lift":313,"./OperatorSubscriber":140}],146:[function(require,module,exports){
"use strict";
var __values = (this && this.__values) || function(o) {
    var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
    if (m) return m.call(o);
    if (o && typeof o.length === "number") return {
        next: function () {
            if (o && i >= o.length) o = void 0;
            return { value: o && o[i++], done: !o };
        }
    };
    throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.bufferToggle = void 0;
var Subscription_1 = require("../Subscription");
var lift_1 = require("../util/lift");
var innerFrom_1 = require("../observable/innerFrom");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var noop_1 = require("../util/noop");
var arrRemove_1 = require("../util/arrRemove");
function bufferToggle(openings, closingSelector) {
    return lift_1.operate(function (source, subscriber) {
        var buffers = [];
        innerFrom_1.innerFrom(openings).subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (openValue) {
            var buffer = [];
            buffers.push(buffer);
            var closingSubscription = new Subscription_1.Subscription();
            var emitBuffer = function () {
                arrRemove_1.arrRemove(buffers, buffer);
                subscriber.next(buffer);
                closingSubscription.unsubscribe();
            };
            closingSubscription.add(innerFrom_1.innerFrom(closingSelector(openValue)).subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, emitBuffer, noop_1.noop)));
        }, noop_1.noop));
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            var e_1, _a;
            try {
                for (var buffers_1 = __values(buffers), buffers_1_1 = buffers_1.next(); !buffers_1_1.done; buffers_1_1 = buffers_1.next()) {
                    var buffer = buffers_1_1.value;
                    buffer.push(value);
                }
            }
            catch (e_1_1) { e_1 = { error: e_1_1 }; }
            finally {
                try {
                    if (buffers_1_1 && !buffers_1_1.done && (_a = buffers_1.return)) _a.call(buffers_1);
                }
                finally { if (e_1) throw e_1.error; }
            }
        }, function () {
            while (buffers.length > 0) {
                subscriber.next(buffers.shift());
            }
            subscriber.complete();
        }));
    });
}
exports.bufferToggle = bufferToggle;

},{"../Subscription":105,"../observable/innerFrom":126,"../util/arrRemove":297,"../util/lift":313,"../util/noop":315,"./OperatorSubscriber":140}],147:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.bufferWhen = void 0;
var lift_1 = require("../util/lift");
var noop_1 = require("../util/noop");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var innerFrom_1 = require("../observable/innerFrom");
function bufferWhen(closingSelector) {
    return lift_1.operate(function (source, subscriber) {
        var buffer = null;
        var closingSubscriber = null;
        var openBuffer = function () {
            closingSubscriber === null || closingSubscriber === void 0 ? void 0 : closingSubscriber.unsubscribe();
            var b = buffer;
            buffer = [];
            b && subscriber.next(b);
            innerFrom_1.innerFrom(closingSelector()).subscribe((closingSubscriber = OperatorSubscriber_1.createOperatorSubscriber(subscriber, openBuffer, noop_1.noop)));
        };
        openBuffer();
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) { return buffer === null || buffer === void 0 ? void 0 : buffer.push(value); }, function () {
            buffer && subscriber.next(buffer);
            subscriber.complete();
        }, undefined, function () { return (buffer = closingSubscriber = null); }));
    });
}
exports.bufferWhen = bufferWhen;

},{"../observable/innerFrom":126,"../util/lift":313,"../util/noop":315,"./OperatorSubscriber":140}],148:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.catchError = void 0;
var innerFrom_1 = require("../observable/innerFrom");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var lift_1 = require("../util/lift");
function catchError(selector) {
    return lift_1.operate(function (source, subscriber) {
        var innerSub = null;
        var syncUnsub = false;
        var handledResult;
        innerSub = source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, undefined, undefined, function (err) {
            handledResult = innerFrom_1.innerFrom(selector(err, catchError(selector)(source)));
            if (innerSub) {
                innerSub.unsubscribe();
                innerSub = null;
                handledResult.subscribe(subscriber);
            }
            else {
                syncUnsub = true;
            }
        }));
        if (syncUnsub) {
            innerSub.unsubscribe();
            innerSub = null;
            handledResult.subscribe(subscriber);
        }
    });
}
exports.catchError = catchError;

},{"../observable/innerFrom":126,"../util/lift":313,"./OperatorSubscriber":140}],149:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.combineAll = void 0;
var combineLatestAll_1 = require("./combineLatestAll");
exports.combineAll = combineLatestAll_1.combineLatestAll;

},{"./combineLatestAll":151}],150:[function(require,module,exports){
"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.combineLatest = void 0;
var combineLatest_1 = require("../observable/combineLatest");
var lift_1 = require("../util/lift");
var argsOrArgArray_1 = require("../util/argsOrArgArray");
var mapOneOrManyArgs_1 = require("../util/mapOneOrManyArgs");
var pipe_1 = require("../util/pipe");
var args_1 = require("../util/args");
function combineLatest() {
    var args = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        args[_i] = arguments[_i];
    }
    var resultSelector = args_1.popResultSelector(args);
    return resultSelector
        ? pipe_1.pipe(combineLatest.apply(void 0, __spreadArray([], __read(args))), mapOneOrManyArgs_1.mapOneOrManyArgs(resultSelector))
        : lift_1.operate(function (source, subscriber) {
            combineLatest_1.combineLatestInit(__spreadArray([source], __read(argsOrArgArray_1.argsOrArgArray(args))))(subscriber);
        });
}
exports.combineLatest = combineLatest;

},{"../observable/combineLatest":113,"../util/args":294,"../util/argsOrArgArray":296,"../util/lift":313,"../util/mapOneOrManyArgs":314,"../util/pipe":317}],151:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.combineLatestAll = void 0;
var combineLatest_1 = require("../observable/combineLatest");
var joinAllInternals_1 = require("./joinAllInternals");
function combineLatestAll(project) {
    return joinAllInternals_1.joinAllInternals(combineLatest_1.combineLatest, project);
}
exports.combineLatestAll = combineLatestAll;

},{"../observable/combineLatest":113,"./joinAllInternals":185}],152:[function(require,module,exports){
"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.combineLatestWith = void 0;
var combineLatest_1 = require("./combineLatest");
function combineLatestWith() {
    var otherSources = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        otherSources[_i] = arguments[_i];
    }
    return combineLatest_1.combineLatest.apply(void 0, __spreadArray([], __read(otherSources)));
}
exports.combineLatestWith = combineLatestWith;

},{"./combineLatest":150}],153:[function(require,module,exports){
"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.concat = void 0;
var lift_1 = require("../util/lift");
var concatAll_1 = require("./concatAll");
var args_1 = require("../util/args");
var from_1 = require("../observable/from");
function concat() {
    var args = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        args[_i] = arguments[_i];
    }
    var scheduler = args_1.popScheduler(args);
    return lift_1.operate(function (source, subscriber) {
        concatAll_1.concatAll()(from_1.from(__spreadArray([source], __read(args)), scheduler)).subscribe(subscriber);
    });
}
exports.concat = concat;

},{"../observable/from":120,"../util/args":294,"../util/lift":313,"./concatAll":154}],154:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.concatAll = void 0;
var mergeAll_1 = require("./mergeAll");
function concatAll() {
    return mergeAll_1.mergeAll(1);
}
exports.concatAll = concatAll;

},{"./mergeAll":192}],155:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.concatMap = void 0;
var mergeMap_1 = require("./mergeMap");
var isFunction_1 = require("../util/isFunction");
function concatMap(project, resultSelector) {
    return isFunction_1.isFunction(resultSelector) ? mergeMap_1.mergeMap(project, resultSelector, 1) : mergeMap_1.mergeMap(project, 1);
}
exports.concatMap = concatMap;

},{"../util/isFunction":306,"./mergeMap":194}],156:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.concatMapTo = void 0;
var concatMap_1 = require("./concatMap");
var isFunction_1 = require("../util/isFunction");
function concatMapTo(innerObservable, resultSelector) {
    return isFunction_1.isFunction(resultSelector) ? concatMap_1.concatMap(function () { return innerObservable; }, resultSelector) : concatMap_1.concatMap(function () { return innerObservable; });
}
exports.concatMapTo = concatMapTo;

},{"../util/isFunction":306,"./concatMap":155}],157:[function(require,module,exports){
"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.concatWith = void 0;
var concat_1 = require("./concat");
function concatWith() {
    var otherSources = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        otherSources[_i] = arguments[_i];
    }
    return concat_1.concat.apply(void 0, __spreadArray([], __read(otherSources)));
}
exports.concatWith = concatWith;

},{"./concat":153}],158:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.connect = void 0;
var Subject_1 = require("../Subject");
var innerFrom_1 = require("../observable/innerFrom");
var lift_1 = require("../util/lift");
var fromSubscribable_1 = require("../observable/fromSubscribable");
var DEFAULT_CONFIG = {
    connector: function () { return new Subject_1.Subject(); },
};
function connect(selector, config) {
    if (config === void 0) { config = DEFAULT_CONFIG; }
    var connector = config.connector;
    return lift_1.operate(function (source, subscriber) {
        var subject = connector();
        innerFrom_1.innerFrom(selector(fromSubscribable_1.fromSubscribable(subject))).subscribe(subscriber);
        subscriber.add(source.subscribe(subject));
    });
}
exports.connect = connect;

},{"../Subject":103,"../observable/fromSubscribable":123,"../observable/innerFrom":126,"../util/lift":313}],159:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.count = void 0;
var reduce_1 = require("./reduce");
function count(predicate) {
    return reduce_1.reduce(function (total, value, i) { return (!predicate || predicate(value, i) ? total + 1 : total); }, 0);
}
exports.count = count;

},{"./reduce":211}],160:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.debounce = void 0;
var lift_1 = require("../util/lift");
var noop_1 = require("../util/noop");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var innerFrom_1 = require("../observable/innerFrom");
function debounce(durationSelector) {
    return lift_1.operate(function (source, subscriber) {
        var hasValue = false;
        var lastValue = null;
        var durationSubscriber = null;
        var emit = function () {
            durationSubscriber === null || durationSubscriber === void 0 ? void 0 : durationSubscriber.unsubscribe();
            durationSubscriber = null;
            if (hasValue) {
                hasValue = false;
                var value = lastValue;
                lastValue = null;
                subscriber.next(value);
            }
        };
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            durationSubscriber === null || durationSubscriber === void 0 ? void 0 : durationSubscriber.unsubscribe();
            hasValue = true;
            lastValue = value;
            durationSubscriber = OperatorSubscriber_1.createOperatorSubscriber(subscriber, emit, noop_1.noop);
            innerFrom_1.innerFrom(durationSelector(value)).subscribe(durationSubscriber);
        }, function () {
            emit();
            subscriber.complete();
        }, undefined, function () {
            lastValue = durationSubscriber = null;
        }));
    });
}
exports.debounce = debounce;

},{"../observable/innerFrom":126,"../util/lift":313,"../util/noop":315,"./OperatorSubscriber":140}],161:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.debounceTime = void 0;
var async_1 = require("../scheduler/async");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function debounceTime(dueTime, scheduler) {
    if (scheduler === void 0) { scheduler = async_1.asyncScheduler; }
    return lift_1.operate(function (source, subscriber) {
        var activeTask = null;
        var lastValue = null;
        var lastTime = null;
        var emit = function () {
            if (activeTask) {
                activeTask.unsubscribe();
                activeTask = null;
                var value = lastValue;
                lastValue = null;
                subscriber.next(value);
            }
        };
        function emitWhenIdle() {
            var targetTime = lastTime + dueTime;
            var now = scheduler.now();
            if (now < targetTime) {
                activeTask = this.schedule(undefined, targetTime - now);
                subscriber.add(activeTask);
                return;
            }
            emit();
        }
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            lastValue = value;
            lastTime = scheduler.now();
            if (!activeTask) {
                activeTask = scheduler.schedule(emitWhenIdle, dueTime);
                subscriber.add(activeTask);
            }
        }, function () {
            emit();
            subscriber.complete();
        }, undefined, function () {
            lastValue = activeTask = null;
        }));
    });
}
exports.debounceTime = debounceTime;

},{"../scheduler/async":277,"../util/lift":313,"./OperatorSubscriber":140}],162:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.defaultIfEmpty = void 0;
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function defaultIfEmpty(defaultValue) {
    return lift_1.operate(function (source, subscriber) {
        var hasValue = false;
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            hasValue = true;
            subscriber.next(value);
        }, function () {
            if (!hasValue) {
                subscriber.next(defaultValue);
            }
            subscriber.complete();
        }));
    });
}
exports.defaultIfEmpty = defaultIfEmpty;

},{"../util/lift":313,"./OperatorSubscriber":140}],163:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.delay = void 0;
var async_1 = require("../scheduler/async");
var delayWhen_1 = require("./delayWhen");
var timer_1 = require("../observable/timer");
function delay(due, scheduler) {
    if (scheduler === void 0) { scheduler = async_1.asyncScheduler; }
    var duration = timer_1.timer(due, scheduler);
    return delayWhen_1.delayWhen(function () { return duration; });
}
exports.delay = delay;

},{"../observable/timer":137,"../scheduler/async":277,"./delayWhen":164}],164:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.delayWhen = void 0;
var concat_1 = require("../observable/concat");
var take_1 = require("./take");
var ignoreElements_1 = require("./ignoreElements");
var mapTo_1 = require("./mapTo");
var mergeMap_1 = require("./mergeMap");
var innerFrom_1 = require("../observable/innerFrom");
function delayWhen(delayDurationSelector, subscriptionDelay) {
    if (subscriptionDelay) {
        return function (source) {
            return concat_1.concat(subscriptionDelay.pipe(take_1.take(1), ignoreElements_1.ignoreElements()), source.pipe(delayWhen(delayDurationSelector)));
        };
    }
    return mergeMap_1.mergeMap(function (value, index) { return innerFrom_1.innerFrom(delayDurationSelector(value, index)).pipe(take_1.take(1), mapTo_1.mapTo(value)); });
}
exports.delayWhen = delayWhen;

},{"../observable/concat":114,"../observable/innerFrom":126,"./ignoreElements":183,"./mapTo":188,"./mergeMap":194,"./take":235}],165:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.dematerialize = void 0;
var Notification_1 = require("../Notification");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function dematerialize() {
    return lift_1.operate(function (source, subscriber) {
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (notification) { return Notification_1.observeNotification(notification, subscriber); }));
    });
}
exports.dematerialize = dematerialize;

},{"../Notification":98,"../util/lift":313,"./OperatorSubscriber":140}],166:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.distinct = void 0;
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var noop_1 = require("../util/noop");
var innerFrom_1 = require("../observable/innerFrom");
function distinct(keySelector, flushes) {
    return lift_1.operate(function (source, subscriber) {
        var distinctKeys = new Set();
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            var key = keySelector ? keySelector(value) : value;
            if (!distinctKeys.has(key)) {
                distinctKeys.add(key);
                subscriber.next(value);
            }
        }));
        flushes && innerFrom_1.innerFrom(flushes).subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function () { return distinctKeys.clear(); }, noop_1.noop));
    });
}
exports.distinct = distinct;

},{"../observable/innerFrom":126,"../util/lift":313,"../util/noop":315,"./OperatorSubscriber":140}],167:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.distinctUntilChanged = void 0;
var identity_1 = require("../util/identity");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function distinctUntilChanged(comparator, keySelector) {
    if (keySelector === void 0) { keySelector = identity_1.identity; }
    comparator = comparator !== null && comparator !== void 0 ? comparator : defaultCompare;
    return lift_1.operate(function (source, subscriber) {
        var previousKey;
        var first = true;
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            var currentKey = keySelector(value);
            if (first || !comparator(previousKey, currentKey)) {
                first = false;
                previousKey = currentKey;
                subscriber.next(value);
            }
        }));
    });
}
exports.distinctUntilChanged = distinctUntilChanged;
function defaultCompare(a, b) {
    return a === b;
}

},{"../util/identity":302,"../util/lift":313,"./OperatorSubscriber":140}],168:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.distinctUntilKeyChanged = void 0;
var distinctUntilChanged_1 = require("./distinctUntilChanged");
function distinctUntilKeyChanged(key, compare) {
    return distinctUntilChanged_1.distinctUntilChanged(function (x, y) { return (compare ? compare(x[key], y[key]) : x[key] === y[key]); });
}
exports.distinctUntilKeyChanged = distinctUntilKeyChanged;

},{"./distinctUntilChanged":167}],169:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.elementAt = void 0;
var ArgumentOutOfRangeError_1 = require("../util/ArgumentOutOfRangeError");
var filter_1 = require("./filter");
var throwIfEmpty_1 = require("./throwIfEmpty");
var defaultIfEmpty_1 = require("./defaultIfEmpty");
var take_1 = require("./take");
function elementAt(index, defaultValue) {
    if (index < 0) {
        throw new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError();
    }
    var hasDefaultValue = arguments.length >= 2;
    return function (source) {
        return source.pipe(filter_1.filter(function (v, i) { return i === index; }), take_1.take(1), hasDefaultValue ? defaultIfEmpty_1.defaultIfEmpty(defaultValue) : throwIfEmpty_1.throwIfEmpty(function () { return new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError(); }));
    };
}
exports.elementAt = elementAt;

},{"../util/ArgumentOutOfRangeError":287,"./defaultIfEmpty":162,"./filter":176,"./take":235,"./throwIfEmpty":242}],170:[function(require,module,exports){
"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.endWith = void 0;
var concat_1 = require("../observable/concat");
var of_1 = require("../observable/of");
function endWith() {
    var values = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        values[_i] = arguments[_i];
    }
    return function (source) { return concat_1.concat(source, of_1.of.apply(void 0, __spreadArray([], __read(values)))); };
}
exports.endWith = endWith;

},{"../observable/concat":114,"../observable/of":130}],171:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.every = void 0;
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function every(predicate, thisArg) {
    return lift_1.operate(function (source, subscriber) {
        var index = 0;
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            if (!predicate.call(thisArg, value, index++, source)) {
                subscriber.next(false);
                subscriber.complete();
            }
        }, function () {
            subscriber.next(true);
            subscriber.complete();
        }));
    });
}
exports.every = every;

},{"../util/lift":313,"./OperatorSubscriber":140}],172:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.exhaust = void 0;
var exhaustAll_1 = require("./exhaustAll");
exports.exhaust = exhaustAll_1.exhaustAll;

},{"./exhaustAll":173}],173:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.exhaustAll = void 0;
var exhaustMap_1 = require("./exhaustMap");
var identity_1 = require("../util/identity");
function exhaustAll() {
    return exhaustMap_1.exhaustMap(identity_1.identity);
}
exports.exhaustAll = exhaustAll;

},{"../util/identity":302,"./exhaustMap":174}],174:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.exhaustMap = void 0;
var map_1 = require("./map");
var innerFrom_1 = require("../observable/innerFrom");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function exhaustMap(project, resultSelector) {
    if (resultSelector) {
        return function (source) {
            return source.pipe(exhaustMap(function (a, i) { return innerFrom_1.innerFrom(project(a, i)).pipe(map_1.map(function (b, ii) { return resultSelector(a, b, i, ii); })); }));
        };
    }
    return lift_1.operate(function (source, subscriber) {
        var index = 0;
        var innerSub = null;
        var isComplete = false;
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (outerValue) {
            if (!innerSub) {
                innerSub = OperatorSubscriber_1.createOperatorSubscriber(subscriber, undefined, function () {
                    innerSub = null;
                    isComplete && subscriber.complete();
                });
                innerFrom_1.innerFrom(project(outerValue, index++)).subscribe(innerSub);
            }
        }, function () {
            isComplete = true;
            !innerSub && subscriber.complete();
        }));
    });
}
exports.exhaustMap = exhaustMap;

},{"../observable/innerFrom":126,"../util/lift":313,"./OperatorSubscriber":140,"./map":187}],175:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.expand = void 0;
var lift_1 = require("../util/lift");
var mergeInternals_1 = require("./mergeInternals");
function expand(project, concurrent, scheduler) {
    if (concurrent === void 0) { concurrent = Infinity; }
    concurrent = (concurrent || 0) < 1 ? Infinity : concurrent;
    return lift_1.operate(function (source, subscriber) {
        return mergeInternals_1.mergeInternals(source, subscriber, project, concurrent, undefined, true, scheduler);
    });
}
exports.expand = expand;

},{"../util/lift":313,"./mergeInternals":193}],176:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.filter = void 0;
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function filter(predicate, thisArg) {
    return lift_1.operate(function (source, subscriber) {
        var index = 0;
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) { return predicate.call(thisArg, value, index++) && subscriber.next(value); }));
    });
}
exports.filter = filter;

},{"../util/lift":313,"./OperatorSubscriber":140}],177:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.finalize = void 0;
var lift_1 = require("../util/lift");
function finalize(callback) {
    return lift_1.operate(function (source, subscriber) {
        try {
            source.subscribe(subscriber);
        }
        finally {
            subscriber.add(callback);
        }
    });
}
exports.finalize = finalize;

},{"../util/lift":313}],178:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.createFind = exports.find = void 0;
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function find(predicate, thisArg) {
    return lift_1.operate(createFind(predicate, thisArg, 'value'));
}
exports.find = find;
function createFind(predicate, thisArg, emit) {
    var findIndex = emit === 'index';
    return function (source, subscriber) {
        var index = 0;
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            var i = index++;
            if (predicate.call(thisArg, value, i, source)) {
                subscriber.next(findIndex ? i : value);
                subscriber.complete();
            }
        }, function () {
            subscriber.next(findIndex ? -1 : undefined);
            subscriber.complete();
        }));
    };
}
exports.createFind = createFind;

},{"../util/lift":313,"./OperatorSubscriber":140}],179:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.findIndex = void 0;
var lift_1 = require("../util/lift");
var find_1 = require("./find");
function findIndex(predicate, thisArg) {
    return lift_1.operate(find_1.createFind(predicate, thisArg, 'index'));
}
exports.findIndex = findIndex;

},{"../util/lift":313,"./find":178}],180:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.first = void 0;
var EmptyError_1 = require("../util/EmptyError");
var filter_1 = require("./filter");
var take_1 = require("./take");
var defaultIfEmpty_1 = require("./defaultIfEmpty");
var throwIfEmpty_1 = require("./throwIfEmpty");
var identity_1 = require("../util/identity");
function first(predicate, defaultValue) {
    var hasDefaultValue = arguments.length >= 2;
    return function (source) {
        return source.pipe(predicate ? filter_1.filter(function (v, i) { return predicate(v, i, source); }) : identity_1.identity, take_1.take(1), hasDefaultValue ? defaultIfEmpty_1.defaultIfEmpty(defaultValue) : throwIfEmpty_1.throwIfEmpty(function () { return new EmptyError_1.EmptyError(); }));
    };
}
exports.first = first;

},{"../util/EmptyError":288,"../util/identity":302,"./defaultIfEmpty":162,"./filter":176,"./take":235,"./throwIfEmpty":242}],181:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.flatMap = void 0;
var mergeMap_1 = require("./mergeMap");
exports.flatMap = mergeMap_1.mergeMap;

},{"./mergeMap":194}],182:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.groupBy = void 0;
var Observable_1 = require("../Observable");
var innerFrom_1 = require("../observable/innerFrom");
var Subject_1 = require("../Subject");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function groupBy(keySelector, elementOrOptions, duration, connector) {
    return lift_1.operate(function (source, subscriber) {
        var element;
        if (!elementOrOptions || typeof elementOrOptions === 'function') {
            element = elementOrOptions;
        }
        else {
            (duration = elementOrOptions.duration, element = elementOrOptions.element, connector = elementOrOptions.connector);
        }
        var groups = new Map();
        var notify = function (cb) {
            groups.forEach(cb);
            cb(subscriber);
        };
        var handleError = function (err) { return notify(function (consumer) { return consumer.error(err); }); };
        var activeGroups = 0;
        var teardownAttempted = false;
        var groupBySourceSubscriber = new OperatorSubscriber_1.OperatorSubscriber(subscriber, function (value) {
            try {
                var key_1 = keySelector(value);
                var group_1 = groups.get(key_1);
                if (!group_1) {
                    groups.set(key_1, (group_1 = connector ? connector() : new Subject_1.Subject()));
                    var grouped = createGroupedObservable(key_1, group_1);
                    subscriber.next(grouped);
                    if (duration) {
                        var durationSubscriber_1 = OperatorSubscriber_1.createOperatorSubscriber(group_1, function () {
                            group_1.complete();
                            durationSubscriber_1 === null || durationSubscriber_1 === void 0 ? void 0 : durationSubscriber_1.unsubscribe();
                        }, undefined, undefined, function () { return groups.delete(key_1); });
                        groupBySourceSubscriber.add(innerFrom_1.innerFrom(duration(grouped)).subscribe(durationSubscriber_1));
                    }
                }
                group_1.next(element ? element(value) : value);
            }
            catch (err) {
                handleError(err);
            }
        }, function () { return notify(function (consumer) { return consumer.complete(); }); }, handleError, function () { return groups.clear(); }, function () {
            teardownAttempted = true;
            return activeGroups === 0;
        });
        source.subscribe(groupBySourceSubscriber);
        function createGroupedObservable(key, groupSubject) {
            var result = new Observable_1.Observable(function (groupSubscriber) {
                activeGroups++;
                var innerSub = groupSubject.subscribe(groupSubscriber);
                return function () {
                    innerSub.unsubscribe();
                    --activeGroups === 0 && teardownAttempted && groupBySourceSubscriber.unsubscribe();
                };
            });
            result.key = key;
            return result;
        }
    });
}
exports.groupBy = groupBy;

},{"../Observable":100,"../Subject":103,"../observable/innerFrom":126,"../util/lift":313,"./OperatorSubscriber":140}],183:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ignoreElements = void 0;
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var noop_1 = require("../util/noop");
function ignoreElements() {
    return lift_1.operate(function (source, subscriber) {
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, noop_1.noop));
    });
}
exports.ignoreElements = ignoreElements;

},{"../util/lift":313,"../util/noop":315,"./OperatorSubscriber":140}],184:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.isEmpty = void 0;
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function isEmpty() {
    return lift_1.operate(function (source, subscriber) {
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function () {
            subscriber.next(false);
            subscriber.complete();
        }, function () {
            subscriber.next(true);
            subscriber.complete();
        }));
    });
}
exports.isEmpty = isEmpty;

},{"../util/lift":313,"./OperatorSubscriber":140}],185:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.joinAllInternals = void 0;
var identity_1 = require("../util/identity");
var mapOneOrManyArgs_1 = require("../util/mapOneOrManyArgs");
var pipe_1 = require("../util/pipe");
var mergeMap_1 = require("./mergeMap");
var toArray_1 = require("./toArray");
function joinAllInternals(joinFn, project) {
    return pipe_1.pipe(toArray_1.toArray(), mergeMap_1.mergeMap(function (sources) { return joinFn(sources); }), project ? mapOneOrManyArgs_1.mapOneOrManyArgs(project) : identity_1.identity);
}
exports.joinAllInternals = joinAllInternals;

},{"../util/identity":302,"../util/mapOneOrManyArgs":314,"../util/pipe":317,"./mergeMap":194,"./toArray":247}],186:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.last = void 0;
var EmptyError_1 = require("../util/EmptyError");
var filter_1 = require("./filter");
var takeLast_1 = require("./takeLast");
var throwIfEmpty_1 = require("./throwIfEmpty");
var defaultIfEmpty_1 = require("./defaultIfEmpty");
var identity_1 = require("../util/identity");
function last(predicate, defaultValue) {
    var hasDefaultValue = arguments.length >= 2;
    return function (source) {
        return source.pipe(predicate ? filter_1.filter(function (v, i) { return predicate(v, i, source); }) : identity_1.identity, takeLast_1.takeLast(1), hasDefaultValue ? defaultIfEmpty_1.defaultIfEmpty(defaultValue) : throwIfEmpty_1.throwIfEmpty(function () { return new EmptyError_1.EmptyError(); }));
    };
}
exports.last = last;

},{"../util/EmptyError":288,"../util/identity":302,"./defaultIfEmpty":162,"./filter":176,"./takeLast":236,"./throwIfEmpty":242}],187:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.map = void 0;
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function map(project, thisArg) {
    return lift_1.operate(function (source, subscriber) {
        var index = 0;
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            subscriber.next(project.call(thisArg, value, index++));
        }));
    });
}
exports.map = map;

},{"../util/lift":313,"./OperatorSubscriber":140}],188:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.mapTo = void 0;
var map_1 = require("./map");
function mapTo(value) {
    return map_1.map(function () { return value; });
}
exports.mapTo = mapTo;

},{"./map":187}],189:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.materialize = void 0;
var Notification_1 = require("../Notification");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function materialize() {
    return lift_1.operate(function (source, subscriber) {
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            subscriber.next(Notification_1.Notification.createNext(value));
        }, function () {
            subscriber.next(Notification_1.Notification.createComplete());
            subscriber.complete();
        }, function (err) {
            subscriber.next(Notification_1.Notification.createError(err));
            subscriber.complete();
        }));
    });
}
exports.materialize = materialize;

},{"../Notification":98,"../util/lift":313,"./OperatorSubscriber":140}],190:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.max = void 0;
var reduce_1 = require("./reduce");
var isFunction_1 = require("../util/isFunction");
function max(comparer) {
    return reduce_1.reduce(isFunction_1.isFunction(comparer) ? function (x, y) { return (comparer(x, y) > 0 ? x : y); } : function (x, y) { return (x > y ? x : y); });
}
exports.max = max;

},{"../util/isFunction":306,"./reduce":211}],191:[function(require,module,exports){
"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.merge = void 0;
var lift_1 = require("../util/lift");
var mergeAll_1 = require("./mergeAll");
var args_1 = require("../util/args");
var from_1 = require("../observable/from");
function merge() {
    var args = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        args[_i] = arguments[_i];
    }
    var scheduler = args_1.popScheduler(args);
    var concurrent = args_1.popNumber(args, Infinity);
    return lift_1.operate(function (source, subscriber) {
        mergeAll_1.mergeAll(concurrent)(from_1.from(__spreadArray([source], __read(args)), scheduler)).subscribe(subscriber);
    });
}
exports.merge = merge;

},{"../observable/from":120,"../util/args":294,"../util/lift":313,"./mergeAll":192}],192:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.mergeAll = void 0;
var mergeMap_1 = require("./mergeMap");
var identity_1 = require("../util/identity");
function mergeAll(concurrent) {
    if (concurrent === void 0) { concurrent = Infinity; }
    return mergeMap_1.mergeMap(identity_1.identity, concurrent);
}
exports.mergeAll = mergeAll;

},{"../util/identity":302,"./mergeMap":194}],193:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.mergeInternals = void 0;
var innerFrom_1 = require("../observable/innerFrom");
var executeSchedule_1 = require("../util/executeSchedule");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function mergeInternals(source, subscriber, project, concurrent, onBeforeNext, expand, innerSubScheduler, additionalFinalizer) {
    var buffer = [];
    var active = 0;
    var index = 0;
    var isComplete = false;
    var checkComplete = function () {
        if (isComplete && !buffer.length && !active) {
            subscriber.complete();
        }
    };
    var outerNext = function (value) { return (active < concurrent ? doInnerSub(value) : buffer.push(value)); };
    var doInnerSub = function (value) {
        expand && subscriber.next(value);
        active++;
        var innerComplete = false;
        innerFrom_1.innerFrom(project(value, index++)).subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (innerValue) {
            onBeforeNext === null || onBeforeNext === void 0 ? void 0 : onBeforeNext(innerValue);
            if (expand) {
                outerNext(innerValue);
            }
            else {
                subscriber.next(innerValue);
            }
        }, function () {
            innerComplete = true;
        }, undefined, function () {
            if (innerComplete) {
                try {
                    active--;
                    var _loop_1 = function () {
                        var bufferedValue = buffer.shift();
                        if (innerSubScheduler) {
                            executeSchedule_1.executeSchedule(subscriber, innerSubScheduler, function () { return doInnerSub(bufferedValue); });
                        }
                        else {
                            doInnerSub(bufferedValue);
                        }
                    };
                    while (buffer.length && active < concurrent) {
                        _loop_1();
                    }
                    checkComplete();
                }
                catch (err) {
                    subscriber.error(err);
                }
            }
        }));
    };
    source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, outerNext, function () {
        isComplete = true;
        checkComplete();
    }));
    return function () {
        additionalFinalizer === null || additionalFinalizer === void 0 ? void 0 : additionalFinalizer();
    };
}
exports.mergeInternals = mergeInternals;

},{"../observable/innerFrom":126,"../util/executeSchedule":301,"./OperatorSubscriber":140}],194:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.mergeMap = void 0;
var map_1 = require("./map");
var innerFrom_1 = require("../observable/innerFrom");
var lift_1 = require("../util/lift");
var mergeInternals_1 = require("./mergeInternals");
var isFunction_1 = require("../util/isFunction");
function mergeMap(project, resultSelector, concurrent) {
    if (concurrent === void 0) { concurrent = Infinity; }
    if (isFunction_1.isFunction(resultSelector)) {
        return mergeMap(function (a, i) { return map_1.map(function (b, ii) { return resultSelector(a, b, i, ii); })(innerFrom_1.innerFrom(project(a, i))); }, concurrent);
    }
    else if (typeof resultSelector === 'number') {
        concurrent = resultSelector;
    }
    return lift_1.operate(function (source, subscriber) { return mergeInternals_1.mergeInternals(source, subscriber, project, concurrent); });
}
exports.mergeMap = mergeMap;

},{"../observable/innerFrom":126,"../util/isFunction":306,"../util/lift":313,"./map":187,"./mergeInternals":193}],195:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.mergeMapTo = void 0;
var mergeMap_1 = require("./mergeMap");
var isFunction_1 = require("../util/isFunction");
function mergeMapTo(innerObservable, resultSelector, concurrent) {
    if (concurrent === void 0) { concurrent = Infinity; }
    if (isFunction_1.isFunction(resultSelector)) {
        return mergeMap_1.mergeMap(function () { return innerObservable; }, resultSelector, concurrent);
    }
    if (typeof resultSelector === 'number') {
        concurrent = resultSelector;
    }
    return mergeMap_1.mergeMap(function () { return innerObservable; }, concurrent);
}
exports.mergeMapTo = mergeMapTo;

},{"../util/isFunction":306,"./mergeMap":194}],196:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.mergeScan = void 0;
var lift_1 = require("../util/lift");
var mergeInternals_1 = require("./mergeInternals");
function mergeScan(accumulator, seed, concurrent) {
    if (concurrent === void 0) { concurrent = Infinity; }
    return lift_1.operate(function (source, subscriber) {
        var state = seed;
        return mergeInternals_1.mergeInternals(source, subscriber, function (value, index) { return accumulator(state, value, index); }, concurrent, function (value) {
            state = value;
        }, false, undefined, function () { return (state = null); });
    });
}
exports.mergeScan = mergeScan;

},{"../util/lift":313,"./mergeInternals":193}],197:[function(require,module,exports){
"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.mergeWith = void 0;
var merge_1 = require("./merge");
function mergeWith() {
    var otherSources = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        otherSources[_i] = arguments[_i];
    }
    return merge_1.merge.apply(void 0, __spreadArray([], __read(otherSources)));
}
exports.mergeWith = mergeWith;

},{"./merge":191}],198:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.min = void 0;
var reduce_1 = require("./reduce");
var isFunction_1 = require("../util/isFunction");
function min(comparer) {
    return reduce_1.reduce(isFunction_1.isFunction(comparer) ? function (x, y) { return (comparer(x, y) < 0 ? x : y); } : function (x, y) { return (x < y ? x : y); });
}
exports.min = min;

},{"../util/isFunction":306,"./reduce":211}],199:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.multicast = void 0;
var ConnectableObservable_1 = require("../observable/ConnectableObservable");
var isFunction_1 = require("../util/isFunction");
var connect_1 = require("./connect");
function multicast(subjectOrSubjectFactory, selector) {
    var subjectFactory = isFunction_1.isFunction(subjectOrSubjectFactory) ? subjectOrSubjectFactory : function () { return subjectOrSubjectFactory; };
    if (isFunction_1.isFunction(selector)) {
        return connect_1.connect(selector, {
            connector: subjectFactory,
        });
    }
    return function (source) { return new ConnectableObservable_1.ConnectableObservable(source, subjectFactory); };
}
exports.multicast = multicast;

},{"../observable/ConnectableObservable":109,"../util/isFunction":306,"./connect":158}],200:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.observeOn = void 0;
var executeSchedule_1 = require("../util/executeSchedule");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function observeOn(scheduler, delay) {
    if (delay === void 0) { delay = 0; }
    return lift_1.operate(function (source, subscriber) {
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) { return executeSchedule_1.executeSchedule(subscriber, scheduler, function () { return subscriber.next(value); }, delay); }, function () { return executeSchedule_1.executeSchedule(subscriber, scheduler, function () { return subscriber.complete(); }, delay); }, function (err) { return executeSchedule_1.executeSchedule(subscriber, scheduler, function () { return subscriber.error(err); }, delay); }));
    });
}
exports.observeOn = observeOn;

},{"../util/executeSchedule":301,"../util/lift":313,"./OperatorSubscriber":140}],201:[function(require,module,exports){
"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.onErrorResumeNext = exports.onErrorResumeNextWith = void 0;
var argsOrArgArray_1 = require("../util/argsOrArgArray");
var onErrorResumeNext_1 = require("../observable/onErrorResumeNext");
function onErrorResumeNextWith() {
    var sources = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        sources[_i] = arguments[_i];
    }
    var nextSources = argsOrArgArray_1.argsOrArgArray(sources);
    return function (source) { return onErrorResumeNext_1.onErrorResumeNext.apply(void 0, __spreadArray([source], __read(nextSources))); };
}
exports.onErrorResumeNextWith = onErrorResumeNextWith;
exports.onErrorResumeNext = onErrorResumeNextWith;

},{"../observable/onErrorResumeNext":131,"../util/argsOrArgArray":296}],202:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.pairwise = void 0;
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function pairwise() {
    return lift_1.operate(function (source, subscriber) {
        var prev;
        var hasPrev = false;
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            var p = prev;
            prev = value;
            hasPrev && subscriber.next([p, value]);
            hasPrev = true;
        }));
    });
}
exports.pairwise = pairwise;

},{"../util/lift":313,"./OperatorSubscriber":140}],203:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.partition = void 0;
var not_1 = require("../util/not");
var filter_1 = require("./filter");
function partition(predicate, thisArg) {
    return function (source) {
        return [filter_1.filter(predicate, thisArg)(source), filter_1.filter(not_1.not(predicate, thisArg))(source)];
    };
}
exports.partition = partition;

},{"../util/not":316,"./filter":176}],204:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.pluck = void 0;
var map_1 = require("./map");
function pluck() {
    var properties = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        properties[_i] = arguments[_i];
    }
    var length = properties.length;
    if (length === 0) {
        throw new Error('list of properties cannot be empty.');
    }
    return map_1.map(function (x) {
        var currentProp = x;
        for (var i = 0; i < length; i++) {
            var p = currentProp === null || currentProp === void 0 ? void 0 : currentProp[properties[i]];
            if (typeof p !== 'undefined') {
                currentProp = p;
            }
            else {
                return undefined;
            }
        }
        return currentProp;
    });
}
exports.pluck = pluck;

},{"./map":187}],205:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.publish = void 0;
var Subject_1 = require("../Subject");
var multicast_1 = require("./multicast");
var connect_1 = require("./connect");
function publish(selector) {
    return selector ? function (source) { return connect_1.connect(selector)(source); } : function (source) { return multicast_1.multicast(new Subject_1.Subject())(source); };
}
exports.publish = publish;

},{"../Subject":103,"./connect":158,"./multicast":199}],206:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.publishBehavior = void 0;
var BehaviorSubject_1 = require("../BehaviorSubject");
var ConnectableObservable_1 = require("../observable/ConnectableObservable");
function publishBehavior(initialValue) {
    return function (source) {
        var subject = new BehaviorSubject_1.BehaviorSubject(initialValue);
        return new ConnectableObservable_1.ConnectableObservable(source, function () { return subject; });
    };
}
exports.publishBehavior = publishBehavior;

},{"../BehaviorSubject":97,"../observable/ConnectableObservable":109}],207:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.publishLast = void 0;
var AsyncSubject_1 = require("../AsyncSubject");
var ConnectableObservable_1 = require("../observable/ConnectableObservable");
function publishLast() {
    return function (source) {
        var subject = new AsyncSubject_1.AsyncSubject();
        return new ConnectableObservable_1.ConnectableObservable(source, function () { return subject; });
    };
}
exports.publishLast = publishLast;

},{"../AsyncSubject":96,"../observable/ConnectableObservable":109}],208:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.publishReplay = void 0;
var ReplaySubject_1 = require("../ReplaySubject");
var multicast_1 = require("./multicast");
var isFunction_1 = require("../util/isFunction");
function publishReplay(bufferSize, windowTime, selectorOrScheduler, timestampProvider) {
    if (selectorOrScheduler && !isFunction_1.isFunction(selectorOrScheduler)) {
        timestampProvider = selectorOrScheduler;
    }
    var selector = isFunction_1.isFunction(selectorOrScheduler) ? selectorOrScheduler : undefined;
    return function (source) { return multicast_1.multicast(new ReplaySubject_1.ReplaySubject(bufferSize, windowTime, timestampProvider), selector)(source); };
}
exports.publishReplay = publishReplay;

},{"../ReplaySubject":101,"../util/isFunction":306,"./multicast":199}],209:[function(require,module,exports){
"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.race = void 0;
var argsOrArgArray_1 = require("../util/argsOrArgArray");
var raceWith_1 = require("./raceWith");
function race() {
    var args = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        args[_i] = arguments[_i];
    }
    return raceWith_1.raceWith.apply(void 0, __spreadArray([], __read(argsOrArgArray_1.argsOrArgArray(args))));
}
exports.race = race;

},{"../util/argsOrArgArray":296,"./raceWith":210}],210:[function(require,module,exports){
"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.raceWith = void 0;
var race_1 = require("../observable/race");
var lift_1 = require("../util/lift");
var identity_1 = require("../util/identity");
function raceWith() {
    var otherSources = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        otherSources[_i] = arguments[_i];
    }
    return !otherSources.length
        ? identity_1.identity
        : lift_1.operate(function (source, subscriber) {
            race_1.raceInit(__spreadArray([source], __read(otherSources)))(subscriber);
        });
}
exports.raceWith = raceWith;

},{"../observable/race":134,"../util/identity":302,"../util/lift":313}],211:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.reduce = void 0;
var scanInternals_1 = require("./scanInternals");
var lift_1 = require("../util/lift");
function reduce(accumulator, seed) {
    return lift_1.operate(scanInternals_1.scanInternals(accumulator, seed, arguments.length >= 2, false, true));
}
exports.reduce = reduce;

},{"../util/lift":313,"./scanInternals":220}],212:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.refCount = void 0;
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function refCount() {
    return lift_1.operate(function (source, subscriber) {
        var connection = null;
        source._refCount++;
        var refCounter = OperatorSubscriber_1.createOperatorSubscriber(subscriber, undefined, undefined, undefined, function () {
            if (!source || source._refCount <= 0 || 0 < --source._refCount) {
                connection = null;
                return;
            }
            var sharedConnection = source._connection;
            var conn = connection;
            connection = null;
            if (sharedConnection && (!conn || sharedConnection === conn)) {
                sharedConnection.unsubscribe();
            }
            subscriber.unsubscribe();
        });
        source.subscribe(refCounter);
        if (!refCounter.closed) {
            connection = source.connect();
        }
    });
}
exports.refCount = refCount;

},{"../util/lift":313,"./OperatorSubscriber":140}],213:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.repeat = void 0;
var empty_1 = require("../observable/empty");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var innerFrom_1 = require("../observable/innerFrom");
var timer_1 = require("../observable/timer");
function repeat(countOrConfig) {
    var _a;
    var count = Infinity;
    var delay;
    if (countOrConfig != null) {
        if (typeof countOrConfig === 'object') {
            (_a = countOrConfig.count, count = _a === void 0 ? Infinity : _a, delay = countOrConfig.delay);
        }
        else {
            count = countOrConfig;
        }
    }
    return count <= 0
        ? function () { return empty_1.EMPTY; }
        : lift_1.operate(function (source, subscriber) {
            var soFar = 0;
            var sourceSub;
            var resubscribe = function () {
                sourceSub === null || sourceSub === void 0 ? void 0 : sourceSub.unsubscribe();
                sourceSub = null;
                if (delay != null) {
                    var notifier = typeof delay === 'number' ? timer_1.timer(delay) : innerFrom_1.innerFrom(delay(soFar));
                    var notifierSubscriber_1 = OperatorSubscriber_1.createOperatorSubscriber(subscriber, function () {
                        notifierSubscriber_1.unsubscribe();
                        subscribeToSource();
                    });
                    notifier.subscribe(notifierSubscriber_1);
                }
                else {
                    subscribeToSource();
                }
            };
            var subscribeToSource = function () {
                var syncUnsub = false;
                sourceSub = source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, undefined, function () {
                    if (++soFar < count) {
                        if (sourceSub) {
                            resubscribe();
                        }
                        else {
                            syncUnsub = true;
                        }
                    }
                    else {
                        subscriber.complete();
                    }
                }));
                if (syncUnsub) {
                    resubscribe();
                }
            };
            subscribeToSource();
        });
}
exports.repeat = repeat;

},{"../observable/empty":118,"../observable/innerFrom":126,"../observable/timer":137,"../util/lift":313,"./OperatorSubscriber":140}],214:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.repeatWhen = void 0;
var innerFrom_1 = require("../observable/innerFrom");
var Subject_1 = require("../Subject");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function repeatWhen(notifier) {
    return lift_1.operate(function (source, subscriber) {
        var innerSub;
        var syncResub = false;
        var completions$;
        var isNotifierComplete = false;
        var isMainComplete = false;
        var checkComplete = function () { return isMainComplete && isNotifierComplete && (subscriber.complete(), true); };
        var getCompletionSubject = function () {
            if (!completions$) {
                completions$ = new Subject_1.Subject();
                innerFrom_1.innerFrom(notifier(completions$)).subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function () {
                    if (innerSub) {
                        subscribeForRepeatWhen();
                    }
                    else {
                        syncResub = true;
                    }
                }, function () {
                    isNotifierComplete = true;
                    checkComplete();
                }));
            }
            return completions$;
        };
        var subscribeForRepeatWhen = function () {
            isMainComplete = false;
            innerSub = source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, undefined, function () {
                isMainComplete = true;
                !checkComplete() && getCompletionSubject().next();
            }));
            if (syncResub) {
                innerSub.unsubscribe();
                innerSub = null;
                syncResub = false;
                subscribeForRepeatWhen();
            }
        };
        subscribeForRepeatWhen();
    });
}
exports.repeatWhen = repeatWhen;

},{"../Subject":103,"../observable/innerFrom":126,"../util/lift":313,"./OperatorSubscriber":140}],215:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.retry = void 0;
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var identity_1 = require("../util/identity");
var timer_1 = require("../observable/timer");
var innerFrom_1 = require("../observable/innerFrom");
function retry(configOrCount) {
    if (configOrCount === void 0) { configOrCount = Infinity; }
    var config;
    if (configOrCount && typeof configOrCount === 'object') {
        config = configOrCount;
    }
    else {
        config = {
            count: configOrCount,
        };
    }
    var _a = config.count, count = _a === void 0 ? Infinity : _a, delay = config.delay, _b = config.resetOnSuccess, resetOnSuccess = _b === void 0 ? false : _b;
    return count <= 0
        ? identity_1.identity
        : lift_1.operate(function (source, subscriber) {
            var soFar = 0;
            var innerSub;
            var subscribeForRetry = function () {
                var syncUnsub = false;
                innerSub = source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
                    if (resetOnSuccess) {
                        soFar = 0;
                    }
                    subscriber.next(value);
                }, undefined, function (err) {
                    if (soFar++ < count) {
                        var resub_1 = function () {
                            if (innerSub) {
                                innerSub.unsubscribe();
                                innerSub = null;
                                subscribeForRetry();
                            }
                            else {
                                syncUnsub = true;
                            }
                        };
                        if (delay != null) {
                            var notifier = typeof delay === 'number' ? timer_1.timer(delay) : innerFrom_1.innerFrom(delay(err, soFar));
                            var notifierSubscriber_1 = OperatorSubscriber_1.createOperatorSubscriber(subscriber, function () {
                                notifierSubscriber_1.unsubscribe();
                                resub_1();
                            }, function () {
                                subscriber.complete();
                            });
                            notifier.subscribe(notifierSubscriber_1);
                        }
                        else {
                            resub_1();
                        }
                    }
                    else {
                        subscriber.error(err);
                    }
                }));
                if (syncUnsub) {
                    innerSub.unsubscribe();
                    innerSub = null;
                    subscribeForRetry();
                }
            };
            subscribeForRetry();
        });
}
exports.retry = retry;

},{"../observable/innerFrom":126,"../observable/timer":137,"../util/identity":302,"../util/lift":313,"./OperatorSubscriber":140}],216:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.retryWhen = void 0;
var innerFrom_1 = require("../observable/innerFrom");
var Subject_1 = require("../Subject");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function retryWhen(notifier) {
    return lift_1.operate(function (source, subscriber) {
        var innerSub;
        var syncResub = false;
        var errors$;
        var subscribeForRetryWhen = function () {
            innerSub = source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, undefined, undefined, function (err) {
                if (!errors$) {
                    errors$ = new Subject_1.Subject();
                    innerFrom_1.innerFrom(notifier(errors$)).subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function () {
                        return innerSub ? subscribeForRetryWhen() : (syncResub = true);
                    }));
                }
                if (errors$) {
                    errors$.next(err);
                }
            }));
            if (syncResub) {
                innerSub.unsubscribe();
                innerSub = null;
                syncResub = false;
                subscribeForRetryWhen();
            }
        };
        subscribeForRetryWhen();
    });
}
exports.retryWhen = retryWhen;

},{"../Subject":103,"../observable/innerFrom":126,"../util/lift":313,"./OperatorSubscriber":140}],217:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.sample = void 0;
var innerFrom_1 = require("../observable/innerFrom");
var lift_1 = require("../util/lift");
var noop_1 = require("../util/noop");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function sample(notifier) {
    return lift_1.operate(function (source, subscriber) {
        var hasValue = false;
        var lastValue = null;
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            hasValue = true;
            lastValue = value;
        }));
        innerFrom_1.innerFrom(notifier).subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function () {
            if (hasValue) {
                hasValue = false;
                var value = lastValue;
                lastValue = null;
                subscriber.next(value);
            }
        }, noop_1.noop));
    });
}
exports.sample = sample;

},{"../observable/innerFrom":126,"../util/lift":313,"../util/noop":315,"./OperatorSubscriber":140}],218:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.sampleTime = void 0;
var async_1 = require("../scheduler/async");
var sample_1 = require("./sample");
var interval_1 = require("../observable/interval");
function sampleTime(period, scheduler) {
    if (scheduler === void 0) { scheduler = async_1.asyncScheduler; }
    return sample_1.sample(interval_1.interval(period, scheduler));
}
exports.sampleTime = sampleTime;

},{"../observable/interval":127,"../scheduler/async":277,"./sample":217}],219:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.scan = void 0;
var lift_1 = require("../util/lift");
var scanInternals_1 = require("./scanInternals");
function scan(accumulator, seed) {
    return lift_1.operate(scanInternals_1.scanInternals(accumulator, seed, arguments.length >= 2, true));
}
exports.scan = scan;

},{"../util/lift":313,"./scanInternals":220}],220:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.scanInternals = void 0;
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function scanInternals(accumulator, seed, hasSeed, emitOnNext, emitBeforeComplete) {
    return function (source, subscriber) {
        var hasState = hasSeed;
        var state = seed;
        var index = 0;
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            var i = index++;
            state = hasState
                ?
                    accumulator(state, value, i)
                :
                    ((hasState = true), value);
            emitOnNext && subscriber.next(state);
        }, emitBeforeComplete &&
            (function () {
                hasState && subscriber.next(state);
                subscriber.complete();
            })));
    };
}
exports.scanInternals = scanInternals;

},{"./OperatorSubscriber":140}],221:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.sequenceEqual = void 0;
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var innerFrom_1 = require("../observable/innerFrom");
function sequenceEqual(compareTo, comparator) {
    if (comparator === void 0) { comparator = function (a, b) { return a === b; }; }
    return lift_1.operate(function (source, subscriber) {
        var aState = createState();
        var bState = createState();
        var emit = function (isEqual) {
            subscriber.next(isEqual);
            subscriber.complete();
        };
        var createSubscriber = function (selfState, otherState) {
            var sequenceEqualSubscriber = OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (a) {
                var buffer = otherState.buffer, complete = otherState.complete;
                if (buffer.length === 0) {
                    complete ? emit(false) : selfState.buffer.push(a);
                }
                else {
                    !comparator(a, buffer.shift()) && emit(false);
                }
            }, function () {
                selfState.complete = true;
                var complete = otherState.complete, buffer = otherState.buffer;
                complete && emit(buffer.length === 0);
                sequenceEqualSubscriber === null || sequenceEqualSubscriber === void 0 ? void 0 : sequenceEqualSubscriber.unsubscribe();
            });
            return sequenceEqualSubscriber;
        };
        source.subscribe(createSubscriber(aState, bState));
        innerFrom_1.innerFrom(compareTo).subscribe(createSubscriber(bState, aState));
    });
}
exports.sequenceEqual = sequenceEqual;
function createState() {
    return {
        buffer: [],
        complete: false,
    };
}

},{"../observable/innerFrom":126,"../util/lift":313,"./OperatorSubscriber":140}],222:[function(require,module,exports){
"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.share = void 0;
var innerFrom_1 = require("../observable/innerFrom");
var Subject_1 = require("../Subject");
var Subscriber_1 = require("../Subscriber");
var lift_1 = require("../util/lift");
function share(options) {
    if (options === void 0) { options = {}; }
    var _a = options.connector, connector = _a === void 0 ? function () { return new Subject_1.Subject(); } : _a, _b = options.resetOnError, resetOnError = _b === void 0 ? true : _b, _c = options.resetOnComplete, resetOnComplete = _c === void 0 ? true : _c, _d = options.resetOnRefCountZero, resetOnRefCountZero = _d === void 0 ? true : _d;
    return function (wrapperSource) {
        var connection;
        var resetConnection;
        var subject;
        var refCount = 0;
        var hasCompleted = false;
        var hasErrored = false;
        var cancelReset = function () {
            resetConnection === null || resetConnection === void 0 ? void 0 : resetConnection.unsubscribe();
            resetConnection = undefined;
        };
        var reset = function () {
            cancelReset();
            connection = subject = undefined;
            hasCompleted = hasErrored = false;
        };
        var resetAndUnsubscribe = function () {
            var conn = connection;
            reset();
            conn === null || conn === void 0 ? void 0 : conn.unsubscribe();
        };
        return lift_1.operate(function (source, subscriber) {
            refCount++;
            if (!hasErrored && !hasCompleted) {
                cancelReset();
            }
            var dest = (subject = subject !== null && subject !== void 0 ? subject : connector());
            subscriber.add(function () {
                refCount--;
                if (refCount === 0 && !hasErrored && !hasCompleted) {
                    resetConnection = handleReset(resetAndUnsubscribe, resetOnRefCountZero);
                }
            });
            dest.subscribe(subscriber);
            if (!connection &&
                refCount > 0) {
                connection = new Subscriber_1.SafeSubscriber({
                    next: function (value) { return dest.next(value); },
                    error: function (err) {
                        hasErrored = true;
                        cancelReset();
                        resetConnection = handleReset(reset, resetOnError, err);
                        dest.error(err);
                    },
                    complete: function () {
                        hasCompleted = true;
                        cancelReset();
                        resetConnection = handleReset(reset, resetOnComplete);
                        dest.complete();
                    },
                });
                innerFrom_1.innerFrom(source).subscribe(connection);
            }
        })(wrapperSource);
    };
}
exports.share = share;
function handleReset(reset, on) {
    var args = [];
    for (var _i = 2; _i < arguments.length; _i++) {
        args[_i - 2] = arguments[_i];
    }
    if (on === true) {
        reset();
        return;
    }
    if (on === false) {
        return;
    }
    var onSubscriber = new Subscriber_1.SafeSubscriber({
        next: function () {
            onSubscriber.unsubscribe();
            reset();
        },
    });
    return innerFrom_1.innerFrom(on.apply(void 0, __spreadArray([], __read(args)))).subscribe(onSubscriber);
}

},{"../Subject":103,"../Subscriber":104,"../observable/innerFrom":126,"../util/lift":313}],223:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.shareReplay = void 0;
var ReplaySubject_1 = require("../ReplaySubject");
var share_1 = require("./share");
function shareReplay(configOrBufferSize, windowTime, scheduler) {
    var _a, _b, _c;
    var bufferSize;
    var refCount = false;
    if (configOrBufferSize && typeof configOrBufferSize === 'object') {
        (_a = configOrBufferSize.bufferSize, bufferSize = _a === void 0 ? Infinity : _a, _b = configOrBufferSize.windowTime, windowTime = _b === void 0 ? Infinity : _b, _c = configOrBufferSize.refCount, refCount = _c === void 0 ? false : _c, scheduler = configOrBufferSize.scheduler);
    }
    else {
        bufferSize = (configOrBufferSize !== null && configOrBufferSize !== void 0 ? configOrBufferSize : Infinity);
    }
    return share_1.share({
        connector: function () { return new ReplaySubject_1.ReplaySubject(bufferSize, windowTime, scheduler); },
        resetOnError: true,
        resetOnComplete: false,
        resetOnRefCountZero: refCount,
    });
}
exports.shareReplay = shareReplay;

},{"../ReplaySubject":101,"./share":222}],224:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.single = void 0;
var EmptyError_1 = require("../util/EmptyError");
var SequenceError_1 = require("../util/SequenceError");
var NotFoundError_1 = require("../util/NotFoundError");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function single(predicate) {
    return lift_1.operate(function (source, subscriber) {
        var hasValue = false;
        var singleValue;
        var seenValue = false;
        var index = 0;
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            seenValue = true;
            if (!predicate || predicate(value, index++, source)) {
                hasValue && subscriber.error(new SequenceError_1.SequenceError('Too many matching values'));
                hasValue = true;
                singleValue = value;
            }
        }, function () {
            if (hasValue) {
                subscriber.next(singleValue);
                subscriber.complete();
            }
            else {
                subscriber.error(seenValue ? new NotFoundError_1.NotFoundError('No matching values') : new EmptyError_1.EmptyError());
            }
        }));
    });
}
exports.single = single;

},{"../util/EmptyError":288,"../util/NotFoundError":290,"../util/SequenceError":292,"../util/lift":313,"./OperatorSubscriber":140}],225:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.skip = void 0;
var filter_1 = require("./filter");
function skip(count) {
    return filter_1.filter(function (_, index) { return count <= index; });
}
exports.skip = skip;

},{"./filter":176}],226:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.skipLast = void 0;
var identity_1 = require("../util/identity");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function skipLast(skipCount) {
    return skipCount <= 0
        ?
            identity_1.identity
        : lift_1.operate(function (source, subscriber) {
            var ring = new Array(skipCount);
            var seen = 0;
            source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
                var valueIndex = seen++;
                if (valueIndex < skipCount) {
                    ring[valueIndex] = value;
                }
                else {
                    var index = valueIndex % skipCount;
                    var oldValue = ring[index];
                    ring[index] = value;
                    subscriber.next(oldValue);
                }
            }));
            return function () {
                ring = null;
            };
        });
}
exports.skipLast = skipLast;

},{"../util/identity":302,"../util/lift":313,"./OperatorSubscriber":140}],227:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.skipUntil = void 0;
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var innerFrom_1 = require("../observable/innerFrom");
var noop_1 = require("../util/noop");
function skipUntil(notifier) {
    return lift_1.operate(function (source, subscriber) {
        var taking = false;
        var skipSubscriber = OperatorSubscriber_1.createOperatorSubscriber(subscriber, function () {
            skipSubscriber === null || skipSubscriber === void 0 ? void 0 : skipSubscriber.unsubscribe();
            taking = true;
        }, noop_1.noop);
        innerFrom_1.innerFrom(notifier).subscribe(skipSubscriber);
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) { return taking && subscriber.next(value); }));
    });
}
exports.skipUntil = skipUntil;

},{"../observable/innerFrom":126,"../util/lift":313,"../util/noop":315,"./OperatorSubscriber":140}],228:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.skipWhile = void 0;
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function skipWhile(predicate) {
    return lift_1.operate(function (source, subscriber) {
        var taking = false;
        var index = 0;
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) { return (taking || (taking = !predicate(value, index++))) && subscriber.next(value); }));
    });
}
exports.skipWhile = skipWhile;

},{"../util/lift":313,"./OperatorSubscriber":140}],229:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.startWith = void 0;
var concat_1 = require("../observable/concat");
var args_1 = require("../util/args");
var lift_1 = require("../util/lift");
function startWith() {
    var values = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        values[_i] = arguments[_i];
    }
    var scheduler = args_1.popScheduler(values);
    return lift_1.operate(function (source, subscriber) {
        (scheduler ? concat_1.concat(values, source, scheduler) : concat_1.concat(values, source)).subscribe(subscriber);
    });
}
exports.startWith = startWith;

},{"../observable/concat":114,"../util/args":294,"../util/lift":313}],230:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.subscribeOn = void 0;
var lift_1 = require("../util/lift");
function subscribeOn(scheduler, delay) {
    if (delay === void 0) { delay = 0; }
    return lift_1.operate(function (source, subscriber) {
        subscriber.add(scheduler.schedule(function () { return source.subscribe(subscriber); }, delay));
    });
}
exports.subscribeOn = subscribeOn;

},{"../util/lift":313}],231:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.switchAll = void 0;
var switchMap_1 = require("./switchMap");
var identity_1 = require("../util/identity");
function switchAll() {
    return switchMap_1.switchMap(identity_1.identity);
}
exports.switchAll = switchAll;

},{"../util/identity":302,"./switchMap":232}],232:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.switchMap = void 0;
var innerFrom_1 = require("../observable/innerFrom");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function switchMap(project, resultSelector) {
    return lift_1.operate(function (source, subscriber) {
        var innerSubscriber = null;
        var index = 0;
        var isComplete = false;
        var checkComplete = function () { return isComplete && !innerSubscriber && subscriber.complete(); };
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            innerSubscriber === null || innerSubscriber === void 0 ? void 0 : innerSubscriber.unsubscribe();
            var innerIndex = 0;
            var outerIndex = index++;
            innerFrom_1.innerFrom(project(value, outerIndex)).subscribe((innerSubscriber = OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (innerValue) { return subscriber.next(resultSelector ? resultSelector(value, innerValue, outerIndex, innerIndex++) : innerValue); }, function () {
                innerSubscriber = null;
                checkComplete();
            })));
        }, function () {
            isComplete = true;
            checkComplete();
        }));
    });
}
exports.switchMap = switchMap;

},{"../observable/innerFrom":126,"../util/lift":313,"./OperatorSubscriber":140}],233:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.switchMapTo = void 0;
var switchMap_1 = require("./switchMap");
var isFunction_1 = require("../util/isFunction");
function switchMapTo(innerObservable, resultSelector) {
    return isFunction_1.isFunction(resultSelector) ? switchMap_1.switchMap(function () { return innerObservable; }, resultSelector) : switchMap_1.switchMap(function () { return innerObservable; });
}
exports.switchMapTo = switchMapTo;

},{"../util/isFunction":306,"./switchMap":232}],234:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.switchScan = void 0;
var switchMap_1 = require("./switchMap");
var lift_1 = require("../util/lift");
function switchScan(accumulator, seed) {
    return lift_1.operate(function (source, subscriber) {
        var state = seed;
        switchMap_1.switchMap(function (value, index) { return accumulator(state, value, index); }, function (_, innerValue) { return ((state = innerValue), innerValue); })(source).subscribe(subscriber);
        return function () {
            state = null;
        };
    });
}
exports.switchScan = switchScan;

},{"../util/lift":313,"./switchMap":232}],235:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.take = void 0;
var empty_1 = require("../observable/empty");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function take(count) {
    return count <= 0
        ?
            function () { return empty_1.EMPTY; }
        : lift_1.operate(function (source, subscriber) {
            var seen = 0;
            source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
                if (++seen <= count) {
                    subscriber.next(value);
                    if (count <= seen) {
                        subscriber.complete();
                    }
                }
            }));
        });
}
exports.take = take;

},{"../observable/empty":118,"../util/lift":313,"./OperatorSubscriber":140}],236:[function(require,module,exports){
"use strict";
var __values = (this && this.__values) || function(o) {
    var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
    if (m) return m.call(o);
    if (o && typeof o.length === "number") return {
        next: function () {
            if (o && i >= o.length) o = void 0;
            return { value: o && o[i++], done: !o };
        }
    };
    throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.takeLast = void 0;
var empty_1 = require("../observable/empty");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function takeLast(count) {
    return count <= 0
        ? function () { return empty_1.EMPTY; }
        : lift_1.operate(function (source, subscriber) {
            var buffer = [];
            source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
                buffer.push(value);
                count < buffer.length && buffer.shift();
            }, function () {
                var e_1, _a;
                try {
                    for (var buffer_1 = __values(buffer), buffer_1_1 = buffer_1.next(); !buffer_1_1.done; buffer_1_1 = buffer_1.next()) {
                        var value = buffer_1_1.value;
                        subscriber.next(value);
                    }
                }
                catch (e_1_1) { e_1 = { error: e_1_1 }; }
                finally {
                    try {
                        if (buffer_1_1 && !buffer_1_1.done && (_a = buffer_1.return)) _a.call(buffer_1);
                    }
                    finally { if (e_1) throw e_1.error; }
                }
                subscriber.complete();
            }, undefined, function () {
                buffer = null;
            }));
        });
}
exports.takeLast = takeLast;

},{"../observable/empty":118,"../util/lift":313,"./OperatorSubscriber":140}],237:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.takeUntil = void 0;
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var innerFrom_1 = require("../observable/innerFrom");
var noop_1 = require("../util/noop");
function takeUntil(notifier) {
    return lift_1.operate(function (source, subscriber) {
        innerFrom_1.innerFrom(notifier).subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function () { return subscriber.complete(); }, noop_1.noop));
        !subscriber.closed && source.subscribe(subscriber);
    });
}
exports.takeUntil = takeUntil;

},{"../observable/innerFrom":126,"../util/lift":313,"../util/noop":315,"./OperatorSubscriber":140}],238:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.takeWhile = void 0;
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function takeWhile(predicate, inclusive) {
    if (inclusive === void 0) { inclusive = false; }
    return lift_1.operate(function (source, subscriber) {
        var index = 0;
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            var result = predicate(value, index++);
            (result || inclusive) && subscriber.next(value);
            !result && subscriber.complete();
        }));
    });
}
exports.takeWhile = takeWhile;

},{"../util/lift":313,"./OperatorSubscriber":140}],239:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.tap = void 0;
var isFunction_1 = require("../util/isFunction");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var identity_1 = require("../util/identity");
function tap(observerOrNext, error, complete) {
    var tapObserver = isFunction_1.isFunction(observerOrNext) || error || complete
        ?
            { next: observerOrNext, error: error, complete: complete }
        : observerOrNext;
    return tapObserver
        ? lift_1.operate(function (source, subscriber) {
            var _a;
            (_a = tapObserver.subscribe) === null || _a === void 0 ? void 0 : _a.call(tapObserver);
            var isUnsub = true;
            source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
                var _a;
                (_a = tapObserver.next) === null || _a === void 0 ? void 0 : _a.call(tapObserver, value);
                subscriber.next(value);
            }, function () {
                var _a;
                isUnsub = false;
                (_a = tapObserver.complete) === null || _a === void 0 ? void 0 : _a.call(tapObserver);
                subscriber.complete();
            }, function (err) {
                var _a;
                isUnsub = false;
                (_a = tapObserver.error) === null || _a === void 0 ? void 0 : _a.call(tapObserver, err);
                subscriber.error(err);
            }, function () {
                var _a, _b;
                if (isUnsub) {
                    (_a = tapObserver.unsubscribe) === null || _a === void 0 ? void 0 : _a.call(tapObserver);
                }
                (_b = tapObserver.finalize) === null || _b === void 0 ? void 0 : _b.call(tapObserver);
            }));
        })
        :
            identity_1.identity;
}
exports.tap = tap;

},{"../util/identity":302,"../util/isFunction":306,"../util/lift":313,"./OperatorSubscriber":140}],240:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.throttle = void 0;
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var innerFrom_1 = require("../observable/innerFrom");
function throttle(durationSelector, config) {
    return lift_1.operate(function (source, subscriber) {
        var _a = config !== null && config !== void 0 ? config : {}, _b = _a.leading, leading = _b === void 0 ? true : _b, _c = _a.trailing, trailing = _c === void 0 ? false : _c;
        var hasValue = false;
        var sendValue = null;
        var throttled = null;
        var isComplete = false;
        var endThrottling = function () {
            throttled === null || throttled === void 0 ? void 0 : throttled.unsubscribe();
            throttled = null;
            if (trailing) {
                send();
                isComplete && subscriber.complete();
            }
        };
        var cleanupThrottling = function () {
            throttled = null;
            isComplete && subscriber.complete();
        };
        var startThrottle = function (value) {
            return (throttled = innerFrom_1.innerFrom(durationSelector(value)).subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, endThrottling, cleanupThrottling)));
        };
        var send = function () {
            if (hasValue) {
                hasValue = false;
                var value = sendValue;
                sendValue = null;
                subscriber.next(value);
                !isComplete && startThrottle(value);
            }
        };
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            hasValue = true;
            sendValue = value;
            !(throttled && !throttled.closed) && (leading ? send() : startThrottle(value));
        }, function () {
            isComplete = true;
            !(trailing && hasValue && throttled && !throttled.closed) && subscriber.complete();
        }));
    });
}
exports.throttle = throttle;

},{"../observable/innerFrom":126,"../util/lift":313,"./OperatorSubscriber":140}],241:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.throttleTime = void 0;
var async_1 = require("../scheduler/async");
var throttle_1 = require("./throttle");
var timer_1 = require("../observable/timer");
function throttleTime(duration, scheduler, config) {
    if (scheduler === void 0) { scheduler = async_1.asyncScheduler; }
    var duration$ = timer_1.timer(duration, scheduler);
    return throttle_1.throttle(function () { return duration$; }, config);
}
exports.throttleTime = throttleTime;

},{"../observable/timer":137,"../scheduler/async":277,"./throttle":240}],242:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.throwIfEmpty = void 0;
var EmptyError_1 = require("../util/EmptyError");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function throwIfEmpty(errorFactory) {
    if (errorFactory === void 0) { errorFactory = defaultErrorFactory; }
    return lift_1.operate(function (source, subscriber) {
        var hasValue = false;
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            hasValue = true;
            subscriber.next(value);
        }, function () { return (hasValue ? subscriber.complete() : subscriber.error(errorFactory())); }));
    });
}
exports.throwIfEmpty = throwIfEmpty;
function defaultErrorFactory() {
    return new EmptyError_1.EmptyError();
}

},{"../util/EmptyError":288,"../util/lift":313,"./OperatorSubscriber":140}],243:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.TimeInterval = exports.timeInterval = void 0;
var async_1 = require("../scheduler/async");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function timeInterval(scheduler) {
    if (scheduler === void 0) { scheduler = async_1.asyncScheduler; }
    return lift_1.operate(function (source, subscriber) {
        var last = scheduler.now();
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            var now = scheduler.now();
            var interval = now - last;
            last = now;
            subscriber.next(new TimeInterval(value, interval));
        }));
    });
}
exports.timeInterval = timeInterval;
var TimeInterval = (function () {
    function TimeInterval(value, interval) {
        this.value = value;
        this.interval = interval;
    }
    return TimeInterval;
}());
exports.TimeInterval = TimeInterval;

},{"../scheduler/async":277,"../util/lift":313,"./OperatorSubscriber":140}],244:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.timeout = exports.TimeoutError = void 0;
var async_1 = require("../scheduler/async");
var isDate_1 = require("../util/isDate");
var lift_1 = require("../util/lift");
var innerFrom_1 = require("../observable/innerFrom");
var createErrorClass_1 = require("../util/createErrorClass");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var executeSchedule_1 = require("../util/executeSchedule");
exports.TimeoutError = createErrorClass_1.createErrorClass(function (_super) {
    return function TimeoutErrorImpl(info) {
        if (info === void 0) { info = null; }
        _super(this);
        this.message = 'Timeout has occurred';
        this.name = 'TimeoutError';
        this.info = info;
    };
});
function timeout(config, schedulerArg) {
    var _a = (isDate_1.isValidDate(config) ? { first: config } : typeof config === 'number' ? { each: config } : config), first = _a.first, each = _a.each, _b = _a.with, _with = _b === void 0 ? timeoutErrorFactory : _b, _c = _a.scheduler, scheduler = _c === void 0 ? schedulerArg !== null && schedulerArg !== void 0 ? schedulerArg : async_1.asyncScheduler : _c, _d = _a.meta, meta = _d === void 0 ? null : _d;
    if (first == null && each == null) {
        throw new TypeError('No timeout provided.');
    }
    return lift_1.operate(function (source, subscriber) {
        var originalSourceSubscription;
        var timerSubscription;
        var lastValue = null;
        var seen = 0;
        var startTimer = function (delay) {
            timerSubscription = executeSchedule_1.executeSchedule(subscriber, scheduler, function () {
                try {
                    originalSourceSubscription.unsubscribe();
                    innerFrom_1.innerFrom(_with({
                        meta: meta,
                        lastValue: lastValue,
                        seen: seen,
                    })).subscribe(subscriber);
                }
                catch (err) {
                    subscriber.error(err);
                }
            }, delay);
        };
        originalSourceSubscription = source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            timerSubscription === null || timerSubscription === void 0 ? void 0 : timerSubscription.unsubscribe();
            seen++;
            subscriber.next((lastValue = value));
            each > 0 && startTimer(each);
        }, undefined, undefined, function () {
            if (!(timerSubscription === null || timerSubscription === void 0 ? void 0 : timerSubscription.closed)) {
                timerSubscription === null || timerSubscription === void 0 ? void 0 : timerSubscription.unsubscribe();
            }
            lastValue = null;
        }));
        !seen && startTimer(first != null ? (typeof first === 'number' ? first : +first - scheduler.now()) : each);
    });
}
exports.timeout = timeout;
function timeoutErrorFactory(info) {
    throw new exports.TimeoutError(info);
}

},{"../observable/innerFrom":126,"../scheduler/async":277,"../util/createErrorClass":298,"../util/executeSchedule":301,"../util/isDate":305,"../util/lift":313,"./OperatorSubscriber":140}],245:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.timeoutWith = void 0;
var async_1 = require("../scheduler/async");
var isDate_1 = require("../util/isDate");
var timeout_1 = require("./timeout");
function timeoutWith(due, withObservable, scheduler) {
    var first;
    var each;
    var _with;
    scheduler = scheduler !== null && scheduler !== void 0 ? scheduler : async_1.async;
    if (isDate_1.isValidDate(due)) {
        first = due;
    }
    else if (typeof due === 'number') {
        each = due;
    }
    if (withObservable) {
        _with = function () { return withObservable; };
    }
    else {
        throw new TypeError('No observable provided to switch to');
    }
    if (first == null && each == null) {
        throw new TypeError('No timeout provided.');
    }
    return timeout_1.timeout({
        first: first,
        each: each,
        scheduler: scheduler,
        with: _with,
    });
}
exports.timeoutWith = timeoutWith;

},{"../scheduler/async":277,"../util/isDate":305,"./timeout":244}],246:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.timestamp = void 0;
var dateTimestampProvider_1 = require("../scheduler/dateTimestampProvider");
var map_1 = require("./map");
function timestamp(timestampProvider) {
    if (timestampProvider === void 0) { timestampProvider = dateTimestampProvider_1.dateTimestampProvider; }
    return map_1.map(function (value) { return ({ value: value, timestamp: timestampProvider.now() }); });
}
exports.timestamp = timestamp;

},{"../scheduler/dateTimestampProvider":278,"./map":187}],247:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.toArray = void 0;
var reduce_1 = require("./reduce");
var lift_1 = require("../util/lift");
var arrReducer = function (arr, value) { return (arr.push(value), arr); };
function toArray() {
    return lift_1.operate(function (source, subscriber) {
        reduce_1.reduce(arrReducer, [])(source).subscribe(subscriber);
    });
}
exports.toArray = toArray;

},{"../util/lift":313,"./reduce":211}],248:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.window = void 0;
var Subject_1 = require("../Subject");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var noop_1 = require("../util/noop");
var innerFrom_1 = require("../observable/innerFrom");
function window(windowBoundaries) {
    return lift_1.operate(function (source, subscriber) {
        var windowSubject = new Subject_1.Subject();
        subscriber.next(windowSubject.asObservable());
        var errorHandler = function (err) {
            windowSubject.error(err);
            subscriber.error(err);
        };
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) { return windowSubject === null || windowSubject === void 0 ? void 0 : windowSubject.next(value); }, function () {
            windowSubject.complete();
            subscriber.complete();
        }, errorHandler));
        innerFrom_1.innerFrom(windowBoundaries).subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function () {
            windowSubject.complete();
            subscriber.next((windowSubject = new Subject_1.Subject()));
        }, noop_1.noop, errorHandler));
        return function () {
            windowSubject === null || windowSubject === void 0 ? void 0 : windowSubject.unsubscribe();
            windowSubject = null;
        };
    });
}
exports.window = window;

},{"../Subject":103,"../observable/innerFrom":126,"../util/lift":313,"../util/noop":315,"./OperatorSubscriber":140}],249:[function(require,module,exports){
"use strict";
var __values = (this && this.__values) || function(o) {
    var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
    if (m) return m.call(o);
    if (o && typeof o.length === "number") return {
        next: function () {
            if (o && i >= o.length) o = void 0;
            return { value: o && o[i++], done: !o };
        }
    };
    throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.windowCount = void 0;
var Subject_1 = require("../Subject");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function windowCount(windowSize, startWindowEvery) {
    if (startWindowEvery === void 0) { startWindowEvery = 0; }
    var startEvery = startWindowEvery > 0 ? startWindowEvery : windowSize;
    return lift_1.operate(function (source, subscriber) {
        var windows = [new Subject_1.Subject()];
        var starts = [];
        var count = 0;
        subscriber.next(windows[0].asObservable());
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            var e_1, _a;
            try {
                for (var windows_1 = __values(windows), windows_1_1 = windows_1.next(); !windows_1_1.done; windows_1_1 = windows_1.next()) {
                    var window_1 = windows_1_1.value;
                    window_1.next(value);
                }
            }
            catch (e_1_1) { e_1 = { error: e_1_1 }; }
            finally {
                try {
                    if (windows_1_1 && !windows_1_1.done && (_a = windows_1.return)) _a.call(windows_1);
                }
                finally { if (e_1) throw e_1.error; }
            }
            var c = count - windowSize + 1;
            if (c >= 0 && c % startEvery === 0) {
                windows.shift().complete();
            }
            if (++count % startEvery === 0) {
                var window_2 = new Subject_1.Subject();
                windows.push(window_2);
                subscriber.next(window_2.asObservable());
            }
        }, function () {
            while (windows.length > 0) {
                windows.shift().complete();
            }
            subscriber.complete();
        }, function (err) {
            while (windows.length > 0) {
                windows.shift().error(err);
            }
            subscriber.error(err);
        }, function () {
            starts = null;
            windows = null;
        }));
    });
}
exports.windowCount = windowCount;

},{"../Subject":103,"../util/lift":313,"./OperatorSubscriber":140}],250:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.windowTime = void 0;
var Subject_1 = require("../Subject");
var async_1 = require("../scheduler/async");
var Subscription_1 = require("../Subscription");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var arrRemove_1 = require("../util/arrRemove");
var args_1 = require("../util/args");
var executeSchedule_1 = require("../util/executeSchedule");
function windowTime(windowTimeSpan) {
    var _a, _b;
    var otherArgs = [];
    for (var _i = 1; _i < arguments.length; _i++) {
        otherArgs[_i - 1] = arguments[_i];
    }
    var scheduler = (_a = args_1.popScheduler(otherArgs)) !== null && _a !== void 0 ? _a : async_1.asyncScheduler;
    var windowCreationInterval = (_b = otherArgs[0]) !== null && _b !== void 0 ? _b : null;
    var maxWindowSize = otherArgs[1] || Infinity;
    return lift_1.operate(function (source, subscriber) {
        var windowRecords = [];
        var restartOnClose = false;
        var closeWindow = function (record) {
            var window = record.window, subs = record.subs;
            window.complete();
            subs.unsubscribe();
            arrRemove_1.arrRemove(windowRecords, record);
            restartOnClose && startWindow();
        };
        var startWindow = function () {
            if (windowRecords) {
                var subs = new Subscription_1.Subscription();
                subscriber.add(subs);
                var window_1 = new Subject_1.Subject();
                var record_1 = {
                    window: window_1,
                    subs: subs,
                    seen: 0,
                };
                windowRecords.push(record_1);
                subscriber.next(window_1.asObservable());
                executeSchedule_1.executeSchedule(subs, scheduler, function () { return closeWindow(record_1); }, windowTimeSpan);
            }
        };
        if (windowCreationInterval !== null && windowCreationInterval >= 0) {
            executeSchedule_1.executeSchedule(subscriber, scheduler, startWindow, windowCreationInterval, true);
        }
        else {
            restartOnClose = true;
        }
        startWindow();
        var loop = function (cb) { return windowRecords.slice().forEach(cb); };
        var terminate = function (cb) {
            loop(function (_a) {
                var window = _a.window;
                return cb(window);
            });
            cb(subscriber);
            subscriber.unsubscribe();
        };
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            loop(function (record) {
                record.window.next(value);
                maxWindowSize <= ++record.seen && closeWindow(record);
            });
        }, function () { return terminate(function (consumer) { return consumer.complete(); }); }, function (err) { return terminate(function (consumer) { return consumer.error(err); }); }));
        return function () {
            windowRecords = null;
        };
    });
}
exports.windowTime = windowTime;

},{"../Subject":103,"../Subscription":105,"../scheduler/async":277,"../util/args":294,"../util/arrRemove":297,"../util/executeSchedule":301,"../util/lift":313,"./OperatorSubscriber":140}],251:[function(require,module,exports){
"use strict";
var __values = (this && this.__values) || function(o) {
    var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
    if (m) return m.call(o);
    if (o && typeof o.length === "number") return {
        next: function () {
            if (o && i >= o.length) o = void 0;
            return { value: o && o[i++], done: !o };
        }
    };
    throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.windowToggle = void 0;
var Subject_1 = require("../Subject");
var Subscription_1 = require("../Subscription");
var lift_1 = require("../util/lift");
var innerFrom_1 = require("../observable/innerFrom");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var noop_1 = require("../util/noop");
var arrRemove_1 = require("../util/arrRemove");
function windowToggle(openings, closingSelector) {
    return lift_1.operate(function (source, subscriber) {
        var windows = [];
        var handleError = function (err) {
            while (0 < windows.length) {
                windows.shift().error(err);
            }
            subscriber.error(err);
        };
        innerFrom_1.innerFrom(openings).subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (openValue) {
            var window = new Subject_1.Subject();
            windows.push(window);
            var closingSubscription = new Subscription_1.Subscription();
            var closeWindow = function () {
                arrRemove_1.arrRemove(windows, window);
                window.complete();
                closingSubscription.unsubscribe();
            };
            var closingNotifier;
            try {
                closingNotifier = innerFrom_1.innerFrom(closingSelector(openValue));
            }
            catch (err) {
                handleError(err);
                return;
            }
            subscriber.next(window.asObservable());
            closingSubscription.add(closingNotifier.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, closeWindow, noop_1.noop, handleError)));
        }, noop_1.noop));
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            var e_1, _a;
            var windowsCopy = windows.slice();
            try {
                for (var windowsCopy_1 = __values(windowsCopy), windowsCopy_1_1 = windowsCopy_1.next(); !windowsCopy_1_1.done; windowsCopy_1_1 = windowsCopy_1.next()) {
                    var window_1 = windowsCopy_1_1.value;
                    window_1.next(value);
                }
            }
            catch (e_1_1) { e_1 = { error: e_1_1 }; }
            finally {
                try {
                    if (windowsCopy_1_1 && !windowsCopy_1_1.done && (_a = windowsCopy_1.return)) _a.call(windowsCopy_1);
                }
                finally { if (e_1) throw e_1.error; }
            }
        }, function () {
            while (0 < windows.length) {
                windows.shift().complete();
            }
            subscriber.complete();
        }, handleError, function () {
            while (0 < windows.length) {
                windows.shift().unsubscribe();
            }
        }));
    });
}
exports.windowToggle = windowToggle;

},{"../Subject":103,"../Subscription":105,"../observable/innerFrom":126,"../util/arrRemove":297,"../util/lift":313,"../util/noop":315,"./OperatorSubscriber":140}],252:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.windowWhen = void 0;
var Subject_1 = require("../Subject");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var innerFrom_1 = require("../observable/innerFrom");
function windowWhen(closingSelector) {
    return lift_1.operate(function (source, subscriber) {
        var window;
        var closingSubscriber;
        var handleError = function (err) {
            window.error(err);
            subscriber.error(err);
        };
        var openWindow = function () {
            closingSubscriber === null || closingSubscriber === void 0 ? void 0 : closingSubscriber.unsubscribe();
            window === null || window === void 0 ? void 0 : window.complete();
            window = new Subject_1.Subject();
            subscriber.next(window.asObservable());
            var closingNotifier;
            try {
                closingNotifier = innerFrom_1.innerFrom(closingSelector());
            }
            catch (err) {
                handleError(err);
                return;
            }
            closingNotifier.subscribe((closingSubscriber = OperatorSubscriber_1.createOperatorSubscriber(subscriber, openWindow, openWindow, handleError)));
        };
        openWindow();
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) { return window.next(value); }, function () {
            window.complete();
            subscriber.complete();
        }, handleError, function () {
            closingSubscriber === null || closingSubscriber === void 0 ? void 0 : closingSubscriber.unsubscribe();
            window = null;
        }));
    });
}
exports.windowWhen = windowWhen;

},{"../Subject":103,"../observable/innerFrom":126,"../util/lift":313,"./OperatorSubscriber":140}],253:[function(require,module,exports){
"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.withLatestFrom = void 0;
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var innerFrom_1 = require("../observable/innerFrom");
var identity_1 = require("../util/identity");
var noop_1 = require("../util/noop");
var args_1 = require("../util/args");
function withLatestFrom() {
    var inputs = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        inputs[_i] = arguments[_i];
    }
    var project = args_1.popResultSelector(inputs);
    return lift_1.operate(function (source, subscriber) {
        var len = inputs.length;
        var otherValues = new Array(len);
        var hasValue = inputs.map(function () { return false; });
        var ready = false;
        var _loop_1 = function (i) {
            innerFrom_1.innerFrom(inputs[i]).subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
                otherValues[i] = value;
                if (!ready && !hasValue[i]) {
                    hasValue[i] = true;
                    (ready = hasValue.every(identity_1.identity)) && (hasValue = null);
                }
            }, noop_1.noop));
        };
        for (var i = 0; i < len; i++) {
            _loop_1(i);
        }
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            if (ready) {
                var values = __spreadArray([value], __read(otherValues));
                subscriber.next(project ? project.apply(void 0, __spreadArray([], __read(values))) : values);
            }
        }));
    });
}
exports.withLatestFrom = withLatestFrom;

},{"../observable/innerFrom":126,"../util/args":294,"../util/identity":302,"../util/lift":313,"../util/noop":315,"./OperatorSubscriber":140}],254:[function(require,module,exports){
"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.zip = void 0;
var zip_1 = require("../observable/zip");
var lift_1 = require("../util/lift");
function zip() {
    var sources = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        sources[_i] = arguments[_i];
    }
    return lift_1.operate(function (source, subscriber) {
        zip_1.zip.apply(void 0, __spreadArray([source], __read(sources))).subscribe(subscriber);
    });
}
exports.zip = zip;

},{"../observable/zip":139,"../util/lift":313}],255:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.zipAll = void 0;
var zip_1 = require("../observable/zip");
var joinAllInternals_1 = require("./joinAllInternals");
function zipAll(project) {
    return joinAllInternals_1.joinAllInternals(zip_1.zip, project);
}
exports.zipAll = zipAll;

},{"../observable/zip":139,"./joinAllInternals":185}],256:[function(require,module,exports){
"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.zipWith = void 0;
var zip_1 = require("./zip");
function zipWith() {
    var otherInputs = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        otherInputs[_i] = arguments[_i];
    }
    return zip_1.zip.apply(void 0, __spreadArray([], __read(otherInputs)));
}
exports.zipWith = zipWith;

},{"./zip":254}],257:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.scheduleArray = void 0;
var Observable_1 = require("../Observable");
function scheduleArray(input, scheduler) {
    return new Observable_1.Observable(function (subscriber) {
        var i = 0;
        return scheduler.schedule(function () {
            if (i === input.length) {
                subscriber.complete();
            }
            else {
                subscriber.next(input[i++]);
                if (!subscriber.closed) {
                    this.schedule();
                }
            }
        });
    });
}
exports.scheduleArray = scheduleArray;

},{"../Observable":100}],258:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.scheduleAsyncIterable = void 0;
var Observable_1 = require("../Observable");
var executeSchedule_1 = require("../util/executeSchedule");
function scheduleAsyncIterable(input, scheduler) {
    if (!input) {
        throw new Error('Iterable cannot be null');
    }
    return new Observable_1.Observable(function (subscriber) {
        executeSchedule_1.executeSchedule(subscriber, scheduler, function () {
            var iterator = input[Symbol.asyncIterator]();
            executeSchedule_1.executeSchedule(subscriber, scheduler, function () {
                iterator.next().then(function (result) {
                    if (result.done) {
                        subscriber.complete();
                    }
                    else {
                        subscriber.next(result.value);
                    }
                });
            }, 0, true);
        });
    });
}
exports.scheduleAsyncIterable = scheduleAsyncIterable;

},{"../Observable":100,"../util/executeSchedule":301}],259:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.scheduleIterable = void 0;
var Observable_1 = require("../Observable");
var iterator_1 = require("../symbol/iterator");
var isFunction_1 = require("../util/isFunction");
var executeSchedule_1 = require("../util/executeSchedule");
function scheduleIterable(input, scheduler) {
    return new Observable_1.Observable(function (subscriber) {
        var iterator;
        executeSchedule_1.executeSchedule(subscriber, scheduler, function () {
            iterator = input[iterator_1.iterator]();
            executeSchedule_1.executeSchedule(subscriber, scheduler, function () {
                var _a;
                var value;
                var done;
                try {
                    (_a = iterator.next(), value = _a.value, done = _a.done);
                }
                catch (err) {
                    subscriber.error(err);
                    return;
                }
                if (done) {
                    subscriber.complete();
                }
                else {
                    subscriber.next(value);
                }
            }, 0, true);
        });
        return function () { return isFunction_1.isFunction(iterator === null || iterator === void 0 ? void 0 : iterator.return) && iterator.return(); };
    });
}
exports.scheduleIterable = scheduleIterable;

},{"../Observable":100,"../symbol/iterator":284,"../util/executeSchedule":301,"../util/isFunction":306}],260:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.scheduleObservable = void 0;
var innerFrom_1 = require("../observable/innerFrom");
var observeOn_1 = require("../operators/observeOn");
var subscribeOn_1 = require("../operators/subscribeOn");
function scheduleObservable(input, scheduler) {
    return innerFrom_1.innerFrom(input).pipe(subscribeOn_1.subscribeOn(scheduler), observeOn_1.observeOn(scheduler));
}
exports.scheduleObservable = scheduleObservable;

},{"../observable/innerFrom":126,"../operators/observeOn":200,"../operators/subscribeOn":230}],261:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.schedulePromise = void 0;
var innerFrom_1 = require("../observable/innerFrom");
var observeOn_1 = require("../operators/observeOn");
var subscribeOn_1 = require("../operators/subscribeOn");
function schedulePromise(input, scheduler) {
    return innerFrom_1.innerFrom(input).pipe(subscribeOn_1.subscribeOn(scheduler), observeOn_1.observeOn(scheduler));
}
exports.schedulePromise = schedulePromise;

},{"../observable/innerFrom":126,"../operators/observeOn":200,"../operators/subscribeOn":230}],262:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.scheduleReadableStreamLike = void 0;
var scheduleAsyncIterable_1 = require("./scheduleAsyncIterable");
var isReadableStreamLike_1 = require("../util/isReadableStreamLike");
function scheduleReadableStreamLike(input, scheduler) {
    return scheduleAsyncIterable_1.scheduleAsyncIterable(isReadableStreamLike_1.readableStreamLikeToAsyncGenerator(input), scheduler);
}
exports.scheduleReadableStreamLike = scheduleReadableStreamLike;

},{"../util/isReadableStreamLike":311,"./scheduleAsyncIterable":258}],263:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.scheduled = void 0;
var scheduleObservable_1 = require("./scheduleObservable");
var schedulePromise_1 = require("./schedulePromise");
var scheduleArray_1 = require("./scheduleArray");
var scheduleIterable_1 = require("./scheduleIterable");
var scheduleAsyncIterable_1 = require("./scheduleAsyncIterable");
var isInteropObservable_1 = require("../util/isInteropObservable");
var isPromise_1 = require("../util/isPromise");
var isArrayLike_1 = require("../util/isArrayLike");
var isIterable_1 = require("../util/isIterable");
var isAsyncIterable_1 = require("../util/isAsyncIterable");
var throwUnobservableError_1 = require("../util/throwUnobservableError");
var isReadableStreamLike_1 = require("../util/isReadableStreamLike");
var scheduleReadableStreamLike_1 = require("./scheduleReadableStreamLike");
function scheduled(input, scheduler) {
    if (input != null) {
        if (isInteropObservable_1.isInteropObservable(input)) {
            return scheduleObservable_1.scheduleObservable(input, scheduler);
        }
        if (isArrayLike_1.isArrayLike(input)) {
            return scheduleArray_1.scheduleArray(input, scheduler);
        }
        if (isPromise_1.isPromise(input)) {
            return schedulePromise_1.schedulePromise(input, scheduler);
        }
        if (isAsyncIterable_1.isAsyncIterable(input)) {
            return scheduleAsyncIterable_1.scheduleAsyncIterable(input, scheduler);
        }
        if (isIterable_1.isIterable(input)) {
            return scheduleIterable_1.scheduleIterable(input, scheduler);
        }
        if (isReadableStreamLike_1.isReadableStreamLike(input)) {
            return scheduleReadableStreamLike_1.scheduleReadableStreamLike(input, scheduler);
        }
    }
    throw throwUnobservableError_1.createInvalidObservableTypeError(input);
}
exports.scheduled = scheduled;

},{"../util/isArrayLike":303,"../util/isAsyncIterable":304,"../util/isInteropObservable":307,"../util/isIterable":308,"../util/isPromise":310,"../util/isReadableStreamLike":311,"../util/throwUnobservableError":319,"./scheduleArray":257,"./scheduleAsyncIterable":258,"./scheduleIterable":259,"./scheduleObservable":260,"./schedulePromise":261,"./scheduleReadableStreamLike":262}],264:[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.Action = void 0;
var Subscription_1 = require("../Subscription");
var Action = (function (_super) {
    __extends(Action, _super);
    function Action(scheduler, work) {
        return _super.call(this) || this;
    }
    Action.prototype.schedule = function (state, delay) {
        if (delay === void 0) { delay = 0; }
        return this;
    };
    return Action;
}(Subscription_1.Subscription));
exports.Action = Action;

},{"../Subscription":105}],265:[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.AnimationFrameAction = void 0;
var AsyncAction_1 = require("./AsyncAction");
var animationFrameProvider_1 = require("./animationFrameProvider");
var AnimationFrameAction = (function (_super) {
    __extends(AnimationFrameAction, _super);
    function AnimationFrameAction(scheduler, work) {
        var _this = _super.call(this, scheduler, work) || this;
        _this.scheduler = scheduler;
        _this.work = work;
        return _this;
    }
    AnimationFrameAction.prototype.requestAsyncId = function (scheduler, id, delay) {
        if (delay === void 0) { delay = 0; }
        if (delay !== null && delay > 0) {
            return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);
        }
        scheduler.actions.push(this);
        return scheduler._scheduled || (scheduler._scheduled = animationFrameProvider_1.animationFrameProvider.requestAnimationFrame(function () { return scheduler.flush(undefined); }));
    };
    AnimationFrameAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
        var _a;
        if (delay === void 0) { delay = 0; }
        if (delay != null ? delay > 0 : this.delay > 0) {
            return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay);
        }
        var actions = scheduler.actions;
        if (id != null && id === scheduler._scheduled && ((_a = actions[actions.length - 1]) === null || _a === void 0 ? void 0 : _a.id) !== id) {
            animationFrameProvider_1.animationFrameProvider.cancelAnimationFrame(id);
            scheduler._scheduled = undefined;
        }
        return undefined;
    };
    return AnimationFrameAction;
}(AsyncAction_1.AsyncAction));
exports.AnimationFrameAction = AnimationFrameAction;

},{"./AsyncAction":269,"./animationFrameProvider":275}],266:[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.AnimationFrameScheduler = void 0;
var AsyncScheduler_1 = require("./AsyncScheduler");
var AnimationFrameScheduler = (function (_super) {
    __extends(AnimationFrameScheduler, _super);
    function AnimationFrameScheduler() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    AnimationFrameScheduler.prototype.flush = function (action) {
        this._active = true;
        var flushId;
        if (action) {
            flushId = action.id;
        }
        else {
            flushId = this._scheduled;
            this._scheduled = undefined;
        }
        var actions = this.actions;
        var error;
        action = action || actions.shift();
        do {
            if ((error = action.execute(action.state, action.delay))) {
                break;
            }
        } while ((action = actions[0]) && action.id === flushId && actions.shift());
        this._active = false;
        if (error) {
            while ((action = actions[0]) && action.id === flushId && actions.shift()) {
                action.unsubscribe();
            }
            throw error;
        }
    };
    return AnimationFrameScheduler;
}(AsyncScheduler_1.AsyncScheduler));
exports.AnimationFrameScheduler = AnimationFrameScheduler;

},{"./AsyncScheduler":270}],267:[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.AsapAction = void 0;
var AsyncAction_1 = require("./AsyncAction");
var immediateProvider_1 = require("./immediateProvider");
var AsapAction = (function (_super) {
    __extends(AsapAction, _super);
    function AsapAction(scheduler, work) {
        var _this = _super.call(this, scheduler, work) || this;
        _this.scheduler = scheduler;
        _this.work = work;
        return _this;
    }
    AsapAction.prototype.requestAsyncId = function (scheduler, id, delay) {
        if (delay === void 0) { delay = 0; }
        if (delay !== null && delay > 0) {
            return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);
        }
        scheduler.actions.push(this);
        return scheduler._scheduled || (scheduler._scheduled = immediateProvider_1.immediateProvider.setImmediate(scheduler.flush.bind(scheduler, undefined)));
    };
    AsapAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
        var _a;
        if (delay === void 0) { delay = 0; }
        if (delay != null ? delay > 0 : this.delay > 0) {
            return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay);
        }
        var actions = scheduler.actions;
        if (id != null && ((_a = actions[actions.length - 1]) === null || _a === void 0 ? void 0 : _a.id) !== id) {
            immediateProvider_1.immediateProvider.clearImmediate(id);
            if (scheduler._scheduled === id) {
                scheduler._scheduled = undefined;
            }
        }
        return undefined;
    };
    return AsapAction;
}(AsyncAction_1.AsyncAction));
exports.AsapAction = AsapAction;

},{"./AsyncAction":269,"./immediateProvider":279}],268:[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.AsapScheduler = void 0;
var AsyncScheduler_1 = require("./AsyncScheduler");
var AsapScheduler = (function (_super) {
    __extends(AsapScheduler, _super);
    function AsapScheduler() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    AsapScheduler.prototype.flush = function (action) {
        this._active = true;
        var flushId = this._scheduled;
        this._scheduled = undefined;
        var actions = this.actions;
        var error;
        action = action || actions.shift();
        do {
            if ((error = action.execute(action.state, action.delay))) {
                break;
            }
        } while ((action = actions[0]) && action.id === flushId && actions.shift());
        this._active = false;
        if (error) {
            while ((action = actions[0]) && action.id === flushId && actions.shift()) {
                action.unsubscribe();
            }
            throw error;
        }
    };
    return AsapScheduler;
}(AsyncScheduler_1.AsyncScheduler));
exports.AsapScheduler = AsapScheduler;

},{"./AsyncScheduler":270}],269:[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.AsyncAction = void 0;
var Action_1 = require("./Action");
var intervalProvider_1 = require("./intervalProvider");
var arrRemove_1 = require("../util/arrRemove");
var AsyncAction = (function (_super) {
    __extends(AsyncAction, _super);
    function AsyncAction(scheduler, work) {
        var _this = _super.call(this, scheduler, work) || this;
        _this.scheduler = scheduler;
        _this.work = work;
        _this.pending = false;
        return _this;
    }
    AsyncAction.prototype.schedule = function (state, delay) {
        var _a;
        if (delay === void 0) { delay = 0; }
        if (this.closed) {
            return this;
        }
        this.state = state;
        var id = this.id;
        var scheduler = this.scheduler;
        if (id != null) {
            this.id = this.recycleAsyncId(scheduler, id, delay);
        }
        this.pending = true;
        this.delay = delay;
        this.id = (_a = this.id) !== null && _a !== void 0 ? _a : this.requestAsyncId(scheduler, this.id, delay);
        return this;
    };
    AsyncAction.prototype.requestAsyncId = function (scheduler, _id, delay) {
        if (delay === void 0) { delay = 0; }
        return intervalProvider_1.intervalProvider.setInterval(scheduler.flush.bind(scheduler, this), delay);
    };
    AsyncAction.prototype.recycleAsyncId = function (_scheduler, id, delay) {
        if (delay === void 0) { delay = 0; }
        if (delay != null && this.delay === delay && this.pending === false) {
            return id;
        }
        if (id != null) {
            intervalProvider_1.intervalProvider.clearInterval(id);
        }
        return undefined;
    };
    AsyncAction.prototype.execute = function (state, delay) {
        if (this.closed) {
            return new Error('executing a cancelled action');
        }
        this.pending = false;
        var error = this._execute(state, delay);
        if (error) {
            return error;
        }
        else if (this.pending === false && this.id != null) {
            this.id = this.recycleAsyncId(this.scheduler, this.id, null);
        }
    };
    AsyncAction.prototype._execute = function (state, _delay) {
        var errored = false;
        var errorValue;
        try {
            this.work(state);
        }
        catch (e) {
            errored = true;
            errorValue = e ? e : new Error('Scheduled action threw falsy error');
        }
        if (errored) {
            this.unsubscribe();
            return errorValue;
        }
    };
    AsyncAction.prototype.unsubscribe = function () {
        if (!this.closed) {
            var _a = this, id = _a.id, scheduler = _a.scheduler;
            var actions = scheduler.actions;
            this.work = this.state = this.scheduler = null;
            this.pending = false;
            arrRemove_1.arrRemove(actions, this);
            if (id != null) {
                this.id = this.recycleAsyncId(scheduler, id, null);
            }
            this.delay = null;
            _super.prototype.unsubscribe.call(this);
        }
    };
    return AsyncAction;
}(Action_1.Action));
exports.AsyncAction = AsyncAction;

},{"../util/arrRemove":297,"./Action":264,"./intervalProvider":280}],270:[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.AsyncScheduler = void 0;
var Scheduler_1 = require("../Scheduler");
var AsyncScheduler = (function (_super) {
    __extends(AsyncScheduler, _super);
    function AsyncScheduler(SchedulerAction, now) {
        if (now === void 0) { now = Scheduler_1.Scheduler.now; }
        var _this = _super.call(this, SchedulerAction, now) || this;
        _this.actions = [];
        _this._active = false;
        return _this;
    }
    AsyncScheduler.prototype.flush = function (action) {
        var actions = this.actions;
        if (this._active) {
            actions.push(action);
            return;
        }
        var error;
        this._active = true;
        do {
            if ((error = action.execute(action.state, action.delay))) {
                break;
            }
        } while ((action = actions.shift()));
        this._active = false;
        if (error) {
            while ((action = actions.shift())) {
                action.unsubscribe();
            }
            throw error;
        }
    };
    return AsyncScheduler;
}(Scheduler_1.Scheduler));
exports.AsyncScheduler = AsyncScheduler;

},{"../Scheduler":102}],271:[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.QueueAction = void 0;
var AsyncAction_1 = require("./AsyncAction");
var QueueAction = (function (_super) {
    __extends(QueueAction, _super);
    function QueueAction(scheduler, work) {
        var _this = _super.call(this, scheduler, work) || this;
        _this.scheduler = scheduler;
        _this.work = work;
        return _this;
    }
    QueueAction.prototype.schedule = function (state, delay) {
        if (delay === void 0) { delay = 0; }
        if (delay > 0) {
            return _super.prototype.schedule.call(this, state, delay);
        }
        this.delay = delay;
        this.state = state;
        this.scheduler.flush(this);
        return this;
    };
    QueueAction.prototype.execute = function (state, delay) {
        return delay > 0 || this.closed ? _super.prototype.execute.call(this, state, delay) : this._execute(state, delay);
    };
    QueueAction.prototype.requestAsyncId = function (scheduler, id, delay) {
        if (delay === void 0) { delay = 0; }
        if ((delay != null && delay > 0) || (delay == null && this.delay > 0)) {
            return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);
        }
        scheduler.flush(this);
        return 0;
    };
    return QueueAction;
}(AsyncAction_1.AsyncAction));
exports.QueueAction = QueueAction;

},{"./AsyncAction":269}],272:[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.QueueScheduler = void 0;
var AsyncScheduler_1 = require("./AsyncScheduler");
var QueueScheduler = (function (_super) {
    __extends(QueueScheduler, _super);
    function QueueScheduler() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    return QueueScheduler;
}(AsyncScheduler_1.AsyncScheduler));
exports.QueueScheduler = QueueScheduler;

},{"./AsyncScheduler":270}],273:[function(require,module,exports){
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.VirtualAction = exports.VirtualTimeScheduler = void 0;
var AsyncAction_1 = require("./AsyncAction");
var Subscription_1 = require("../Subscription");
var AsyncScheduler_1 = require("./AsyncScheduler");
var VirtualTimeScheduler = (function (_super) {
    __extends(VirtualTimeScheduler, _super);
    function VirtualTimeScheduler(schedulerActionCtor, maxFrames) {
        if (schedulerActionCtor === void 0) { schedulerActionCtor = VirtualAction; }
        if (maxFrames === void 0) { maxFrames = Infinity; }
        var _this = _super.call(this, schedulerActionCtor, function () { return _this.frame; }) || this;
        _this.maxFrames = maxFrames;
        _this.frame = 0;
        _this.index = -1;
        return _this;
    }
    VirtualTimeScheduler.prototype.flush = function () {
        var _a = this, actions = _a.actions, maxFrames = _a.maxFrames;
        var error;
        var action;
        while ((action = actions[0]) && action.delay <= maxFrames) {
            actions.shift();
            this.frame = action.delay;
            if ((error = action.execute(action.state, action.delay))) {
                break;
            }
        }
        if (error) {
            while ((action = actions.shift())) {
                action.unsubscribe();
            }
            throw error;
        }
    };
    VirtualTimeScheduler.frameTimeFactor = 10;
    return VirtualTimeScheduler;
}(AsyncScheduler_1.AsyncScheduler));
exports.VirtualTimeScheduler = VirtualTimeScheduler;
var VirtualAction = (function (_super) {
    __extends(VirtualAction, _super);
    function VirtualAction(scheduler, work, index) {
        if (index === void 0) { index = (scheduler.index += 1); }
        var _this = _super.call(this, scheduler, work) || this;
        _this.scheduler = scheduler;
        _this.work = work;
        _this.index = index;
        _this.active = true;
        _this.index = scheduler.index = index;
        return _this;
    }
    VirtualAction.prototype.schedule = function (state, delay) {
        if (delay === void 0) { delay = 0; }
        if (Number.isFinite(delay)) {
            if (!this.id) {
                return _super.prototype.schedule.call(this, state, delay);
            }
            this.active = false;
            var action = new VirtualAction(this.scheduler, this.work);
            this.add(action);
            return action.schedule(state, delay);
        }
        else {
            return Subscription_1.Subscription.EMPTY;
        }
    };
    VirtualAction.prototype.requestAsyncId = function (scheduler, id, delay) {
        if (delay === void 0) { delay = 0; }
        this.delay = scheduler.frame + delay;
        var actions = scheduler.actions;
        actions.push(this);
        actions.sort(VirtualAction.sortActions);
        return 1;
    };
    VirtualAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
        if (delay === void 0) { delay = 0; }
        return undefined;
    };
    VirtualAction.prototype._execute = function (state, delay) {
        if (this.active === true) {
            return _super.prototype._execute.call(this, state, delay);
        }
    };
    VirtualAction.sortActions = function (a, b) {
        if (a.delay === b.delay) {
            if (a.index === b.index) {
                return 0;
            }
            else if (a.index > b.index) {
                return 1;
            }
            else {
                return -1;
            }
        }
        else if (a.delay > b.delay) {
            return 1;
        }
        else {
            return -1;
        }
    };
    return VirtualAction;
}(AsyncAction_1.AsyncAction));
exports.VirtualAction = VirtualAction;

},{"../Subscription":105,"./AsyncAction":269,"./AsyncScheduler":270}],274:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.animationFrame = exports.animationFrameScheduler = void 0;
var AnimationFrameAction_1 = require("./AnimationFrameAction");
var AnimationFrameScheduler_1 = require("./AnimationFrameScheduler");
exports.animationFrameScheduler = new AnimationFrameScheduler_1.AnimationFrameScheduler(AnimationFrameAction_1.AnimationFrameAction);
exports.animationFrame = exports.animationFrameScheduler;

},{"./AnimationFrameAction":265,"./AnimationFrameScheduler":266}],275:[function(require,module,exports){
"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.animationFrameProvider = void 0;
var Subscription_1 = require("../Subscription");
exports.animationFrameProvider = {
    schedule: function (callback) {
        var request = requestAnimationFrame;
        var cancel = cancelAnimationFrame;
        var delegate = exports.animationFrameProvider.delegate;
        if (delegate) {
            request = delegate.requestAnimationFrame;
            cancel = delegate.cancelAnimationFrame;
        }
        var handle = request(function (timestamp) {
            cancel = undefined;
            callback(timestamp);
        });
        return new Subscription_1.Subscription(function () { return cancel === null || cancel === void 0 ? void 0 : cancel(handle); });
    },
    requestAnimationFrame: function () {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
        }
        var delegate = exports.animationFrameProvider.delegate;
        return ((delegate === null || delegate === void 0 ? void 0 : delegate.requestAnimationFrame) || requestAnimationFrame).apply(void 0, __spreadArray([], __read(args)));
    },
    cancelAnimationFrame: function () {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
        }
        var delegate = exports.animationFrameProvider.delegate;
        return ((delegate === null || delegate === void 0 ? void 0 : delegate.cancelAnimationFrame) || cancelAnimationFrame).apply(void 0, __spreadArray([], __read(args)));
    },
    delegate: undefined,
};

},{"../Subscription":105}],276:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.asap = exports.asapScheduler = void 0;
var AsapAction_1 = require("./AsapAction");
var AsapScheduler_1 = require("./AsapScheduler");
exports.asapScheduler = new AsapScheduler_1.AsapScheduler(AsapAction_1.AsapAction);
exports.asap = exports.asapScheduler;

},{"./AsapAction":267,"./AsapScheduler":268}],277:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.async = exports.asyncScheduler = void 0;
var AsyncAction_1 = require("./AsyncAction");
var AsyncScheduler_1 = require("./AsyncScheduler");
exports.asyncScheduler = new AsyncScheduler_1.AsyncScheduler(AsyncAction_1.AsyncAction);
exports.async = exports.asyncScheduler;

},{"./AsyncAction":269,"./AsyncScheduler":270}],278:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.dateTimestampProvider = void 0;
exports.dateTimestampProvider = {
    now: function () {
        return (exports.dateTimestampProvider.delegate || Date).now();
    },
    delegate: undefined,
};

},{}],279:[function(require,module,exports){
"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.immediateProvider = void 0;
var Immediate_1 = require("../util/Immediate");
var setImmediate = Immediate_1.Immediate.setImmediate, clearImmediate = Immediate_1.Immediate.clearImmediate;
exports.immediateProvider = {
    setImmediate: function () {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
        }
        var delegate = exports.immediateProvider.delegate;
        return ((delegate === null || delegate === void 0 ? void 0 : delegate.setImmediate) || setImmediate).apply(void 0, __spreadArray([], __read(args)));
    },
    clearImmediate: function (handle) {
        var delegate = exports.immediateProvider.delegate;
        return ((delegate === null || delegate === void 0 ? void 0 : delegate.clearImmediate) || clearImmediate)(handle);
    },
    delegate: undefined,
};

},{"../util/Immediate":289}],280:[function(require,module,exports){
"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.intervalProvider = void 0;
exports.intervalProvider = {
    setInterval: function (handler, timeout) {
        var args = [];
        for (var _i = 2; _i < arguments.length; _i++) {
            args[_i - 2] = arguments[_i];
        }
        var delegate = exports.intervalProvider.delegate;
        if (delegate === null || delegate === void 0 ? void 0 : delegate.setInterval) {
            return delegate.setInterval.apply(delegate, __spreadArray([handler, timeout], __read(args)));
        }
        return setInterval.apply(void 0, __spreadArray([handler, timeout], __read(args)));
    },
    clearInterval: function (handle) {
        var delegate = exports.intervalProvider.delegate;
        return ((delegate === null || delegate === void 0 ? void 0 : delegate.clearInterval) || clearInterval)(handle);
    },
    delegate: undefined,
};

},{}],281:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.performanceTimestampProvider = void 0;
exports.performanceTimestampProvider = {
    now: function () {
        return (exports.performanceTimestampProvider.delegate || performance).now();
    },
    delegate: undefined,
};

},{}],282:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.queue = exports.queueScheduler = void 0;
var QueueAction_1 = require("./QueueAction");
var QueueScheduler_1 = require("./QueueScheduler");
exports.queueScheduler = new QueueScheduler_1.QueueScheduler(QueueAction_1.QueueAction);
exports.queue = exports.queueScheduler;

},{"./QueueAction":271,"./QueueScheduler":272}],283:[function(require,module,exports){
"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.timeoutProvider = void 0;
exports.timeoutProvider = {
    setTimeout: function (handler, timeout) {
        var args = [];
        for (var _i = 2; _i < arguments.length; _i++) {
            args[_i - 2] = arguments[_i];
        }
        var delegate = exports.timeoutProvider.delegate;
        if (delegate === null || delegate === void 0 ? void 0 : delegate.setTimeout) {
            return delegate.setTimeout.apply(delegate, __spreadArray([handler, timeout], __read(args)));
        }
        return setTimeout.apply(void 0, __spreadArray([handler, timeout], __read(args)));
    },
    clearTimeout: function (handle) {
        var delegate = exports.timeoutProvider.delegate;
        return ((delegate === null || delegate === void 0 ? void 0 : delegate.clearTimeout) || clearTimeout)(handle);
    },
    delegate: undefined,
};

},{}],284:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.iterator = exports.getSymbolIterator = void 0;
function getSymbolIterator() {
    if (typeof Symbol !== 'function' || !Symbol.iterator) {
        return '@@iterator';
    }
    return Symbol.iterator;
}
exports.getSymbolIterator = getSymbolIterator;
exports.iterator = getSymbolIterator();

},{}],285:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.observable = void 0;
exports.observable = (function () { return (typeof Symbol === 'function' && Symbol.observable) || '@@observable'; })();

},{}],286:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });

},{}],287:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ArgumentOutOfRangeError = void 0;
var createErrorClass_1 = require("./createErrorClass");
exports.ArgumentOutOfRangeError = createErrorClass_1.createErrorClass(function (_super) {
    return function ArgumentOutOfRangeErrorImpl() {
        _super(this);
        this.name = 'ArgumentOutOfRangeError';
        this.message = 'argument out of range';
    };
});

},{"./createErrorClass":298}],288:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.EmptyError = void 0;
var createErrorClass_1 = require("./createErrorClass");
exports.EmptyError = createErrorClass_1.createErrorClass(function (_super) {
    return function EmptyErrorImpl() {
        _super(this);
        this.name = 'EmptyError';
        this.message = 'no elements in sequence';
    };
});

},{"./createErrorClass":298}],289:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.TestTools = exports.Immediate = void 0;
var nextHandle = 1;
var resolved;
var activeHandles = {};
function findAndClearHandle(handle) {
    if (handle in activeHandles) {
        delete activeHandles[handle];
        return true;
    }
    return false;
}
exports.Immediate = {
    setImmediate: function (cb) {
        var handle = nextHandle++;
        activeHandles[handle] = true;
        if (!resolved) {
            resolved = Promise.resolve();
        }
        resolved.then(function () { return findAndClearHandle(handle) && cb(); });
        return handle;
    },
    clearImmediate: function (handle) {
        findAndClearHandle(handle);
    },
};
exports.TestTools = {
    pending: function () {
        return Object.keys(activeHandles).length;
    }
};

},{}],290:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.NotFoundError = void 0;
var createErrorClass_1 = require("./createErrorClass");
exports.NotFoundError = createErrorClass_1.createErrorClass(function (_super) {
    return function NotFoundErrorImpl(message) {
        _super(this);
        this.name = 'NotFoundError';
        this.message = message;
    };
});

},{"./createErrorClass":298}],291:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ObjectUnsubscribedError = void 0;
var createErrorClass_1 = require("./createErrorClass");
exports.ObjectUnsubscribedError = createErrorClass_1.createErrorClass(function (_super) {
    return function ObjectUnsubscribedErrorImpl() {
        _super(this);
        this.name = 'ObjectUnsubscribedError';
        this.message = 'object unsubscribed';
    };
});

},{"./createErrorClass":298}],292:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.SequenceError = void 0;
var createErrorClass_1 = require("./createErrorClass");
exports.SequenceError = createErrorClass_1.createErrorClass(function (_super) {
    return function SequenceErrorImpl(message) {
        _super(this);
        this.name = 'SequenceError';
        this.message = message;
    };
});

},{"./createErrorClass":298}],293:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.UnsubscriptionError = void 0;
var createErrorClass_1 = require("./createErrorClass");
exports.UnsubscriptionError = createErrorClass_1.createErrorClass(function (_super) {
    return function UnsubscriptionErrorImpl(errors) {
        _super(this);
        this.message = errors
            ? errors.length + " errors occurred during unsubscription:\n" + errors.map(function (err, i) { return i + 1 + ") " + err.toString(); }).join('\n  ')
            : '';
        this.name = 'UnsubscriptionError';
        this.errors = errors;
    };
});

},{"./createErrorClass":298}],294:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.popNumber = exports.popScheduler = exports.popResultSelector = void 0;
var isFunction_1 = require("./isFunction");
var isScheduler_1 = require("./isScheduler");
function last(arr) {
    return arr[arr.length - 1];
}
function popResultSelector(args) {
    return isFunction_1.isFunction(last(args)) ? args.pop() : undefined;
}
exports.popResultSelector = popResultSelector;
function popScheduler(args) {
    return isScheduler_1.isScheduler(last(args)) ? args.pop() : undefined;
}
exports.popScheduler = popScheduler;
function popNumber(args, defaultValue) {
    return typeof last(args) === 'number' ? args.pop() : defaultValue;
}
exports.popNumber = popNumber;

},{"./isFunction":306,"./isScheduler":312}],295:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.argsArgArrayOrObject = void 0;
var isArray = Array.isArray;
var getPrototypeOf = Object.getPrototypeOf, objectProto = Object.prototype, getKeys = Object.keys;
function argsArgArrayOrObject(args) {
    if (args.length === 1) {
        var first_1 = args[0];
        if (isArray(first_1)) {
            return { args: first_1, keys: null };
        }
        if (isPOJO(first_1)) {
            var keys = getKeys(first_1);
            return {
                args: keys.map(function (key) { return first_1[key]; }),
                keys: keys,
            };
        }
    }
    return { args: args, keys: null };
}
exports.argsArgArrayOrObject = argsArgArrayOrObject;
function isPOJO(obj) {
    return obj && typeof obj === 'object' && getPrototypeOf(obj) === objectProto;
}

},{}],296:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.argsOrArgArray = void 0;
var isArray = Array.isArray;
function argsOrArgArray(args) {
    return args.length === 1 && isArray(args[0]) ? args[0] : args;
}
exports.argsOrArgArray = argsOrArgArray;

},{}],297:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.arrRemove = void 0;
function arrRemove(arr, item) {
    if (arr) {
        var index = arr.indexOf(item);
        0 <= index && arr.splice(index, 1);
    }
}
exports.arrRemove = arrRemove;

},{}],298:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.createErrorClass = void 0;
function createErrorClass(createImpl) {
    var _super = function (instance) {
        Error.call(instance);
        instance.stack = new Error().stack;
    };
    var ctorFunc = createImpl(_super);
    ctorFunc.prototype = Object.create(Error.prototype);
    ctorFunc.prototype.constructor = ctorFunc;
    return ctorFunc;
}
exports.createErrorClass = createErrorClass;

},{}],299:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.createObject = void 0;
function createObject(keys, values) {
    return keys.reduce(function (result, key, i) { return ((result[key] = values[i]), result); }, {});
}
exports.createObject = createObject;

},{}],300:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.captureError = exports.errorContext = void 0;
var config_1 = require("../config");
var context = null;
function errorContext(cb) {
    if (config_1.config.useDeprecatedSynchronousErrorHandling) {
        var isRoot = !context;
        if (isRoot) {
            context = { errorThrown: false, error: null };
        }
        cb();
        if (isRoot) {
            var _a = context, errorThrown = _a.errorThrown, error = _a.error;
            context = null;
            if (errorThrown) {
                throw error;
            }
        }
    }
    else {
        cb();
    }
}
exports.errorContext = errorContext;
function captureError(err) {
    if (config_1.config.useDeprecatedSynchronousErrorHandling && context) {
        context.errorThrown = true;
        context.error = err;
    }
}
exports.captureError = captureError;

},{"../config":106}],301:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.executeSchedule = void 0;
function executeSchedule(parentSubscription, scheduler, work, delay, repeat) {
    if (delay === void 0) { delay = 0; }
    if (repeat === void 0) { repeat = false; }
    var scheduleSubscription = scheduler.schedule(function () {
        work();
        if (repeat) {
            parentSubscription.add(this.schedule(null, delay));
        }
        else {
            this.unsubscribe();
        }
    }, delay);
    parentSubscription.add(scheduleSubscription);
    if (!repeat) {
        return scheduleSubscription;
    }
}
exports.executeSchedule = executeSchedule;

},{}],302:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.identity = void 0;
function identity(x) {
    return x;
}
exports.identity = identity;

},{}],303:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.isArrayLike = void 0;
exports.isArrayLike = (function (x) { return x && typeof x.length === 'number' && typeof x !== 'function'; });

},{}],304:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.isAsyncIterable = void 0;
var isFunction_1 = require("./isFunction");
function isAsyncIterable(obj) {
    return Symbol.asyncIterator && isFunction_1.isFunction(obj === null || obj === void 0 ? void 0 : obj[Symbol.asyncIterator]);
}
exports.isAsyncIterable = isAsyncIterable;

},{"./isFunction":306}],305:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.isValidDate = void 0;
function isValidDate(value) {
    return value instanceof Date && !isNaN(value);
}
exports.isValidDate = isValidDate;

},{}],306:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.isFunction = void 0;
function isFunction(value) {
    return typeof value === 'function';
}
exports.isFunction = isFunction;

},{}],307:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.isInteropObservable = void 0;
var observable_1 = require("../symbol/observable");
var isFunction_1 = require("./isFunction");
function isInteropObservable(input) {
    return isFunction_1.isFunction(input[observable_1.observable]);
}
exports.isInteropObservable = isInteropObservable;

},{"../symbol/observable":285,"./isFunction":306}],308:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.isIterable = void 0;
var iterator_1 = require("../symbol/iterator");
var isFunction_1 = require("./isFunction");
function isIterable(input) {
    return isFunction_1.isFunction(input === null || input === void 0 ? void 0 : input[iterator_1.iterator]);
}
exports.isIterable = isIterable;

},{"../symbol/iterator":284,"./isFunction":306}],309:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.isObservable = void 0;
var Observable_1 = require("../Observable");
var isFunction_1 = require("./isFunction");
function isObservable(obj) {
    return !!obj && (obj instanceof Observable_1.Observable || (isFunction_1.isFunction(obj.lift) && isFunction_1.isFunction(obj.subscribe)));
}
exports.isObservable = isObservable;

},{"../Observable":100,"./isFunction":306}],310:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.isPromise = void 0;
var isFunction_1 = require("./isFunction");
function isPromise(value) {
    return isFunction_1.isFunction(value === null || value === void 0 ? void 0 : value.then);
}
exports.isPromise = isPromise;

},{"./isFunction":306}],311:[function(require,module,exports){
"use strict";
var __generator = (this && this.__generator) || function (thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
};
var __await = (this && this.__await) || function (v) { return this instanceof __await ? (this.v = v, this) : new __await(v); }
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
    if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
    var g = generator.apply(thisArg, _arguments || []), i, q = [];
    return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
    function fulfill(value) { resume("next", value); }
    function reject(value) { resume("throw", value); }
    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.isReadableStreamLike = exports.readableStreamLikeToAsyncGenerator = void 0;
var isFunction_1 = require("./isFunction");
function readableStreamLikeToAsyncGenerator(readableStream) {
    return __asyncGenerator(this, arguments, function readableStreamLikeToAsyncGenerator_1() {
        var reader, _a, value, done;
        return __generator(this, function (_b) {
            switch (_b.label) {
                case 0:
                    reader = readableStream.getReader();
                    _b.label = 1;
                case 1:
                    _b.trys.push([1, , 9, 10]);
                    _b.label = 2;
                case 2:
                    if (!true) return [3, 8];
                    return [4, __await(reader.read())];
                case 3:
                    _a = _b.sent(), value = _a.value, done = _a.done;
                    if (!done) return [3, 5];
                    return [4, __await(void 0)];
                case 4: return [2, _b.sent()];
                case 5: return [4, __await(value)];
                case 6: return [4, _b.sent()];
                case 7:
                    _b.sent();
                    return [3, 2];
                case 8: return [3, 10];
                case 9:
                    reader.releaseLock();
                    return [7];
                case 10: return [2];
            }
        });
    });
}
exports.readableStreamLikeToAsyncGenerator = readableStreamLikeToAsyncGenerator;
function isReadableStreamLike(obj) {
    return isFunction_1.isFunction(obj === null || obj === void 0 ? void 0 : obj.getReader);
}
exports.isReadableStreamLike = isReadableStreamLike;

},{"./isFunction":306}],312:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.isScheduler = void 0;
var isFunction_1 = require("./isFunction");
function isScheduler(value) {
    return value && isFunction_1.isFunction(value.schedule);
}
exports.isScheduler = isScheduler;

},{"./isFunction":306}],313:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.operate = exports.hasLift = void 0;
var isFunction_1 = require("./isFunction");
function hasLift(source) {
    return isFunction_1.isFunction(source === null || source === void 0 ? void 0 : source.lift);
}
exports.hasLift = hasLift;
function operate(init) {
    return function (source) {
        if (hasLift(source)) {
            return source.lift(function (liftedSource) {
                try {
                    return init(liftedSource, this);
                }
                catch (err) {
                    this.error(err);
                }
            });
        }
        throw new TypeError('Unable to lift unknown Observable type');
    };
}
exports.operate = operate;

},{"./isFunction":306}],314:[function(require,module,exports){
"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.mapOneOrManyArgs = void 0;
var map_1 = require("../operators/map");
var isArray = Array.isArray;
function callOrApply(fn, args) {
    return isArray(args) ? fn.apply(void 0, __spreadArray([], __read(args))) : fn(args);
}
function mapOneOrManyArgs(fn) {
    return map_1.map(function (args) { return callOrApply(fn, args); });
}
exports.mapOneOrManyArgs = mapOneOrManyArgs;

},{"../operators/map":187}],315:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.noop = void 0;
function noop() { }
exports.noop = noop;

},{}],316:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.not = void 0;
function not(pred, thisArg) {
    return function (value, index) { return !pred.call(thisArg, value, index); };
}
exports.not = not;

},{}],317:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.pipeFromArray = exports.pipe = void 0;
var identity_1 = require("./identity");
function pipe() {
    var fns = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        fns[_i] = arguments[_i];
    }
    return pipeFromArray(fns);
}
exports.pipe = pipe;
function pipeFromArray(fns) {
    if (fns.length === 0) {
        return identity_1.identity;
    }
    if (fns.length === 1) {
        return fns[0];
    }
    return function piped(input) {
        return fns.reduce(function (prev, fn) { return fn(prev); }, input);
    };
}
exports.pipeFromArray = pipeFromArray;

},{"./identity":302}],318:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.reportUnhandledError = void 0;
var config_1 = require("../config");
var timeoutProvider_1 = require("../scheduler/timeoutProvider");
function reportUnhandledError(err) {
    timeoutProvider_1.timeoutProvider.setTimeout(function () {
        var onUnhandledError = config_1.config.onUnhandledError;
        if (onUnhandledError) {
            onUnhandledError(err);
        }
        else {
            throw err;
        }
    });
}
exports.reportUnhandledError = reportUnhandledError;

},{"../config":106,"../scheduler/timeoutProvider":283}],319:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.createInvalidObservableTypeError = void 0;
function createInvalidObservableTypeError(input) {
    return new TypeError("You provided " + (input !== null && typeof input === 'object' ? 'an invalid object' : "'" + input + "'") + " where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.");
}
exports.createInvalidObservableTypeError = createInvalidObservableTypeError;

},{}],320:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.mergeAll = exports.merge = exports.max = exports.materialize = exports.mapTo = exports.map = exports.last = exports.isEmpty = exports.ignoreElements = exports.groupBy = exports.first = exports.findIndex = exports.find = exports.finalize = exports.filter = exports.expand = exports.exhaustMap = exports.exhaustAll = exports.exhaust = exports.every = exports.endWith = exports.elementAt = exports.distinctUntilKeyChanged = exports.distinctUntilChanged = exports.distinct = exports.dematerialize = exports.delayWhen = exports.delay = exports.defaultIfEmpty = exports.debounceTime = exports.debounce = exports.count = exports.connect = exports.concatWith = exports.concatMapTo = exports.concatMap = exports.concatAll = exports.concat = exports.combineLatestWith = exports.combineLatest = exports.combineLatestAll = exports.combineAll = exports.catchError = exports.bufferWhen = exports.bufferToggle = exports.bufferTime = exports.bufferCount = exports.buffer = exports.auditTime = exports.audit = void 0;
exports.timeInterval = exports.throwIfEmpty = exports.throttleTime = exports.throttle = exports.tap = exports.takeWhile = exports.takeUntil = exports.takeLast = exports.take = exports.switchScan = exports.switchMapTo = exports.switchMap = exports.switchAll = exports.subscribeOn = exports.startWith = exports.skipWhile = exports.skipUntil = exports.skipLast = exports.skip = exports.single = exports.shareReplay = exports.share = exports.sequenceEqual = exports.scan = exports.sampleTime = exports.sample = exports.refCount = exports.retryWhen = exports.retry = exports.repeatWhen = exports.repeat = exports.reduce = exports.raceWith = exports.race = exports.publishReplay = exports.publishLast = exports.publishBehavior = exports.publish = exports.pluck = exports.partition = exports.pairwise = exports.onErrorResumeNext = exports.observeOn = exports.multicast = exports.min = exports.mergeWith = exports.mergeScan = exports.mergeMapTo = exports.mergeMap = exports.flatMap = void 0;
exports.zipWith = exports.zipAll = exports.zip = exports.withLatestFrom = exports.windowWhen = exports.windowToggle = exports.windowTime = exports.windowCount = exports.window = exports.toArray = exports.timestamp = exports.timeoutWith = exports.timeout = void 0;
var audit_1 = require("../internal/operators/audit");
Object.defineProperty(exports, "audit", { enumerable: true, get: function () { return audit_1.audit; } });
var auditTime_1 = require("../internal/operators/auditTime");
Object.defineProperty(exports, "auditTime", { enumerable: true, get: function () { return auditTime_1.auditTime; } });
var buffer_1 = require("../internal/operators/buffer");
Object.defineProperty(exports, "buffer", { enumerable: true, get: function () { return buffer_1.buffer; } });
var bufferCount_1 = require("../internal/operators/bufferCount");
Object.defineProperty(exports, "bufferCount", { enumerable: true, get: function () { return bufferCount_1.bufferCount; } });
var bufferTime_1 = require("../internal/operators/bufferTime");
Object.defineProperty(exports, "bufferTime", { enumerable: true, get: function () { return bufferTime_1.bufferTime; } });
var bufferToggle_1 = require("../internal/operators/bufferToggle");
Object.defineProperty(exports, "bufferToggle", { enumerable: true, get: function () { return bufferToggle_1.bufferToggle; } });
var bufferWhen_1 = require("../internal/operators/bufferWhen");
Object.defineProperty(exports, "bufferWhen", { enumerable: true, get: function () { return bufferWhen_1.bufferWhen; } });
var catchError_1 = require("../internal/operators/catchError");
Object.defineProperty(exports, "catchError", { enumerable: true, get: function () { return catchError_1.catchError; } });
var combineAll_1 = require("../internal/operators/combineAll");
Object.defineProperty(exports, "combineAll", { enumerable: true, get: function () { return combineAll_1.combineAll; } });
var combineLatestAll_1 = require("../internal/operators/combineLatestAll");
Object.defineProperty(exports, "combineLatestAll", { enumerable: true, get: function () { return combineLatestAll_1.combineLatestAll; } });
var combineLatest_1 = require("../internal/operators/combineLatest");
Object.defineProperty(exports, "combineLatest", { enumerable: true, get: function () { return combineLatest_1.combineLatest; } });
var combineLatestWith_1 = require("../internal/operators/combineLatestWith");
Object.defineProperty(exports, "combineLatestWith", { enumerable: true, get: function () { return combineLatestWith_1.combineLatestWith; } });
var concat_1 = require("../internal/operators/concat");
Object.defineProperty(exports, "concat", { enumerable: true, get: function () { return concat_1.concat; } });
var concatAll_1 = require("../internal/operators/concatAll");
Object.defineProperty(exports, "concatAll", { enumerable: true, get: function () { return concatAll_1.concatAll; } });
var concatMap_1 = require("../internal/operators/concatMap");
Object.defineProperty(exports, "concatMap", { enumerable: true, get: function () { return concatMap_1.concatMap; } });
var concatMapTo_1 = require("../internal/operators/concatMapTo");
Object.defineProperty(exports, "concatMapTo", { enumerable: true, get: function () { return concatMapTo_1.concatMapTo; } });
var concatWith_1 = require("../internal/operators/concatWith");
Object.defineProperty(exports, "concatWith", { enumerable: true, get: function () { return concatWith_1.concatWith; } });
var connect_1 = require("../internal/operators/connect");
Object.defineProperty(exports, "connect", { enumerable: true, get: function () { return connect_1.connect; } });
var count_1 = require("../internal/operators/count");
Object.defineProperty(exports, "count", { enumerable: true, get: function () { return count_1.count; } });
var debounce_1 = require("../internal/operators/debounce");
Object.defineProperty(exports, "debounce", { enumerable: true, get: function () { return debounce_1.debounce; } });
var debounceTime_1 = require("../internal/operators/debounceTime");
Object.defineProperty(exports, "debounceTime", { enumerable: true, get: function () { return debounceTime_1.debounceTime; } });
var defaultIfEmpty_1 = require("../internal/operators/defaultIfEmpty");
Object.defineProperty(exports, "defaultIfEmpty", { enumerable: true, get: function () { return defaultIfEmpty_1.defaultIfEmpty; } });
var delay_1 = require("../internal/operators/delay");
Object.defineProperty(exports, "delay", { enumerable: true, get: function () { return delay_1.delay; } });
var delayWhen_1 = require("../internal/operators/delayWhen");
Object.defineProperty(exports, "delayWhen", { enumerable: true, get: function () { return delayWhen_1.delayWhen; } });
var dematerialize_1 = require("../internal/operators/dematerialize");
Object.defineProperty(exports, "dematerialize", { enumerable: true, get: function () { return dematerialize_1.dematerialize; } });
var distinct_1 = require("../internal/operators/distinct");
Object.defineProperty(exports, "distinct", { enumerable: true, get: function () { return distinct_1.distinct; } });
var distinctUntilChanged_1 = require("../internal/operators/distinctUntilChanged");
Object.defineProperty(exports, "distinctUntilChanged", { enumerable: true, get: function () { return distinctUntilChanged_1.distinctUntilChanged; } });
var distinctUntilKeyChanged_1 = require("../internal/operators/distinctUntilKeyChanged");
Object.defineProperty(exports, "distinctUntilKeyChanged", { enumerable: true, get: function () { return distinctUntilKeyChanged_1.distinctUntilKeyChanged; } });
var elementAt_1 = require("../internal/operators/elementAt");
Object.defineProperty(exports, "elementAt", { enumerable: true, get: function () { return elementAt_1.elementAt; } });
var endWith_1 = require("../internal/operators/endWith");
Object.defineProperty(exports, "endWith", { enumerable: true, get: function () { return endWith_1.endWith; } });
var every_1 = require("../internal/operators/every");
Object.defineProperty(exports, "every", { enumerable: true, get: function () { return every_1.every; } });
var exhaust_1 = require("../internal/operators/exhaust");
Object.defineProperty(exports, "exhaust", { enumerable: true, get: function () { return exhaust_1.exhaust; } });
var exhaustAll_1 = require("../internal/operators/exhaustAll");
Object.defineProperty(exports, "exhaustAll", { enumerable: true, get: function () { return exhaustAll_1.exhaustAll; } });
var exhaustMap_1 = require("../internal/operators/exhaustMap");
Object.defineProperty(exports, "exhaustMap", { enumerable: true, get: function () { return exhaustMap_1.exhaustMap; } });
var expand_1 = require("../internal/operators/expand");
Object.defineProperty(exports, "expand", { enumerable: true, get: function () { return expand_1.expand; } });
var filter_1 = require("../internal/operators/filter");
Object.defineProperty(exports, "filter", { enumerable: true, get: function () { return filter_1.filter; } });
var finalize_1 = require("../internal/operators/finalize");
Object.defineProperty(exports, "finalize", { enumerable: true, get: function () { return finalize_1.finalize; } });
var find_1 = require("../internal/operators/find");
Object.defineProperty(exports, "find", { enumerable: true, get: function () { return find_1.find; } });
var findIndex_1 = require("../internal/operators/findIndex");
Object.defineProperty(exports, "findIndex", { enumerable: true, get: function () { return findIndex_1.findIndex; } });
var first_1 = require("../internal/operators/first");
Object.defineProperty(exports, "first", { enumerable: true, get: function () { return first_1.first; } });
var groupBy_1 = require("../internal/operators/groupBy");
Object.defineProperty(exports, "groupBy", { enumerable: true, get: function () { return groupBy_1.groupBy; } });
var ignoreElements_1 = require("../internal/operators/ignoreElements");
Object.defineProperty(exports, "ignoreElements", { enumerable: true, get: function () { return ignoreElements_1.ignoreElements; } });
var isEmpty_1 = require("../internal/operators/isEmpty");
Object.defineProperty(exports, "isEmpty", { enumerable: true, get: function () { return isEmpty_1.isEmpty; } });
var last_1 = require("../internal/operators/last");
Object.defineProperty(exports, "last", { enumerable: true, get: function () { return last_1.last; } });
var map_1 = require("../internal/operators/map");
Object.defineProperty(exports, "map", { enumerable: true, get: function () { return map_1.map; } });
var mapTo_1 = require("../internal/operators/mapTo");
Object.defineProperty(exports, "mapTo", { enumerable: true, get: function () { return mapTo_1.mapTo; } });
var materialize_1 = require("../internal/operators/materialize");
Object.defineProperty(exports, "materialize", { enumerable: true, get: function () { return materialize_1.materialize; } });
var max_1 = require("../internal/operators/max");
Object.defineProperty(exports, "max", { enumerable: true, get: function () { return max_1.max; } });
var merge_1 = require("../internal/operators/merge");
Object.defineProperty(exports, "merge", { enumerable: true, get: function () { return merge_1.merge; } });
var mergeAll_1 = require("../internal/operators/mergeAll");
Object.defineProperty(exports, "mergeAll", { enumerable: true, get: function () { return mergeAll_1.mergeAll; } });
var flatMap_1 = require("../internal/operators/flatMap");
Object.defineProperty(exports, "flatMap", { enumerable: true, get: function () { return flatMap_1.flatMap; } });
var mergeMap_1 = require("../internal/operators/mergeMap");
Object.defineProperty(exports, "mergeMap", { enumerable: true, get: function () { return mergeMap_1.mergeMap; } });
var mergeMapTo_1 = require("../internal/operators/mergeMapTo");
Object.defineProperty(exports, "mergeMapTo", { enumerable: true, get: function () { return mergeMapTo_1.mergeMapTo; } });
var mergeScan_1 = require("../internal/operators/mergeScan");
Object.defineProperty(exports, "mergeScan", { enumerable: true, get: function () { return mergeScan_1.mergeScan; } });
var mergeWith_1 = require("../internal/operators/mergeWith");
Object.defineProperty(exports, "mergeWith", { enumerable: true, get: function () { return mergeWith_1.mergeWith; } });
var min_1 = require("../internal/operators/min");
Object.defineProperty(exports, "min", { enumerable: true, get: function () { return min_1.min; } });
var multicast_1 = require("../internal/operators/multicast");
Object.defineProperty(exports, "multicast", { enumerable: true, get: function () { return multicast_1.multicast; } });
var observeOn_1 = require("../internal/operators/observeOn");
Object.defineProperty(exports, "observeOn", { enumerable: true, get: function () { return observeOn_1.observeOn; } });
var onErrorResumeNextWith_1 = require("../internal/operators/onErrorResumeNextWith");
Object.defineProperty(exports, "onErrorResumeNext", { enumerable: true, get: function () { return onErrorResumeNextWith_1.onErrorResumeNext; } });
var pairwise_1 = require("../internal/operators/pairwise");
Object.defineProperty(exports, "pairwise", { enumerable: true, get: function () { return pairwise_1.pairwise; } });
var partition_1 = require("../internal/operators/partition");
Object.defineProperty(exports, "partition", { enumerable: true, get: function () { return partition_1.partition; } });
var pluck_1 = require("../internal/operators/pluck");
Object.defineProperty(exports, "pluck", { enumerable: true, get: function () { return pluck_1.pluck; } });
var publish_1 = require("../internal/operators/publish");
Object.defineProperty(exports, "publish", { enumerable: true, get: function () { return publish_1.publish; } });
var publishBehavior_1 = require("../internal/operators/publishBehavior");
Object.defineProperty(exports, "publishBehavior", { enumerable: true, get: function () { return publishBehavior_1.publishBehavior; } });
var publishLast_1 = require("../internal/operators/publishLast");
Object.defineProperty(exports, "publishLast", { enumerable: true, get: function () { return publishLast_1.publishLast; } });
var publishReplay_1 = require("../internal/operators/publishReplay");
Object.defineProperty(exports, "publishReplay", { enumerable: true, get: function () { return publishReplay_1.publishReplay; } });
var race_1 = require("../internal/operators/race");
Object.defineProperty(exports, "race", { enumerable: true, get: function () { return race_1.race; } });
var raceWith_1 = require("../internal/operators/raceWith");
Object.defineProperty(exports, "raceWith", { enumerable: true, get: function () { return raceWith_1.raceWith; } });
var reduce_1 = require("../internal/operators/reduce");
Object.defineProperty(exports, "reduce", { enumerable: true, get: function () { return reduce_1.reduce; } });
var repeat_1 = require("../internal/operators/repeat");
Object.defineProperty(exports, "repeat", { enumerable: true, get: function () { return repeat_1.repeat; } });
var repeatWhen_1 = require("../internal/operators/repeatWhen");
Object.defineProperty(exports, "repeatWhen", { enumerable: true, get: function () { return repeatWhen_1.repeatWhen; } });
var retry_1 = require("../internal/operators/retry");
Object.defineProperty(exports, "retry", { enumerable: true, get: function () { return retry_1.retry; } });
var retryWhen_1 = require("../internal/operators/retryWhen");
Object.defineProperty(exports, "retryWhen", { enumerable: true, get: function () { return retryWhen_1.retryWhen; } });
var refCount_1 = require("../internal/operators/refCount");
Object.defineProperty(exports, "refCount", { enumerable: true, get: function () { return refCount_1.refCount; } });
var sample_1 = require("../internal/operators/sample");
Object.defineProperty(exports, "sample", { enumerable: true, get: function () { return sample_1.sample; } });
var sampleTime_1 = require("../internal/operators/sampleTime");
Object.defineProperty(exports, "sampleTime", { enumerable: true, get: function () { return sampleTime_1.sampleTime; } });
var scan_1 = require("../internal/operators/scan");
Object.defineProperty(exports, "scan", { enumerable: true, get: function () { return scan_1.scan; } });
var sequenceEqual_1 = require("../internal/operators/sequenceEqual");
Object.defineProperty(exports, "sequenceEqual", { enumerable: true, get: function () { return sequenceEqual_1.sequenceEqual; } });
var share_1 = require("../internal/operators/share");
Object.defineProperty(exports, "share", { enumerable: true, get: function () { return share_1.share; } });
var shareReplay_1 = require("../internal/operators/shareReplay");
Object.defineProperty(exports, "shareReplay", { enumerable: true, get: function () { return shareReplay_1.shareReplay; } });
var single_1 = require("../internal/operators/single");
Object.defineProperty(exports, "single", { enumerable: true, get: function () { return single_1.single; } });
var skip_1 = require("../internal/operators/skip");
Object.defineProperty(exports, "skip", { enumerable: true, get: function () { return skip_1.skip; } });
var skipLast_1 = require("../internal/operators/skipLast");
Object.defineProperty(exports, "skipLast", { enumerable: true, get: function () { return skipLast_1.skipLast; } });
var skipUntil_1 = require("../internal/operators/skipUntil");
Object.defineProperty(exports, "skipUntil", { enumerable: true, get: function () { return skipUntil_1.skipUntil; } });
var skipWhile_1 = require("../internal/operators/skipWhile");
Object.defineProperty(exports, "skipWhile", { enumerable: true, get: function () { return skipWhile_1.skipWhile; } });
var startWith_1 = require("../internal/operators/startWith");
Object.defineProperty(exports, "startWith", { enumerable: true, get: function () { return startWith_1.startWith; } });
var subscribeOn_1 = require("../internal/operators/subscribeOn");
Object.defineProperty(exports, "subscribeOn", { enumerable: true, get: function () { return subscribeOn_1.subscribeOn; } });
var switchAll_1 = require("../internal/operators/switchAll");
Object.defineProperty(exports, "switchAll", { enumerable: true, get: function () { return switchAll_1.switchAll; } });
var switchMap_1 = require("../internal/operators/switchMap");
Object.defineProperty(exports, "switchMap", { enumerable: true, get: function () { return switchMap_1.switchMap; } });
var switchMapTo_1 = require("../internal/operators/switchMapTo");
Object.defineProperty(exports, "switchMapTo", { enumerable: true, get: function () { return switchMapTo_1.switchMapTo; } });
var switchScan_1 = require("../internal/operators/switchScan");
Object.defineProperty(exports, "switchScan", { enumerable: true, get: function () { return switchScan_1.switchScan; } });
var take_1 = require("../internal/operators/take");
Object.defineProperty(exports, "take", { enumerable: true, get: function () { return take_1.take; } });
var takeLast_1 = require("../internal/operators/takeLast");
Object.defineProperty(exports, "takeLast", { enumerable: true, get: function () { return takeLast_1.takeLast; } });
var takeUntil_1 = require("../internal/operators/takeUntil");
Object.defineProperty(exports, "takeUntil", { enumerable: true, get: function () { return takeUntil_1.takeUntil; } });
var takeWhile_1 = require("../internal/operators/takeWhile");
Object.defineProperty(exports, "takeWhile", { enumerable: true, get: function () { return takeWhile_1.takeWhile; } });
var tap_1 = require("../internal/operators/tap");
Object.defineProperty(exports, "tap", { enumerable: true, get: function () { return tap_1.tap; } });
var throttle_1 = require("../internal/operators/throttle");
Object.defineProperty(exports, "throttle", { enumerable: true, get: function () { return throttle_1.throttle; } });
var throttleTime_1 = require("../internal/operators/throttleTime");
Object.defineProperty(exports, "throttleTime", { enumerable: true, get: function () { return throttleTime_1.throttleTime; } });
var throwIfEmpty_1 = require("../internal/operators/throwIfEmpty");
Object.defineProperty(exports, "throwIfEmpty", { enumerable: true, get: function () { return throwIfEmpty_1.throwIfEmpty; } });
var timeInterval_1 = require("../internal/operators/timeInterval");
Object.defineProperty(exports, "timeInterval", { enumerable: true, get: function () { return timeInterval_1.timeInterval; } });
var timeout_1 = require("../internal/operators/timeout");
Object.defineProperty(exports, "timeout", { enumerable: true, get: function () { return timeout_1.timeout; } });
var timeoutWith_1 = require("../internal/operators/timeoutWith");
Object.defineProperty(exports, "timeoutWith", { enumerable: true, get: function () { return timeoutWith_1.timeoutWith; } });
var timestamp_1 = require("../internal/operators/timestamp");
Object.defineProperty(exports, "timestamp", { enumerable: true, get: function () { return timestamp_1.timestamp; } });
var toArray_1 = require("../internal/operators/toArray");
Object.defineProperty(exports, "toArray", { enumerable: true, get: function () { return toArray_1.toArray; } });
var window_1 = require("../internal/operators/window");
Object.defineProperty(exports, "window", { enumerable: true, get: function () { return window_1.window; } });
var windowCount_1 = require("../internal/operators/windowCount");
Object.defineProperty(exports, "windowCount", { enumerable: true, get: function () { return windowCount_1.windowCount; } });
var windowTime_1 = require("../internal/operators/windowTime");
Object.defineProperty(exports, "windowTime", { enumerable: true, get: function () { return windowTime_1.windowTime; } });
var windowToggle_1 = require("../internal/operators/windowToggle");
Object.defineProperty(exports, "windowToggle", { enumerable: true, get: function () { return windowToggle_1.windowToggle; } });
var windowWhen_1 = require("../internal/operators/windowWhen");
Object.defineProperty(exports, "windowWhen", { enumerable: true, get: function () { return windowWhen_1.windowWhen; } });
var withLatestFrom_1 = require("../internal/operators/withLatestFrom");
Object.defineProperty(exports, "withLatestFrom", { enumerable: true, get: function () { return withLatestFrom_1.withLatestFrom; } });
var zip_1 = require("../internal/operators/zip");
Object.defineProperty(exports, "zip", { enumerable: true, get: function () { return zip_1.zip; } });
var zipAll_1 = require("../internal/operators/zipAll");
Object.defineProperty(exports, "zipAll", { enumerable: true, get: function () { return zipAll_1.zipAll; } });
var zipWith_1 = require("../internal/operators/zipWith");
Object.defineProperty(exports, "zipWith", { enumerable: true, get: function () { return zipWith_1.zipWith; } });

},{"../internal/operators/audit":141,"../internal/operators/auditTime":142,"../internal/operators/buffer":143,"../internal/operators/bufferCount":144,"../internal/operators/bufferTime":145,"../internal/operators/bufferToggle":146,"../internal/operators/bufferWhen":147,"../internal/operators/catchError":148,"../internal/operators/combineAll":149,"../internal/operators/combineLatest":150,"../internal/operators/combineLatestAll":151,"../internal/operators/combineLatestWith":152,"../internal/operators/concat":153,"../internal/operators/concatAll":154,"../internal/operators/concatMap":155,"../internal/operators/concatMapTo":156,"../internal/operators/concatWith":157,"../internal/operators/connect":158,"../internal/operators/count":159,"../internal/operators/debounce":160,"../internal/operators/debounceTime":161,"../internal/operators/defaultIfEmpty":162,"../internal/operators/delay":163,"../internal/operators/delayWhen":164,"../internal/operators/dematerialize":165,"../internal/operators/distinct":166,"../internal/operators/distinctUntilChanged":167,"../internal/operators/distinctUntilKeyChanged":168,"../internal/operators/elementAt":169,"../internal/operators/endWith":170,"../internal/operators/every":171,"../internal/operators/exhaust":172,"../internal/operators/exhaustAll":173,"../internal/operators/exhaustMap":174,"../internal/operators/expand":175,"../internal/operators/filter":176,"../internal/operators/finalize":177,"../internal/operators/find":178,"../internal/operators/findIndex":179,"../internal/operators/first":180,"../internal/operators/flatMap":181,"../internal/operators/groupBy":182,"../internal/operators/ignoreElements":183,"../internal/operators/isEmpty":184,"../internal/operators/last":186,"../internal/operators/map":187,"../internal/operators/mapTo":188,"../internal/operators/materialize":189,"../internal/operators/max":190,"../internal/operators/merge":191,"../internal/operators/mergeAll":192,"../internal/operators/mergeMap":194,"../internal/operators/mergeMapTo":195,"../internal/operators/mergeScan":196,"../internal/operators/mergeWith":197,"../internal/operators/min":198,"../internal/operators/multicast":199,"../internal/operators/observeOn":200,"../internal/operators/onErrorResumeNextWith":201,"../internal/operators/pairwise":202,"../internal/operators/partition":203,"../internal/operators/pluck":204,"../internal/operators/publish":205,"../internal/operators/publishBehavior":206,"../internal/operators/publishLast":207,"../internal/operators/publishReplay":208,"../internal/operators/race":209,"../internal/operators/raceWith":210,"../internal/operators/reduce":211,"../internal/operators/refCount":212,"../internal/operators/repeat":213,"../internal/operators/repeatWhen":214,"../internal/operators/retry":215,"../internal/operators/retryWhen":216,"../internal/operators/sample":217,"../internal/operators/sampleTime":218,"../internal/operators/scan":219,"../internal/operators/sequenceEqual":221,"../internal/operators/share":222,"../internal/operators/shareReplay":223,"../internal/operators/single":224,"../internal/operators/skip":225,"../internal/operators/skipLast":226,"../internal/operators/skipUntil":227,"../internal/operators/skipWhile":228,"../internal/operators/startWith":229,"../internal/operators/subscribeOn":230,"../internal/operators/switchAll":231,"../internal/operators/switchMap":232,"../internal/operators/switchMapTo":233,"../internal/operators/switchScan":234,"../internal/operators/take":235,"../internal/operators/takeLast":236,"../internal/operators/takeUntil":237,"../internal/operators/takeWhile":238,"../internal/operators/tap":239,"../internal/operators/throttle":240,"../internal/operators/throttleTime":241,"../internal/operators/throwIfEmpty":242,"../internal/operators/timeInterval":243,"../internal/operators/timeout":244,"../internal/operators/timeoutWith":245,"../internal/operators/timestamp":246,"../internal/operators/toArray":247,"../internal/operators/window":248,"../internal/operators/windowCount":249,"../internal/operators/windowTime":250,"../internal/operators/windowToggle":251,"../internal/operators/windowWhen":252,"../internal/operators/withLatestFrom":253,"../internal/operators/zip":254,"../internal/operators/zipAll":255,"../internal/operators/zipWith":256}]},{},[34]);
